[
  {
    "path": ".drone.yml",
    "content": "clone:\n    hg:\n        image: plugins/hg\n        environment:\n            - HG_SHARE_POOL=/root/.cache/hg\n        volumes:\n            - cache:/root/.cache\n\npipeline:\n    tox:\n        image: ${IMAGE}\n        environment:\n            - CFLAGS=-O0\n            - DB_CACHE=/cache\n            - TOX_TESTENV_PASSENV=CFLAGS DB_CACHE CI_BUILD_NUMBER CI_JOB_NUMBER CI_JOB_ID\n            - POSTGRESQL_URI=postgresql://postgres@postgresql:5432/\n        commands:\n            - echo \"[extensions]\" >> /root/.hgrc\n            - echo \"hgext.share =\" >> /root/.hgrc\n            - echo \"[share]\" >> /root/.hgrc\n            - echo \"pool = /root/.cache/hg\" >> /root/.hgrc\n            - pip install tox\n            - tox -e \"${TOXENV}-${DATABASE}\"\n        volumes:\n            - cache:/root/.cache\n    check_dist:\n        image: ${IMAGE}\n        commands:\n            - pip install twine\n            - python setup.py sdist\n            - twine check dist/*\n        volumes:\n            - cache:/root/.cache\n    check_doc:\n        image: ${IMAGE}\n        commands:\n            - pip install sphinx\n            - python -m sphinx -T -E -W -n -b html doc _build/html\n            - python -m sphinx -T -E -W -n -b linkcheck doc _build\n        volumes:\n            - cache:/root/.cache\n\nservices:\n    postgresql:\n        image: postgres\n        environment:\n            - POSTGRES_HOST_AUTH_METHOD=trust\n        command: \"-c fsync=off -c synchronous_commit=off -c full_page_writes=off\"\n        when:\n            matrix:\n                DATABASE: postgresql\n\nmatrix:\n    include:\n        - IMAGE: python:3.7\n          TOXENV: py37\n          DATABASE: sqlite\n        - IMAGE: python:3.7\n          TOXENV: py37\n          DATABASE: postgresql\n        - IMAGE: python:3.8\n          TOXENV: py38\n          DATABASE: sqlite\n        - IMAGE: python:3.8\n          TOXENV: py38\n          DATABASE: postgresql\n        - IMAGE: python:3.9\n          TOXENV: py39\n          DATABASE: sqlite\n        - IMAGE: python:3.9\n          TOXENV: py39\n          DATABASE: postgresql\n        - IMAGE: python:3.10\n          TOXENV: py310\n          DATABASE: sqlite\n        - IMAGE: python:3.10\n          TOXENV: py310\n          DATABASE: postgresql\n"
  },
  {
    "path": ".flake8",
    "content": "[flake8]\nignore=E123,E124,E126,E128,E741,W503\n"
  },
  {
    "path": ".hgtags",
    "content": "951bb3311b916cb893adc5294cfb3216d2940169 1.0.0\n9f5ce178a7c403a0865fd4b6c1a82a911df0e998 1.2.0\ne2d31d59de7745de70199b7c340d78b7c4775723 1.4.0\n64691214959ac19983f3b3d1dbb89ff693d1545c 1.6.0\naf3a6063b46bf8739a513a06400fbb9858b5869b 1.8.0\n3475040a8fe081b1b8609350186b779cc640fba4 2.0.0\n1df3f0702c621e65279af52d1f87725747ae8fa4 2.2.0\n640af4420c8eace7ee59a432bec54692f4808b20 2.4.0\n36530840a1d0dce354bbaa58ec849a409d306d83 2.6.0\n2893d6c3efd6df3759ab09a28ea16773a160118e 2.8.0\n759c6ff44b90b8c685e9d9a4124bcd85af204649 3.0.0\nb3d84aa2c3a6ed3b76bfb58a40fc687f68824c29 3.2.0\nf0a9fa755cde703be54efd747f376b096ea8316c 3.4.0\n1e4ba5a3f16e6afd59131b49841eb004e706619d 3.6.0\n0a29a9dba7f56fbdef067772eea3f037934999c9 3.8.0\n49a0caa894dae201ed4ec707f277d9859b5521fb 4.0.0\neb8949ec5bcedba563b5799f1315a0cecfee61f6 4.2.0\nf253ce8ed02f4c46a69b8b2f29311ad8959698be 4.4.0\ne7a6d0e8002237f624ecc8a45a6a472f7baadd08 4.6.0\n321b0104a732419c11aa4926785502e0615b89c9 4.8.0\ne8cadc044d59edff8a2ca73932c723d507517ec8 5.0.0\nef34e4e92d45ab2b2b2956bbb6aa8b3ca259eb13 5.2.0\n32170ff46339dbc8609225791ab737a0f3eb0291 5.4.0\n5738a22adbb45390167194e4089adc46c6b638a3 5.6.0\ne21456b81972188261b8a6fc876afc18f641c85b 5.8.0\n2164597ffa5f4f0443e4804944b30f5491070990 6.0.0\n1252631aa5277267887251090d6e2f7ed6d41503 6.2.0\n2593216de16bfca661479ed068b87fd0e83260e0 6.4.0\ne5934d7675cbdbf6e534ea4a01f9e1d0792e22b4 6.6.0\n"
  },
  {
    "path": ".isort.cfg",
    "content": "[settings]\nmulti_line_output=4\nknown_first_party=trytond\n"
  },
  {
    "path": "CHANGELOG",
    "content": "* Cache RPC call for class method selection\n\nVersion 6.6.0 - 2022-10-31\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Add sql_id method to Reference field\n* Use declarative index definition for ModelSQL\n* Add configuration entries for unaccent and similarity functions\n* Add authentication services\n* Schedule actions using server timezone\n* Reset the user sessions less often\n* Add straight values to wizard state view\n* Add strip option to Char fields\n* Strip only one wildcard\n* Manage web extension origin as null\n* Remove same types restriction on PYSON If\n* Allow PYSON size of fields to be None\n* Add command line completion with argcomplete\n* Include record name and value in validation error message\n* Add header parameter on export data\n* Enforce certificate validation for SMTP connection (issue11564)\n* Use singleton for TableHandler\n\nVersion 6.4.0 - 2022-05-02\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Use unittest discover\n* Add module tutorial\n* Test all XML view and SVG icon files are used\n* Add notification message\n* Add validate_fields to ModelStorage\n* Drop support for PyPy and psycopg2cffi\n* Use a set for field's depends\n* Relax the constraint on a field's depends\n* Include only needed fields when fetching a view definition\n* Make warning check re-entrant\n* Manage DatabaseDataError in ModelSQL\n* Remove support for pysqlite2\n* Do not import empty One2Many data\n* Deduplicate entries in domain inversion's simplify\n* Prevent to create and delete singleton\n* Allow CORS on root path\n* Allow button access to be deactivated\n* Always return tuple for MultiSelection\n* Use default selectors instead of select\n* Add batch option to push queue tasks\n* Support ref value for reference field\n* Enforce ref model in XML data\n* Do not resolve entities by default with lxml (issue11219)\n* Use defusedxml to parse XML (issue11244)\n* Use dictionary as search_order on Reference field\n* Retry sending email on temporary failure\n* Order not sorted Selection by index definition\n* Add optional column on tree view\n* Use dictionary as domain on Reference field\n* Include model, field and column in import data error message\n* Support limit and offset to ModelSQL count search and search_count\n* Apply view inheritance to board\n* Add RPC view_get method to View\n* Apply view inheritance to all matching elements\n* Limit board action domain to active id and ids\n* Remove entropy check on password\n* Set view_id in the context when calling view_attributes\n* Add ip_address and device_cookie login method options\n* Add support for Python 3.10\n* Remove support for Python 3.6\n* Add creatable attribute on tree and form views\n* Fill local cache of Function field instances with values\n* Cache Function field getter without context in readonly transactions\n* Use expire delay instead of UTC datetime in reset password email\n* Use RENAME and DROP COLUMN with SQLite backend\n* Support window functions with SQLite backend\n* Use JSONB to store Dict field on PostgreSQL backend\n\nVersion 6.2.0 - 2021-11-01\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Allow to cast to date with timezone\n* Support create/delete attribute in view\n* Skip default values when copying records\n* Use local cache for relation fields in readonly transactions\n* Add format method to DictSchemaMixin\n* Allow modify record name on the reports\n* Add methods to format number and symbol on Lang\n* Add format number with symbol on Report\n* Allow locking tables by calling ModelSQL.lock without records\n* Add test on domain of relation fields\n* Add stored path as alternative to MPTT\n* Activate and upgrade modules from configuration wizard\n* Add set_from_header in email tools\n* Add grouping attribute to numeric widgets\n* Ensure with a test that objects in the Pool have __slots__\n* Use bigdecimal tag for XML-RPC\n* Use tuple in Dict value instead of list\n* Do not set record name on title of report get_email\n* Add node to id of status\n* Use ImmutableDict for Transaction context\n* Use UNION for 'Or'-ed domain with subqueries\n* Add remove_forbidden_chars in tools\n* Manage errors during non-interactive operations\n* Add estimation count to ModelStorage\n* Support empty digits in format_number of Report\n* Add digits mixin\n* Use argon2 or scrypt to hash password by default\n* Allow PYSON Expression as key for PYSON In with dict object\n* Add method to format warning name with records\n* Add option to trytond-console to start a readonly transaction\n* Add support for werkzeug 2.0\n* Combine search and get_keys in DictSchemaMixin\n* Make language code unique\n* Support base64 encoded data in ModelStorage.import_data\n* Add BOOL_AND and BOOL_OR to SQLite backend\n\nVersion 6.0.0 - 2021-05-03\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Allow column sql types to be tested from the table handler\n* Add support for database connection parameters to configuration URI\n* Use immutable datastructures for Dict and MultiSelection fields\n* Skip warnings for non-interactive operations\n* Check rule only if _check_access is set\n* Add statistics to Cache\n* Add support for avatars\n* Add status command\n* Add document widget on form view\n* Add full text and similarity search and FullText field\n* Add URL type to icon\n* Use instance method to get next sequence value\n* Store the sequence type directly on sequence\n* Allow sending email with record's attachments\n* Add which records to use for actions\n* Add parent to group to inherit accesses\n* Add __access__ to Model\n* Add route wrapper to allow null origin\n* Add header grouping on report\n* Protect trusted devices against brute force attack\n* Make ModelView.parse_view public\n* Add help for each value to selection and multiselection\n* Use safe_join in SharedDataMiddlewareIndex (issue10068)\n* Use menu name for window opened from menu\n* Add trigonometric functions to sqlite backend\n* Allow skipping user warnings globally\n* Add validate option to trytond-admin\n* Refresh pool of other processes\n* Add clear_all method to Cache\n* Support Genshi element directives in HTML editor\n* Add firstline tool\n* Add support for Python 3.9\n* Skip access check on ModelStorage instances\n* Eager load Function field with same multiple getter\n* Support other methods for button_change decorator\n* Allow copying Python instances of Model\n* Add all buttons to default form view\n* Unify PYSON string format\n* Forbid all white spaces except space in Char field\n\nVersion 5.8.0 - 2020-11-02\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Remove support for Python 3.5\n* Support import of timedelta data\n* Add symbol widget\n* Add sql_pairing tool\n* Add format_datetime to Report\n* Allow sharing view searches\n* Allow overriding digits in Lang.currency and Report.format_currency\n* Add record name in report filename\n* Add deletable and writable state from ir.rule to read\n* Add language attribute to data tag\n* Add e-mail template\n* Send e-mail on behalf of user\n* Register mixins to generic Report class\n* Cache in memory the report template instances\n* Support Genshi's MsgDirective in report\n* Support PYSON comparison of date and datetime\n* Add cron task to clean old queue tasks\n* Add option to run cron once\n* Add defaults option to route\n* Add escape_wildcard in tools\n* Add option to ensure emails are sent\n* Allow keyword action for all models\n* Add sortable_values in tools\n* Remove default colors on graph and calendar\n* Add model, record and records attributes on Wizard\n* Check read access of wizard records\n* Add cached_property in tools\n* Use custom class to store record data\n* Do not write to existing targets on xxx2Many add\n* Add configuration check\n* Add support for properties to fields.depends\n* Allow combining authentication methods together\n* Add context to export CSV route\n\nVersion 5.6.0 - 2020-05-04\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Call getter function when accessing Function field on unsaved record\n* Add language configuration wizard\n* Allow copying attachments and notes to created records\n* Add link button on form\n* Support explicit delete and remove for saving and on_change xxx2Many\n* Add export_data_domain to ModelStorage\n* Add route to export CSV data\n* Add test on target of relation fields\n* Add width and height attributes on calendar view\n* Add default database name configuration\n* Add retry option to report convert\n* Add depends fields on view_attributes\n* Simplify trigger action\n* Run trigger in the queue\n* Do not copy Binary content with file_id\n* Replace memoize with functools.lru_cache\n* Add support for Python 3.8\n* Set all fields readonly for inactive record\n* Enable check_access context when checking wizard access (issue9108)\n* Add option to send test email with trytond-admin\n* Add editable on calendar view\n* Add xalign and yalign to group\n* Add MultiSelection entry to Dict field\n* Allow empty order clause\n* Change editable tree attribute into boolean\n* Send default order to clients\n* Replace advisory lock by SKIP LOCKED in queue pulling\n* Load WSGI middleware from configuration\n* Add help text to Dict keys\n* Update button_action with returned values\n* Use direct access to backend classes\n* Add weasyprint support\n* Add slugify tool\n* Add is_secure, host and http_host to url module\n* Add __href__ to URLMixin\n* Add validate attribute to wizard's Button\n* Return 400 instead of 500 for Tryton exception\n* Fill the reverse field in the One2Many setter\n* Drop support for skiptest attribute on xml files\n* Remove implicit field names in ModelStorage.search_read\n\nVersion 5.4.0 - 2019-11-04\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Improve tests on depends\n* Add permission groups on export\n* Retry cron job on DatabaseOperationalError\n* Add visual context on tree view\n* Add start value to PYSON Date and DateTime\n* Add MultiSelection field\n* Support dot notation on PYSON Eval\n* Add __slots__\n* Pass app and request to wsgi error handlers\n* Add lazy_gettext\n* Add format_timedelta to Report\n* Add partial TO_CHAR support for date and datetime on SQLite\n* Setup default logging for WSGI app\n* Add format argument to report format_date function\n* Change expand attribute into a factor\n* Allow SQL expression as value of fields\n* Allow customizing Dict keys order with a sequence field\n* Add invalid domain in DomainValidationError\n* Add domain inversion tools\n* Add get_relation_fields to DictSchemaMixin\n* Add level on Model.fields_get to fill relation_fields\n\nVersion 5.2.0 - 2019-05-06\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Add sort and translate options to Reference field\n* Do not create empty translations\n* Replace dsn by params to connect to postgresql\n* Simplify cron\n* Add duration on Cache\n* Add strip wildcards helpers\n* Add list-form view\n* Do not set id for on_change calls if cached\n* Add cache on RPC\n* Remove support for Python 3.4\n* Allow to update record when importing data\n* Set context on record instantiated by Field.__set__\n* Set context when reading related fields\n* Check read access on field in search order (issue8189)\n* Add base64 converter to URL map\n* Add HTML widget\n* Support import of native numeric, date and datetime data\n* Add day view on calendar\n* Raise NotImplementedError when setting Function field without setter\n* Add exports in view_toolbar_get\n* Add resources method to ModelStorage\n* Validate selection format in Dict schema\n* Allow to extend Field's string and help\n* Add console\n* Add Model.__names__ to retrieve model and field names\n* Add size attribute on image tag\n* Allow to use channel to synchronize Cache\n* Display ids and rule names on access error\n* Move field definition from Model to Field\n* Use number of verbose flag as log level\n* Add coroutine concurrency option\n* Add increasing delay on database operational error retry\n* Allows to lock records for update\n* Remove _nocache on Transaction\n* Make Cache transactional\n* Allow to search on key's value of Dict\n* Allow to order Dict by key's value\n* Do not store keys with null value in Dict\n* Add cache timeout for web\n* Allow the bus requests to be redirected to another host\n* Add support for CORS\n* Add extras modules to ModuleTestCase\n* Add timeout to Report.convert\n* Allow records from XML with noupdate to be deleted\n* Add ir.calendar for month and day\n* Rename languages: hu_HU, it_IT and pt_BR into hu, it and pt\n* Define custom exceptions\n* Remove _error_messages, raise_user_error and raise_user_warning\n* Remove ModelStorage._constraints\n* Add ir.message\n* Add check on ModelSQL for positive id\n* New API to read related fields\n* Remove implicit fields names in ModelStorage.read\n* Check read access on field in search domain (issue7766)\n* Add active field on ModelAccess, ModelFieldAccess and Group\n* Use write mode by default to check create and delete of resources\n\nVersion 5.0.0 - 2018-10-01\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Allow non translatable reports\n* Replace hard coded 'state' by '_transition_state' in copy\n* Support dotted notation in copy default\n* Allow callable in copy default\n* Add bus system\n* Allow to set any default configuration value from environment\n* Clear existing session when password is changed\n* Manage session with max_age and timeout\n* Use passlib to hash and update password\n* Remove unique constraint on attachment name\n* New icons\n* Add pyson TimeDelta\n* Remove button if it is not allowed to access some of its dependant fields\n* Add support for Python 3.7\n* Add transactional queue and workers\n* Add __table_handler__ to ModelSQL\n* Support partial index\n* Allow to use SQL expression for index action\n* Add cache clean timeout configuration\n* Implicit conversion to boolean in PYSON statement\n* Add domain to dictionary schema\n* Fill main language in ir.configuration at database initialization\n* Remove support for Python 2.7\n* Check Rule also after modification\n* Check Rule after indirect fields\n* Allow to define view id in switch client action\n* Do not validate Function fields even with setter\n* Simplify the creation of dependencies graph\n* Make depends on methods generic to any method\n* Add width/height attribute to notebook\n* Allow to call set_lang with None and language instance\n* Add hostname configuration to list database\n* Add tree mixin\n* Rename \"install-dependences\" into \"activate-dependencies\"\n* Use recursive common table expression for child_of/parent_of operators\n* Add sql_cast on Field\n\nVersion 4.8.0 - 2018-04-23\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Add index method to order field set calls\n* Add deactivable mixin\n* Ensure active field is present on tree view\n* Manage depends xml attribute on field tag\n* Add expand attribute on group tag\n* Add depends on Pool.register\n* Add Exclude constraint\n* Allow to perform unaccented searches on Char fields\n* Always raise exception in table handler\n* Simplify API for Session: new, remove, check and reset\n* Ensure that all buttons are registered in ir.model.button\n* Make trytond-admin ask for admin email\n* Add option to set admin email with trytond-admin\n* Add option to reset admin password with trytond-admin\n* Add reset password button\n* Add depends on Button\n* Add ModelData.has_model cache for ModelStorage.check_xml_record\n* Limit authentication attempt per IP network\n* Manage 'X-Forwarded' headers from proxies\n* Add '_request' attribute to Transaction context\n* Delete translations on deletion only when model has translatable field\n* Remove MySQL backend\n* Add keyword attribute to button tag\n* Allow field name on image tag\n* Remove unoconv and call soffice directly\n* Allow to include mixin to pool objects\n* Improve validation of PYSON domain\n* Use JSON canonical form for Dict value\n* Remove rules on user\n* Add monetary formatting to language\n* Add exceptional parent language\n* Add get method on ir.lang\n* Convert format, currency and strftime of ir.lang into instance methods\n\nVersion 4.6.0 - 2017-10-30\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Add support for Python 3.6\n* Remove support for Python 3.3\n* Move handling of sequences to the Database object\n* Allow to add tests through entry points\n* Add translated descriptor for Reference field\n* Implement alter_type and alter_size for sqlite backend\n* Add a maximum size for request\n* Add support for single record report\n* Add support for Flat OpenDocument\n* Add get_email in trytond.report\n* Replace plain extension by txt\n* Support test database cache for remote postgresql\n* Increase session randomness to 32 bytes\n* Allow to specify datetime related values in XML files\n* Add environment variables to wsgi script\n* Add unique ids check on RPC\n* Assert unique records on ModelView.button and Workflow.transition\n* Add test for function field methods\n* Add option install module dependencies with trytond-admin\n* Add localhost_name and timeout as get_smtp_server uri parameters\n* Delete missing modules not activated when updating module list\n* Remove empty pages from notebook\n* Allow to store Dict as JSON on the database\n\nVersion 4.4.0 - 2017-05-01\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Sanitize path in file_open against suffix (CVE-2017-0360)\n* Add constraint on user password\n* Remove Property field\n* Add MultiValueMixin and ValueMixin\n* Use sql type in column creation\n* Use generic SQL type in field and let backend determine the SQLType\n* Add filter to xxx2Many fields\n* Add NULLS ordering\n* Add context domain on ir.action.act_window\n* Allow None limit in action window\n* Add has_window_functions on Database\n* Allow Many2One on ModelSQL to target ModelStorage\n* Manage Cache in Transaction\n* Allow to register multiple exit functions on Transaction\n* Return 429 status when too many login attempts\n* Add set_rpc on Field\n* Add has_select_for on Database\n* Store custom report translation in separate module\n* Add form action keyword for set/synchronize translation on report and view\n* Add negative value for col attribute\n* Allow to use domain_<field name> method with Function fields\n* Validate wizard definition on module tests\n* Remove order constraint on register ModelSQL\n* Add relate from report to translations\n\nVersion 4.2.0 - 2016-11-28\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Add toolbar attribute for richtext widget\n* Add PYSON widget\n* Allow to define the text color and background color in calendar view\n* Allow to override cache implementation\n* Add button rule\n* Allow to specify translatable languages in trytond-admin\n* Add datetime_field on Reference\n* Merge Spanish's into Spanish (Latin American)\n* Do not check write access on model for wizard with groups\n* Add user application\n* Add sequence_ordered\n* Remove most country specific code in languages\n* Add support for derivative translations\n* Remove IDENTIFIER regexp on ir.model and ir.model.field\n* Enforce suffix and prefix to have id or name\n* Sanitize path in file_open (CVE-2016-1242)\n* Prevent read of user password hash (CVE-2016-1241)\n* Add database dump cache for tests\n* Remove unused tools: find_in_path, exec_command_pipe and mod10r\n* Implementation of drop_column for SQLite\n* Allow to pass many configuration files\n* Remove translate on field name of User\n* Allow to define the default mode in calendar view\n* Use 'default_rec_name' context key in Model.default_get\n* Add option to store Attachment in database\n* Allow to store Binary field in filestore\n* Add filestore module\n* Allow None in Greater/Less PYSON\n* Add option to set admin password with trytond-admin\n* Remove super password\n* Remove database management from RPC\n* Remove ModelView.view_header_get\n* Remove string attribute from views\n* Don't check write access on model for button with groups\n* Limit readonly state for xxx2Many\n* Add option to update modules list with trytond-admin\n* Use home directory as default path for database and web root.\n* Add count option on Action Window Domains\n* Remove window_name on Action Window\n* Return the calling keyword in ActionKeyword.get_keywords\n* Add customizable login process\n* Allow to customize the substitutions used on sequence\n* Allow PYSON in tree_invisible attribute\n\nVersion 4.0.0 - 2016-05-02\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Add sendmail module to send transactional email\n* Support Two-Phase Commit in Transaction\n* Allow Report to generate text plain, XML, HTML and XHTML\n* Add workflow graph on ir.model\n* Add context model on ir.action.act_window\n* Switch to WSGI API\n* Limit the login size in LoginAttempt\n* Remove LocalDict from tools\n* Add LRUDictTransaction\n* Follow PEP-0249 for Database, Transaction and Cursor\n* Add Python3 support\n* Make TestCase create and drop its database\n* Add with_transaction decorator for tests\n* Add note on resources\n* Add 'where' operator for xxx2many fields\n* Strip and unquote double-quote from Postgresql schema in search_path\n* Move webdav into a separate module\n* Don't read historized user when evaluating record rules as it could lead to\n  past privilege escalation.\n* Only rebuild mptt tree if left or right values have their default values\n* Allow nested inherited view\n* Add button on cron to run once\n* Check all fields when writing a sequence of records, values (CVE-2015-0861)\n* Add view_ids on tree view\n* Add parent_of operator\n* Enforce type of inheriting view\n* Use instance context in translated descriptor of Selection\n\nVersion 3.8.0 - 2015-11-02\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Add test for all field methods\n* Load po files also in 'override' subdirectory\n* Add support for float and integer on Property fields\n* Remove foreign-key on create_uid and write_uid\n* Prevent deletion of any user\n* Manage PostgreSQL schema\n* Remove colors attribute on tree view\n* Remove style on Report\n* Add StateReport to Wizard\n* Allow to override ModelSQL._table\n* Allow to import backend from entry points\n* Add reversed operators to PYSON expressions\n* Explicity raise error when creating/writing/deleting models with table_query\n* Use CURRENT_TIMESTAMP instead of now\n* Use Constraint instance in ModelSQL._sql_constraints\n* Only return default record if no domain supplied on ModelSingleton search\n* Rule.domain_get returns a domain and Rule.query_get a SQL query\n* Add target_search option to Many2One\n* Add tables argument to ModelSQL.search_domain\n* Rename ir.module.module* into ir.module*\n\nVersion 3.6.0 - 2015-04-20\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Use bytes and bytearray for Binary\n* Add button_change\n* Add support for PyPy\n* Add support for psycopg2cffi\n* Add noeval on PYSONDecoder\n* Add __repr__ to PYSON\n* Remove safe_eval\n* Add ModelView.view_attributes\n* Add pyson attribute on data field tag\n* Changed into JSON:\n    - record rule domain\n    - trigger condition\n    - 'states', 'domain', 'spell' and 'colors' view attributes\n    - view domain\n    - 'email', 'domain', 'context', 'order' and 'search_value' action fields\n* Add product attribute on form view for One2Many\n* Remove float_time widget\n* Add TimeDelta field\n* search_global yields record instead of id\n* Add ModelTestCase\n* Add test for missing default model access\n* Report API refactorization\n* Add test for access rights of menu and actions\n* Allow to use the dotted notation for order parameters\n* Use action_id to find report to use\n* Allow custom StateView without Model\n* Remove Pool.object_name_list\n* Add translated descriptor for Dict field\n* Clean private context keyword in RPC\n* Add cache section in configuration\n* Use dualmethod on ModelStorage.save\n* New API for on_change: instance changes\n* Add restore_history_before on ModelSQL\n* Remove img_{width,height} form attributes\n\nVersion 3.4.0 - 2014-10-20\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Use literal_eval instead of safe_eval (CVE-2014-6633)\n* Prevent double underscore in safe_eval (CVE-2014-6633)\n* Add pre-validation on button\n* Model and Field access checked only if _check_access is set\n* Add check_access to RPC\n* Add check_access to Wizard and Report\n* Add support for domain_<field name> method\n* Refactor configuration file and command line\n* Use the context of the relation field for instanciation\n* Use a configuration field for logging\n* Add translated descriptor for Selection field\n* Add tree_state attribute on tree view\n* Allow to sync XML data\n* Remove on_change calls in Model.default_get\n* Add group call to on_change\n* Add UnionMixin\n* Allow to disable sorting of dictionary field's selection\n* Add active field to views of action window\n* Make global cache depends on explicit context keys\n* Don't add to global cache Binary fields\n* Add MatchMixin\n* Add image widget to tree\n* Remove context, current_date and time from record rule evaluation\n\nVersion 3.2.0 - 2014-04-21\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Add restore_history to ModelSQL\n* Add history revisions\n* Add the multi selection widget\n* Add index to one2many's on_change\n* Remove auto-refresh on Action Window\n* Add support of domain for non-relation field\n* Manage microseconds in JSON-RPC and XML-RPC\n* Remove Sha field\n* Add password widget\n* Add Len to PYSON\n* Use bcrypt to hash password if possible\n* Use a sequence of ids, values to set fields\n* Client side actions on button and wizard\n* Add depends attribute to data tag\n* Add tree_invisible attribute to button in tree view\n* Drop support of Python 2.6\n* Deprecate on_change, on_change_with, selection_change_with and autocomplete\n  field arguments\n* Add fields.depends decorator\n* Add run-tests\n* Validate only modified and dependant fields on model write\n* Improve error messages by showing the failing value\n* Remove relation field actions:\n    - delete_all\n    - unlink_all\n    - set\n* Rename relation field action unlink into remove\n* Use a sequence of records, values in write\n* set_context of Transaction.set_user is restricted to root\n* Add a \"copy\" action to One2Many and Many2Many's set method\n* Force UTC as timezone (migration script available on tryton-tools)\n* Add relation_field for many2one\n\nVersion 3.0.0 - 2013-10-21\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Allow customization of translation in po files\n* Use python-sql\n* Add convert_domain method on Fields\n* Add sql_format and sql_type methods on Fields\n* Allow to return a full domain for Function.searcher\n* Replace static backend by dynamic get method\n* Replace order_field by order_<field name> method\n* Allow field One2One in check_recursion\n* Remove the default order on MPTT\n* Add grouped attribute to data tag\n* Store selection tree state\n* Add order to Action Window\n* Add factor on number fields\n* Add calendar view\n* Remove request\n\nVersion 2.8.0 - 2013-04-22\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Allow to search on target of Reference field\n* Remove _inherits\n* Add dynamic label\n* Add prefix, suffix on tree view\n* Replace _constraints with validate in ModelStorage\n* Add selection_change_with on Selection and Reference fields\n* Add Dict fields\n* Remove unique constraint on model and field access\n* Use lists of values in create\n* (Field, Operator, Operand) are replaced by Domain on Rule\n* Add global search\n* Replace view shortcut by menu favorite\n* Store default language in database\n* Add icon attribute on fields\n* Prevent Wizard State name to start with '_'\n* Add completion attribute for Many2One, Many2Many and One2Many\n* Add ViewSearch\n* Add domains on Action Window\n\nVersion 2.6.0 - 2012-10-22\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Add pre-validation\n* Allow to use XML file for views\n* Add RPC definition\n* Repace BrowseRecord by Model instance\n* Replace Cache decorator by a simple LRU Cache\n* Remove Cacheable\n* Remove _description\n* Rename _name by __name__\n* Use class in Pool\n* Fix search button clause in ModelButton.get_groups (CVE-2012-2238)\n* Merge all kind of buttons\n* Use XML id for board action instead of id\n* Add states attribute to notebook\n* Allow to use tuple for Reference\n* Add constant interpolation on line graph\n* Add create/delete field access\n* Add dynamic size limit on the One2Many, Many2Many and Char\n* Replace __tryton__.py by tryton.cfg\n* Allow to use Reference field in One2Many & Many2Many\n* Remove hexmd5 from ModelView.fields_view_get\n* Allow client to manage model access\n* Add time format validation\n* Remove ModelSQL.default_sequence\n\nVersion 2.4.0 - 2012-04-23\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Don't allow rpc call on ModelStorage without ModelView (CVE-2012-0215)\n* Add shared WebDAV\n* Remove workflow module\n* Simplify workflow engine\n* Add ir.model.button for access rights\n* Replace fill by expand\n* Integer, Numeric and Float allow None as value\n* NULL value is None and not False\n* Replace user action by a list of actions\n* Add group call to on_change_with\n* Allow to get fuzzy translation\n* Allow to customize server timezone\n* Add richtext widget for WYSIWYG editor\n* Add support of fields.Time\n* Replace nested view by reference id\n* Remove underscore to ir.translation methods\n* Add default database language code\n* Add extras_depend to module definition\n* Store session in database\n* New Wizard design\n* Add pyson.Id\n* Use XML-RPC struct for Decimal and Date\n* Remove change_default on fields\n\nVersion 2.2.0 - 2011-10-24\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Remove name field in ir.property\n* Add wizard to show views\n* Switched from .csv to .po for translations\n* Search on Many2One fields include inactive records\n* Change select on fields into Boolean\n* Change format of search_value on ir.action.act_window\n* Manage relation field access\n* Support size format in context for Binary fields\n* Use buffer for Binary fields\n* No more store Binary fields in base64\n* Remove tabpos attribute on notebook\n* Make PYSON more Pythonic\n* Add readonly on Transaction\n* Add has_returning on Cursor\n* Remove use of python code in workflow XML\n* Use SQL sequence on PostgreSQL for ir.sequence\n* Allow to specify more than one interface\n* Use unoconv for report format conversion\n* Allow to use any Opendocument as report template\n* Drop NetRPC and activate JSON-RPC by default\n* Remove ir.action.wizard_size\n* Rename expand and fill attributes into yexpand and yfill\n* Add xalign and yalign as field attributes\n* Drop support of Python 2.5\n* Remove support of Many2Many field in record XML\n* Change Pool into a Singleton\n* Remove support of zipped modules\n\nVersion 2.0.0 - 2011-04-26\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Use md5 hash for indexing translation\n* Merge tree and list views\n* Added autocompletion on fields.Char\n* Remove ir.default\n* Add type, last user and last modification on ir.attachment\n* Rename datas into data on ir.attachment\n* Add new configuration option to prevent database listing\n* Add warning to wizards\n* Add server-side icons\n* Add support for file link to BinaryField\n* Add model field access\n* Add loading attribute on fields\n* Remove priority attribute on fields\n* Model doesn't convert anymore ids for inherited methods\n* Remove required attribute on Boolean fields\n* Add One2One field\n* Add AUTOINCREMENT to sqlite primary key\n\nVersion 1.8.0 - 2010-11-01\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Add timestamp sequence\n* New transaction management\n* Make _timestamp numeric instead of datetime to work with XML-RPC and JSON-RPC\n* Add ir.trigger to trigger ModelStorage change\n* Add default value to Boolean fields at database level\n\nVersion 1.6.0 - 2010-05-08\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Add symbol parameter to formatLang\n* searcher on Function fields take only one domain clause as argument\n* Use a Reference field on ir.attachment to store resource informations\n  Improve the ir.attachment views to be usable on the client side\n* Use basic access authentication for XML-RPC\n* Replace child{1,2} attributes in xml views by a unique child\n* Models that uses _inherits will search in inherited parents for missing functions\n* Remove ids from on_change* calls\n* Improve search on translatable fields\n* export_data return empty value for invisible fields\n* Don't allow to use float in Numeric fields\n* set/get function on Fields take a list of ids\n* New interface for Function/Property fields\n  Take a Field as first argument instead of many separate arguments\n  Remove static arguments\n* Fix Float and Numeric for lost of precision\n* Add decimal digits validation on fields\n* Improve unittests to run trytond from tests\n  Use sqlite as default backend\n  Add skiptest attribute to data tag\n  Add option to test_tryton to run tests from all modules\n* Add MySQL backend\n* Refactoring by validation with pylint\n* Modify ondelete attribute of Many2One according to required attribute value\n* Refactor import_data of ModelStorage\n* Raise exception when search function is missing on Function fields\n* Add LRU memoization, use it to cache compiled code for safe_eval.\n* Add PySON to replace python string evaluation on client side\n* Add JSON-RPC\n* Add groups on Sequence Types and add rules on sequence based on it.\n* Ignore Fields that starts with \"_\"\n* Add comment on table and field for postgresql backend\n* Remove egenix-mx-base and replace it by python-dateutil\n* Add cache to safe_eval\n* Rename HttpDaemon into XMLRPCDaemon\n* Improve TranslateFactory to fetch all translations for a report in one query\n* Handle displayname on webdav.collection\n* Handle current-user-privilege-set on webdav.collection\n\nVersion 1.4.0 - 2009-10-19\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Add datetime_field on xxx2Many to use a specific _datetime when reading the related record\n* Add new tool safe_eval\n* Handle sequence and history renaming when renaming table\n* Add old_password to set_preferences of res.user on password change\n* Allow to drop constraint, index and foreign key with custom table name\n* Added column_rename on TableHandler\n* Add new tool reduce_ids\n* Add limit_clause function on cursor\n* Fill the cursor cache at search\n* Allow rpc on today of ir.date\n* Use the module dependency order to apply views that inherits\n* Allow to update database at the end of restore\n* Add ir.model.access check get and set of ir.property\n* Add ModelSingleton\n* Move login test in res.user\n* Rename osv into model on workflow\n* Add logout method\n* Move BrowseRecord cache onto the cursor except for Function fields\n* Don't order search result if order value is []\n* Add reload of modules if files have changed\n* Add salt to sha of password\n* Add strftime to ir.lang to handle locale's format\n* Add sqlite backend\n* Add validate test for required and size\n* Remove _sequence on ModelSQL\n* Use gzip in pysocket\n* Add gzip encoding for XML-RPC\n* Add report name in the result of Report.execute\n* Add ir.action.wizard_size to store prefered wizard size\n* Add delete_all action on One2Many field\n* Read, write, create, delete permission on record rules\n* Add reset_default method to ir.default\n* Doesn't append '%' to \"like\", \"ilike\" clauses\n* Handle database dump and restore with password\n* Add float_time attribute in fields view\n\nVersion 1.2.0 - 2009-04-20\n--------------------------\n* Bug fixes (see mercurial logs for details)\n* Add delete of foreign keys with ondelete CASCADE\n* Add write for foreign keys with ondelete SET NULL\n* Add datetime_field on Many2One to use a specific _datetime when reading the related record\n* Use _datetime in context to read record value at specific datetime\n* Add _history_table on ModelSQL to historize change on records\n* Allow to use related fields (many2one and reference) in read\n* Use rec_name function field instead of name_get and name_search\n* Use a new Pool for objects\n* Move workflow in ModelWorkflow and the workflow module\n* Remove Service and LocalService objects\n* New netrpc/xmlrpc syntax\n* copy on ModelStorage copies one2many directly on the right record\n* Search on translated field will search only on translated value\n* Add active field on ir.action to allow better override of reports\n* Add depends attributes on Column\n* Make Modified Preorder Tree Traversal respects the default order of the model\n* Add replace_attributes for xpath tag\n* Add email parameter on report action\n* Allow to inherit views from an other model\n* Add user warnings\n* Allow to use a list of id for copy method\n* Use one lock per database\n* Improve netrpc communication speed\n* Add contextual domain on inherited views\n* Allow to use globals in domain and states\n* Add translate attribute on Selection field\n* Use explicit join in search SQL query\n* Fix for host with IPv6 enable but without default IPv6 route\n* Allow egg installation\n\nVersion 1.0.0 - 2008-11-17\n--------------------------\n* Initial release\n"
  },
  {
    "path": "COPYRIGHT",
    "content": "Copyright (C) 2004-2008 Tiny SPRL.\nCopyright (C) 2007-2022 Cédric Krier.\nCopyright (C) 2007-2013 Bertrand Chenal.\nCopyright (C) 2008-2022 B2CK SPRL.\nCopyright (C) 2011 Openlabs Technologies & Consulting (P) Ltd.\nCopyright (C) 2011-2022 Nicolas Évrard.\nCopyright (C) 2020-2021 Maxime Richez\nCopyright (C) 2020-2021 SALUC SA\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <http://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "MANIFEST.in",
    "content": "include CHANGELOG\ninclude COPYRIGHT\ninclude LICENSE\ninclude README.rst\ninclude doc/*\ninclude trytond/ir/ui/icons/LICENSE\nrecursive-include doc *.rst\nrecursive-include doc *.po\nrecursive-include doc *.pot\n"
  },
  {
    "path": "README.rst",
    "content": "trytond\n=======\n\nThe server of Tryton.\nTryton is business software, ideal for companies of any size, easy to use,\ncomplete and 100% Open Source.\nIt provides modularity, scalability and security.\n"
  },
  {
    "path": "bin/trytond",
    "content": "#!/usr/bin/env python3\n# PYTHON_ARGCOMPLETE_OK\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport glob\nimport logging\nimport os\nimport sys\nimport threading\n\ntry:\n    import argcomplete\nexcept ImportError:\n    argcomplete = None\n\nDIR = os.path.abspath(os.path.normpath(os.path.join(__file__,\n    '..', '..', 'trytond')))\nif os.path.isdir(DIR):\n    sys.path.insert(0, os.path.dirname(DIR))\n\nimport trytond.commandline as commandline\nfrom trytond.config import config, split_netloc\n\nparser = commandline.get_parser_daemon()\nif argcomplete:\n    argcomplete.autocomplete(parser)\noptions = parser.parse_args()\ncommandline.config_log(options)\nextra_files = config.update_etc(options.configfile)\n\nif options.coroutine:\n    # Monkey patching must be done before importing\n    from gevent import monkey\n    monkey.patch_all()\n\nfrom trytond.modules import get_module_info, get_module_list\nfrom trytond.pool import Pool\n# Import trytond things after it is configured\nfrom trytond.wsgi import app\n\nwith commandline.pidfile(options):\n    Pool.start()\n    threads = []\n    for name in options.database_names:\n        thread = threading.Thread(target=Pool(name).init)\n        thread.start()\n        threads.append(thread)\n    for thread in threads:\n        thread.join()\n    hostname, port = split_netloc(config.get('web', 'listen'))\n    certificate = config.get('ssl', 'certificate')\n    try:\n        if config.getboolean('ssl', 'certificate'):\n            certificate = None\n    except ValueError:\n        pass\n    privatekey = config.get('ssl', 'privatekey')\n    try:\n        if config.getboolean('ssl', 'privatekey'):\n            privatekey = None\n    except ValueError:\n        pass\n    if certificate or privatekey:\n        from werkzeug.serving import load_ssl_context\n        ssl_args = dict(\n            ssl_context=load_ssl_context(certificate, privatekey))\n    else:\n        ssl_args = {}\n    if options.dev and not options.coroutine:\n        for module in get_module_list():\n            info = get_module_info(module)\n            for ext in ['xml',\n                    'fodt', 'odt', 'fodp', 'odp', 'fods', 'ods', 'fodg', 'odg',\n                    'txt', 'html', 'xhtml']:\n                path = os.path.join(info['directory'], '**', '*.' + ext)\n                extra_files.extend(glob.glob(path, recursive=True))\n\n    if options.coroutine:\n        from gevent.pywsgi import WSGIServer\n        logger = logging.getLogger('gevent')\n        WSGIServer((hostname, port), app,\n            log=logger,\n            error_log=logger,\n            **ssl_args).serve_forever()\n    else:\n        from werkzeug.serving import run_simple\n        run_simple(hostname, port, app,\n            threaded=True,\n            extra_files=extra_files,\n            use_reloader=options.dev,\n            **ssl_args)\n"
  },
  {
    "path": "bin/trytond-admin",
    "content": "#!/usr/bin/env python3\n# PYTHON_ARGCOMPLETE_OK\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport os\nimport sys\n\ntry:\n    import argcomplete\nexcept ImportError:\n    argcomplete = None\n\nDIR = os.path.abspath(os.path.normpath(os.path.join(__file__,\n    '..', '..', 'trytond')))\nif os.path.isdir(DIR):\n    sys.path.insert(0, os.path.dirname(DIR))\n\nimport trytond.commandline as commandline\nfrom trytond.config import config\n\nparser = commandline.get_parser_admin()\nif argcomplete:\n    argcomplete.autocomplete(parser)\noptions = parser.parse_args()\nconfig.update_etc(options.configfile)\ncommandline.config_log(options)\n\n# Import after application is configured\nimport trytond.admin as admin\n\nadmin.run(options)\n"
  },
  {
    "path": "bin/trytond-console",
    "content": "#!/usr/bin/env python3\n# PYTHON_ARGCOMPLETE_OK\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport os\nimport sys\n\ntry:\n    import argcomplete\nexcept ImportError:\n    argcomplete = None\n\nDIR = os.path.abspath(os.path.normpath(os.path.join(__file__,\n    '..', '..', 'trytond')))\nif os.path.isdir(DIR):\n    sys.path.insert(0, os.path.dirname(DIR))\n\nimport trytond.commandline as commandline\nfrom trytond.config import config\n\nparser = commandline.get_parser_console()\nif argcomplete:\n    argcomplete.autocomplete(parser)\noptions = parser.parse_args()\nconfig.update_etc(options.configfile)\n\n# Import after application is configured\nimport trytond.console as console\n\nconsole.run(options)\n"
  },
  {
    "path": "bin/trytond-cron",
    "content": "#!/usr/bin/env python3\n# PYTHON_ARGCOMPLETE_OK\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport os\nimport sys\n\ntry:\n    import argcomplete\nexcept ImportError:\n    argcomplete = None\n\nDIR = os.path.abspath(os.path.normpath(os.path.join(__file__,\n    '..', '..', 'trytond')))\nif os.path.isdir(DIR):\n    sys.path.insert(0, os.path.dirname(DIR))\n\nimport trytond.commandline as commandline\nfrom trytond.config import config\n\nparser = commandline.get_parser_cron()\nif argcomplete:\n    argcomplete.autocomplete(parser)\noptions = parser.parse_args()\nconfig.update_etc(options.configfile)\ncommandline.config_log(options)\n\nimport trytond.cron as cron\n# Import after application is configured\nfrom trytond.pool import Pool\n\nwith commandline.pidfile(options):\n    Pool.start()\n    cron.run(options)\n"
  },
  {
    "path": "bin/trytond-stat",
    "content": "#!/usr/bin/env python3\n# PYTHON_ARGCOMPLETE_OK\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport curses\nimport datetime as dt\nimport math\nimport os\nimport sys\nfrom collections import defaultdict\n\ntry:\n    import argcomplete\nexcept ImportError:\n    argcomplete = None\n\nDIR = os.path.abspath(os.path.normpath(os.path.join(__file__,\n    '..', '..', 'trytond')))\nif os.path.isdir(DIR):\n    sys.path.insert(0, os.path.dirname(DIR))\n\nimport trytond.commandline as commandline\nfrom trytond.config import config\n\nparser = commandline.get_parser_stat()\nif argcomplete:\n    argcomplete.autocomplete(parser)\noptions = parser.parse_args()\nconfig.update_etc(options.configfile)\n\nimport trytond.status as status\n\n\ndef main(stdscr):\n    global reverse\n    stdscr.nodelay(1)\n    reverse = True\n    processes = {}\n    status_pad = curses.newpad(1, 1)\n    cache_pad = curses.newpad(1, 1)\n\n    def refresh_status():\n        now = dt.datetime.now()\n        height, width = stdscr.getmaxyx()\n\n        def expired(process):\n            return process['expire'] > now\n\n        def format_status(since, id_, request):\n            since = str(dt.timedelta(seconds=int(since)))\n            pid, node = id_.split('@', 1)\n            if len(node) > 12:\n                node = node[:5] + '…' + node[:6]\n            return f\"{pid:>5} {node:<12} {since:>18} {request}\"\n        status_pad.clear()\n        status = [format_status(*i) for i in sorted(\n                ((msg['since'], p['id'], msg['request'])\n                    for p in filter(expired, processes.values())\n                    for msg in p['status']),\n                reverse=reverse)]\n        prow = min(len(status) + 1, height // 2)\n        pcol = max(max(map(len, status), default=0), width)\n        status_pad.resize(len(status) + 1, pcol + 1)\n        for i, line in enumerate(status, 1):\n            status_pad.addnstr(i, 0, line.ljust(pcol), pcol)\n        status_pad.addnstr(\n            0, 0, \"{pid:>5} {node:^12} {since:>18} {request} ({n})\".format(\n                pid=\"pid\",\n                node=\"node\",\n                since=\"TIME\" + ('↑' if reverse else '↓'),\n                request=\"request\",\n                n=len(status),\n                ).upper().ljust(pcol), pcol, curses.A_REVERSE)\n        status_pad.noutrefresh(0, 0, 0, 0, prow, width - 1)\n\n        def ratio(cache):\n            if cache['hit'] or cache['miss']:\n                return cache['hit'] / (cache['hit'] + cache['miss'])\n            return 0\n\n        def format_cache(name, hit, miss, ratio, size):\n            return f\"{hit:{size}d} {miss:{size}d} {ratio * 100:6.2f} {name}\"\n\n        cache_pad.clear()\n        cache_stats = defaultdict(lambda: defaultdict(lambda: 0))\n        for p in filter(expired, processes.values()):\n            for cache in p['caches']:\n                stats = cache_stats[cache['name']]\n                stats['name'] = cache['name']\n                stats['hit'] += cache['hit']\n                stats['miss'] += cache['miss']\n        for cache in cache_stats.values():\n            cache['ratio'] = ratio(cache)\n        try:\n            size = math.ceil(math.log10(\n                    max(s['hit'] + s['miss'] for s in cache_stats.values())))\n        except ValueError:\n            size = 1\n        size = max(size, 4)\n        caches = [format_cache(size=size, **cache) for cache in sorted(\n                cache_stats.values(), key=lambda c: (c['ratio'], c['miss']),\n                reverse=reverse)]\n        crow = max(len(caches) + 1, (height - prow))\n        ccol = max(max(map(len, caches), default=0), width)\n        cache_pad.resize(crow + 1, ccol + 1)\n        for i, line in enumerate(caches, 1):\n            cache_pad.addnstr(i, 0, line.ljust(ccol), ccol)\n        cache_pad.addstr(\n            0, 0,\n            \"{hit:>{size}} {miss:>{size}} {ratio:>6} {name} ({n})\".format(\n                size=size,\n                hit=\"hit\",\n                miss=\"miss\",\n                ratio=\"% \" + ('↑' if reverse else '↓'),\n                name=\"name\",\n                n=len(caches),\n                ).upper().ljust(ccol), curses.A_REVERSE)\n        cache_pad.noutrefresh(0, 0, prow, 0, height - 1, width - 1)\n\n    def refresh():\n        global reverse\n        refresh_status()\n        stdscr.refresh()\n\n        key = stdscr.getch()\n        if key == ord('q'):\n            sys.exit()\n        elif key == ord('r'):\n            reverse = not reverse\n            refresh()\n\n    def update(data=None):\n        if data:\n            pid = data['id']\n            data['expire'] = dt.datetime.now() + dt.timedelta(seconds=10)\n            processes[pid] = data\n        refresh()\n    refresh()\n    return status.listen(config.get('database', 'path'), update)\n\n\nif not curses.wrapper(main):\n    sys.stderr.write(\"status not supported on this platform\\n\")\n"
  },
  {
    "path": "bin/trytond-worker",
    "content": "#!/usr/bin/env python3\n# PYTHON_ARGCOMPLETE_OK\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport os\nimport sys\n\ntry:\n    import argcomplete\nexcept ImportError:\n    argcomplete = None\n\nDIR = os.path.abspath(os.path.normpath(os.path.join(__file__,\n    '..', '..', 'trytond')))\nif os.path.isdir(DIR):\n    sys.path.insert(0, os.path.dirname(DIR))\n\nimport trytond.commandline as commandline\nfrom trytond.config import config\n\nparser = commandline.get_parser_worker()\nif argcomplete:\n    argcomplete.autocomplete(parser)\noptions = parser.parse_args()\nconfig.update_etc(options.configfile)\ncommandline.config_log(options)\n\nimport trytond.worker as worker\n# Import after application is configured\nfrom trytond.pool import Pool\n\nwith commandline.pidfile(options):\n    Pool.start()\n    worker.work(options)\n"
  },
  {
    "path": "doc/conf.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nmodules_url = 'https://docs.tryton.org/projects/modules-{module}/en/{series}/'\ntrytond_url = 'https://docs.tryton.org/projects/server/en/{series}/'\n\n\ndef get_info():\n    import os\n    import subprocess\n    import sys\n\n    module_dir = os.path.dirname(os.path.dirname(__file__))\n\n    info = dict()\n\n    result = subprocess.run(\n        [sys.executable, 'setup.py', '--name'],\n        stdout=subprocess.PIPE, check=True, cwd=module_dir)\n    info['name'] = result.stdout.decode('utf-8').strip()\n\n    result = subprocess.run(\n        [sys.executable, 'setup.py', '--version'],\n        stdout=subprocess.PIPE, check=True, cwd=module_dir)\n    version = result.stdout.decode('utf-8').strip()\n    if 'dev' in version:\n        info['series'] = 'latest'\n    else:\n        info['series'] = '.'.join(version.split('.', 2)[:2])\n\n    return info\n\n\ninfo = get_info()\n\nmaster_doc = 'index'\nproject = info['name']\nrelease = version = info['series']\ndefault_role = 'ref'\nhighlight_language = 'none'\nextensions = [\n    'sphinx.ext.intersphinx',\n    ]\nintersphinx_mapping = {\n    'python': ('https://docs.python.org/', None),\n    }\n\ndel get_info, info, modules_url, trytond_url\n"
  },
  {
    "path": "doc/index.rst",
    "content": ".. _index:\n\n=============\nTryton Server\n=============\n\nFirst steps\n===========\n\n* **Installation:**\n  :ref:`Installation <topics-install>` |\n  :ref:`Configuration <topics-configuration>` |\n  :ref:`Setup a database <topics-setup-database>` |\n  :ref:`Start the server <topics-start-server>`\n\n* **Tutorials:**\n  :ref:`Create a module <tutorial-module>`\n\nThe model layer\n===============\n\n* **Models:**\n  :ref:`Model definition <topics-models>` |\n  :ref:`Field types <ref-models-fields-types>` |\n  :ref:`Domain syntax <topics-domain>` |\n  :ref:`Access rights <topics-access_rights>` |\n  :ref:`Triggers <topics-triggers>`\n\n* **Wizards:**\n  :ref:`Wizards definition <topics-wizard>`\n\nThe view layer\n==============\n\n* **Views:**\n  :ref:`View types <topics-views>` |\n  :ref:`Extension <topics-extension>`\n\n* **Reports:**\n  :ref:`Report definition <topics-reports>`\n\n* **Actions:**\n  :ref:`Actions <topics-actions>`\n\nThe development process\n=======================\n\n* **Modules**\n  :ref:`Module definition <topics-modules>` |\n  :ref:`Create a module <tutorial-module>`\n\nContents\n========\n\n.. toctree::\n   :maxdepth: 2\n\n   topics/index\n   ref/index\n   tutorial/index\n   releases\n\nIndices, glossary and tables\n============================\n\n* :ref:`genindex`\n* :ref:`modindex`\n* :ref:`search`\n"
  },
  {
    "path": "doc/ref/backend.rst",
    "content": ".. _ref-backend:\n.. module:: trytond.backend\n\n=======\nBackend\n=======\n\nThe backend manages the database connection and schema manipulation.\n\n.. contents::\n   :local:\n   :backlinks: entry\n   :depth: 1\n\n.. attribute:: name\n\n   The name of the backend configured.\n\nDatabase\n========\n\n.. class:: Database(name)\n\n   Manage the connection to the named database.\n\n.. method:: Database.connect()\n\n   Connect to the database and return the instance.\n\n.. method:: Database.get_connection([autocommit[, readonly]])\n\n   Retrieve a connection object as defined by :pep:249#connection.\n   If autocommit is set, the connection is committed after each statement.\n   If readonly is set, the connection is read only.\n\n.. method:: Database.put_connection(connection[, close])\n\n   Release the connection.\n   If close is set, the connection is discarded.\n\n.. method:: Database.close()\n\n   Close all connections.\n\n.. classmethod:: Database.create(connection, database_name)\n\n   Create the named database using the connection.\n\n.. classmethod:: Database.drop(connection, database_name)\n\n   Drop the named database using the connection.\n\n.. method:: Database.list([hostname])\n\n   Return a list of Tryton database names.\n   ``hostname`` filters the databases with the same configured hostname.\n\n.. method:: Database.init()\n\n   Initialize the database schema.\n\n.. method:: Database.test([hostname])\n\n   Return if the database is a Tryton database.\n   If ``hostname`` is set, it checks also if it has the same configured\n   hostname.\n\n.. method:: Database.nextid(connection, table)\n\n   Return the next ID for the ``table`` using the ``connection``.\n\n   .. note:: It may return ``None`` for some database.\n\n.. method:: Database.setnextid(connection, table, value)\n\n   Set the ``value`` as current ID to the ``table`` using the ``connection``.\n\n.. method:: Database.currid(connection, table)\n\n   Return the current ID of the ``table`` using the ``connection``.\n\n.. classmethod:: Database.lock(connection, table)\n\n   Lock the ``table`` using the ``connection``.\n\n.. method:: Database.lock_id(id[, timeout])\n\n   Return the SQL expression to lock the ``id``.\n   Set ``timeout`` to wait for the lock.\n\n.. method:: Database.has_constraint(constraint)\n\n   Return if the database handle the ``constraint``.\n\n.. method:: Database.has_returning()\n\n   Return if the database supports ``RETURNING`` in ``INSERT`` and ``UPDATE``.\n\n.. method:: Database.has_multirow_insert()\n\n   Return if the database supports ``INSERT`` of multi-rows.\n\n.. method:: Database.has_select_for()\n\n   Return if the database supports ``FOR UPDATE`` and ``FOR SHARE`` in\n   ``SELECT``.\n\n.. method:: Database.get_select_for_skip_locked()\n\n   Return For class with skip locked.\n\n.. method:: Database.has_window_functions()\n\n   Return if the database supports window functions.\n\n.. method:: Database.has_unaccent()\n\n   Return if the database suppport unaccentuated function.\n\n.. method:: Database.has_unaccent_indexable()\n\n   Return if the database suppport unaccentuated function in index.\n\n.. method:: Database.unaccent(value)\n\n   Return the SQL expression of unaccentuated ``value``.\n\n.. method:: Database.has_similarity()\n\n   Return if the database suppports similarity function.\n\n.. method:: Database.similarity(column, value)\n\n   Return the SQL expression that compare the similarity of ``column`` and\n   ``value``.\n\n.. method:: Database.has_search_full_text()\n\n   Return if the database suppports full text search.\n\n.. method:: Database.format_full_text(\\*documents[, language])\n\n   Return the SQL expression that format the ``documents`` into text search\n   vectors for the ``language``.\n\n   The order of ``documents`` define the weight for proximity ranking.\n\n.. method:: Database.format_full_text_query(query[, language])\n\n   Convert the ``query`` expression into full text query.\n\n.. method:: Database.search_full_text(document, query)\n\n   Return the SQL expression for searching ``document`` with the ``query``.\n\n.. method:: Database.rank_full_text(document, query[, normalize])\n\n   Return the SQL expression to rank ``document`` with the ``query``.\n\n.. classmethod:: Database.has_sequence()\n\n   Return if the database supports sequence querying and assignation.\n\n.. method:: Database.sequence_exist(connection, name)\n\n   Return if the named sequence exists using the ``connection``.\n\n.. method:: Database.sequence_create(connection, name[, number_increment[, start_value]])\n\n   Create a named sequence incremented by ``number_increment`` or ``1`` and\n   starting at ``start_value`` or ``1`` using the ``connection``.\n\n.. method:: Database.sequence_update(connection, name[, number_increment[, start_value]])\n\n   Modify the named sequence with ``number_increment`` and ``start_value``using\n   the ``connection``.\n\n.. method:: Database.sequence_rename(connection, old_name, new_name)\n\n   Rename the sequece from ``old_name`` to ``new_name`` using the\n   ``connection``.\n\n.. method:: Database.sequence_delete(connection, name)\n\n   Delete the named sequence using the ``connection``.\n\n.. method:: Database.sequence_next_number(connection, name)\n\n   Return the next number fo the named sequence using the ``connection``.\n\n.. method:: Database.has_channel(connection, name)\n\n   Return if the database supports ``LISTEN`` and ``NOTIFY`` on channel.\n\n.. method:: Database.sql_type(type_)\n\n   Return the namedtuple('SQLType', 'base type') corresponding to the SQL\n   ``type_``.\n\n.. method:: Database.sql_format(type_, value)\n\n   Return the ``value`` casted for the SQL ``type_``.\n\n.. method:: Database.json_get(column[, key])\n\n   Return the JSON value of the JSON ``key`` from the ``column``.\n\n.. method:: Database.json_key_exists(column, key)\n\n   Return the SQL expression to test if ``key`` exists in the JSON ``column``.\n\n.. method:: Database.json_any_keys_exist(column, keys)\n\n   Return the SQL expression to test if any ``keys`` exist in the JSON\n   ``column``.\n\n.. method:: Database.json_all_keys_exist(column, keys)\n\n   Return the SQL expression to test if all ``keys`` exist in the JSON\n   ``column``.\n\n.. method:: Database.json_contains(column, json)\n\n   Rteurn the SQL expression to test if the JSON ``column`` contains ``json``.\n\nTableHandler\n============\n\n.. class:: TableHandler(model[, history])\n\n   Handle table for the ``model``.\n   If ``history`` is set, the table is the one storing the history.\n\n.. attribute:: TableHandler.namedatalen\n\n   The maximing length of named data for the database.\n\n.. attribute:: TableHandler.index_translators\n\n   Contain the :class:`IndexTranslator` for the database.\n\n.. classmethod:: TableHandler.table_exist(table_name)\n\n   Return if the named table exists.\n\n.. classmethod:: TableHandler.table_rename(old_name, new_name)\n\n   Rename the table from ``old_name`` to ``new_name``.\n\n.. method:: TableHandler.column_exist(column_name)\n\n   Return if the named column exists.\n\n.. method:: TableHandler.column_rename(old_name, new_name)\n\n   Rename the column from ``old_name`` to ``new_name``.\n\n.. method:: TableHandler.alter_size(column_name, column_type)\n\n   Modify the size of the named column using the column type.\n\n.. method:: TableHandler.alter_type(column_name, column_type)\n\n   Modify the type of the named column.\n\n.. method:: TableHandler.column_is_type(column_name, type_[, size])\n\n   Return if the column is of type ``type_``.\n   If ``type`` is ``VARCHAR``, ``size`` is also compared except if the value if\n   negative.\n\n.. method:: TableHandler.db_default(column_name, value)\n\n   Set the default ``value`` on the named column.\n\n.. method:: TableHandler.add_column(column_name, abstract_type[, default[, comment]])\n\n   Add the named column of abstract type.\n   The ``default`` is a method that return the value to fill the new column.\n   ``comment`` set as comment for the column.\n\n.. method:: TableHandler.add_fk(column_name, reference[, on_delete])\n\n   Add a foreign key constraint on the named column to target the ``reference``\n   table name.\n   ``on_delete`` defines the method to use when foreign record is deleted.\n\n.. method:: TableHandler.drop_fk(column_name[, table])\n\n   Drop the foreign key constrant on the named column.\n   ``table`` can be used to alter another table.\n\n.. method:: TableHandler.not_null_action(column_name[, action])\n\n   Add or remove ``NOT NULL`` on the named column.\n\n.. method:: TableHandler.add_constraint(ident, constraint)\n\n   Add the SQL expression ``constraint`` as constraint named ``ident`` on the\n   table.\n\n.. method:: TableHandler.drop_constraint(ident[, table])\n\n   Drop the named ``ident`` constraint.\n   ``table`` can be used to alter another table.\n\n.. method:: TableHandler.set_indexes(indexes)\n\n   Create the :class:`indexes <trytond.model.Index>` if possible and drop\n   others having ``idx_`` as prefix or ``_index`` as suffix.\n\n.. method:: TableHandler.drop_column(column_name)\n\n   Drop the named column.\n\n.. classmethod:: TableHandler.drop_table(model, table[, cascade])\n\n   Drop the named ``table`` and clean ``ir.model.data`` from the given\n   ``model``.\n   Set ``cascade`` to drop objects that depend on the table.\n\n.. classmethod:: TableHandler.convert_name(name[, reserved])\n\n   Convert the data name to be lower than namedatalen minus reserved.\n\n.. method:: Database.index_translator_for(index)\n\n   Return the best :class:`IndexTranslator` for the given index.\n\nIndexTranslator\n===============\n\n.. class:: IndexTranslator\n\n   Convert an :class:`~trytond.model.Index` into a concrete index.\n\n.. classmethod:: IndexTranslator.definition(index)\n\n   Return the name, SQL query and parameters to create the :class:`index\n   <trytond.model.Index>`.\n\n.. classmethod:: IndexTranslator.score(index)\n\n   Return a score related to the fitness of using this translator for the\n   :class:`index <trytond.model.Index>`.\n   A score of ``0`` means that the translator is unsuited for the requested\n   usage.\n\nExceptions\n==========\n\n.. exception:: DatabaseIntegrityError\n\n   Exception raised when the relational integrity of the database is affected.\n\n.. exception:: DatabaseDataError\n\n   Exception raised for errors that are due to problems with the processed data.\n\n.. exception:: DatabaseOperationalError\n\n   Exception raised for errors that are related to the database’s operation.\n"
  },
  {
    "path": "doc/ref/bus.rst",
    "content": ".. _ref-bus:\n.. module:: trytond.bus\n\nBus\n===\n\nThe Tryton server listens on ``POST`` requests on the routes matching\n``/<database_name>/bus`` and replies with JSON_ dictionary containing:\n\n``channel``\n   The channel on which this message has been received.\n\n``message``\n   A dictionary that is the message the client must handle.\n   The specification of the message depends of its type.\n\n   All messages should at least content a unique identifier in the key\n   ``message_id`` and their type in the key of the same name.\n\nClient sending their requests on the route must be authenticated.\nThe request must submit a JSON_ dictionary containing:\n\n``last_message``\n   A value identifying the last message received by the client.\n   This value can be ``null``.\n\n``channels``\n   A list of strings denoting the channels the client is listening to.\n\n.. _JSON: https://en.wikipedia.org/wiki/JSON\n\n.. class:: Bus\n\n   Expose two methods that are used by the framework:\n   ``publish`` and ``subscribe``.\n\n.. classmethod:: Bus.publish(channel, message)\n\n   Send a message to a specific channel.\n\n   Implemented messages are:\n\n      * :ref:`Notifications <bus_notification_spec>`\n\n.. classmethod:: Bus.subscribe(database, channels[, last_message])\n\n   Subscribe a user client to some ``channels`` of messages.\n\n   The ``message_id`` parameter defines the last message id received by the\n   client.\n   It defaults to ``None`` when not provided.\n\nThe default implementation provides an helper method to construct the response:\n\n.. classmethod:: Bus.create_response(channel, message)\n\n   Create a dictionary suitable as a response from a message and a timestamp.\n\n   ``channel`` is the channel on which the message has been received.\n\n   ``message`` is the content of the message sent to the client.\n\n.. note::\n\n   The implementation relies on the fact that the order of the messages\n   received is consistent across different trytond instances allowing to\n   dispatch the request to any trytond server running.\n\nNotification\n------------\n\nTryton provides a shortcut to send a notification with the ``notify`` function.\n\n.. function:: notify(title[, body[, priority[, user[, client]]]])\n\n   Send a text message to a user's client to be displayed using a notification\n   popup. The meaning of ``title``, ``body`` and ``priority`` is defined in\n   :ref:`bus_notification_spec`.\n\n   If ``user`` is not set, the current\n   :attr:`~trytond.transaction.Transaction.user` is used.\n   Otherwise ``user`` is the user id to notify.\n\n   If ``client`` is not set then every client of the user receives the message.\n   If ``client`` and ``user`` are not set, the system send the notification to\n   the current user client.\n   Otherwise the notification is sent to the client whose id matches\n   ``client``.\n\n.. _bus_notification_spec:\n\nNotification message\n~~~~~~~~~~~~~~~~~~~~\n\nNotification messages are composed of four parts:\n\n``kind``\n   The string ``notification``.\n\n``title``\n   A string containing a one-line summary of the message.\n\n``body``\n   A string containing a short informative message for the user.\n   It can span multiple lines but no markup is allowed.\n\n``priority``\n   An integer between 0 (low priority) to 3 (urgent).\n   The notification priority on the platform supporting it.\n"
  },
  {
    "path": "doc/ref/cache.rst",
    "content": ".. _ref-cache:\n.. module:: trytond.cache\n\nCache\n=====\n\n.. class:: Cache(name[, size_limit[, duration[, context]]])\n\n   Use to cache values between server requests.\n\n   The ``name`` should be unique and it's used to identify the cache.\n   Usually ``<class_name>.<content_name>`` is used to make it unique.\n\n   The ``size_limit`` parameter can be used to limit the number of values\n   cached and it has ``1024`` as the default value.\n\n   The ``duration`` parameter defines how long a cached value stays valid but\n   if it is not set the value remains valid until it is cleared.\n\n   And the ``context`` parameter is used to indicate if the cache depends on\n   the user context and is ``True`` by default.\n\n   The cache is cleaned on :class:`~trytond.transaction.Transaction` starts and\n   resets on :class:`~trytond.transaction.Transaction` commit or rollback.\n\n   .. warning::\n\n       As there is no deepcopy of the values cached, they must never be mutated\n       after being set in or retrieved from the cache.\n\n.. attribute:: Cache.hit\n\n   Count the number of times the cache returned a cached value.\n\n.. attribute:: Cache.miss\n\n   Count the number of times the cache did not contain the key.\n\n.. classmethod:: Cache.stats()\n\n   Yield statistics for each instance.\n\n.. method:: Cache.get(key[, default])\n\n   Retrieve the value of the key in the cache.\n\n   If a ``default`` is specified it is returned when the key is missing\n   otherwise it returns ``None``.\n\n.. method:: Cache.set(key, value)\n\n   Set the ``value`` of the ``key`` in the cache.\n\n.. method:: Cache.clear()\n\n   Clear all the keys in the cache.\n\n.. classmethod:: Cache.clear_all()\n\n   Clear all cache instances.\n\n.. classmethod:: Cache.sync(transaction)\n\n   Synchronize caches between servers using :class:`transaction\n   <trytond.transaction.Transaction>` instance.\n\n.. method:: Cache.sync_since(value)\n\n   Return ``True`` if the last synchronization was done before ``value``.\n\n.. classmethod:: Cache.commit(transaction)\n\n   Apply cache changes from transaction.\n\n.. classmethod:: Cache.rollback(transaction)\n\n   Remove cache changes from transaction.\n\n.. classmethod:: Cache.drop(dbname)\n\n   Drop all caches for named database.\n\n.. note::\n\n    By default Tryton uses a MemoryCache, but this behaviour can be overridden\n    by setting a fully qualified name of an alternative class defined in the\n    :ref:`configuration <topics-configuration>` ``class`` of the ``cache``\n    section.\n"
  },
  {
    "path": "doc/ref/exceptions.rst",
    "content": ".. _ref-exceptions:\n.. module:: trytond.exceptions\n\nExceptions\n==========\n\n.. exception:: TrytonException\n\n   The base class for all Tryton exceptions.\n\n.. exception:: UserError(message[, description[, domain]])\n\n   The base class for exceptions used to display an error message to users.\n   The domain may be a 2-tuple containing a :ref:`domain <topics-domain>` and a\n   dictionary of field definitions used to format the domain and append to the\n   description.\n\n.. exception:: UserWarning(name, message[, description])\n\n   The base class for exceptions used to display a warning message to users.\n\n.. exception:: LoginExceptions(name, message[, type])\n\n   The exception used to request ``name`` parameter for the login process.\n\n.. exception:: ConcurrencyException(message)\n\n   The exception raised on concurrent modification.\n\n.. exception:: RateLimitException\n\n   The exception raised when user has sent too many login requests.\n\n.. exception:: MissingDependenciesException(missings)\n\n   The exception raised when modules are missing.\n\n\n.. module:: trytond.model.exceptions\n\n.. exception:: AccessError\n\n   The exception raised when trying to access a record without the rights.\n\n.. exception:: AccessButtonError\n\n   The exception raised when trying to execute a button without the rights.\n\n.. exception:: ImportDataError\n\n   The exception raises when importing data fails.\n\n.. exception:: ValidationError\n\n   The base class for all record validation error.\n\n.. exception:: DomainValidationError\n\n   The exception raised when the domain of a field is not valid.\n\n.. exception:: RequiredValidationError\n\n   The exception raised when a required field is empty.\n\n.. exception:: SizeValidationError\n\n   The exception raised when the size of a field is too big.\n\n.. exception:: DigitsValidationError\n\n   The exception raised when the value of a field does not respect its digits.\n\n.. exception:: SelectionValidationError\n\n   The exception raised when the value is not in the selection.\n\n.. exception:: TimeFormatValidationError\n\n   The exception raised when the time format of a field is not respected.\n\n.. exception:: ForeignKeyError\n\n   The exception raised when a foreign key is not respected.\n\n.. exception:: SQLConstraintError\n\n   The exception raised when a :attr:`~trytond.model.ModelSQL._sql_constraints`\n   is not respected.\n\n.. exception:: RecursionError\n\n   The exception raised by :class:`~trytond.model.TreeMixin.check_recursion`.\n"
  },
  {
    "path": "doc/ref/fields.rst",
    "content": ".. _ref-models-fields:\n.. module:: trytond.model.fields\n\n======\nFields\n======\n\n.. contents::\n   :local:\n   :backlinks: entry\n   :depth: 2\n\nField\n=====\n\n.. class:: Field\n\nFields define the behavior of the data on model's record.\n\nThe following attributes are available to all field types.\nAll are optional except :attr:`~Field.string`.\n\n.. attribute:: Field.string\n\n   A string for the label of the field.\n\n.. attribute:: Field.help\n\n   A multi-line help string for the field.\n\n.. attribute:: Field.required\n\n   If ``True``, the field is not allowed to be empty.\n   Default is ``False``.\n\n.. attribute:: Field.readonly\n\n   If ``True``, the field is not editable in the client.\n   Default is ``False``.\n\n   .. warning::\n      For relational fields, it means only the new, delete, add and remove\n      buttons are inactivated.\n      The editable state of the target record must be managed at the target\n      model level.\n\n.. attribute:: Field.domain\n\n   A :ref:`domain <topics-domain>` constraint that is applied on the field\n   value.\n\n   .. note::\n\n      For :class:`Reference` field it is a dictionary that contains the domain\n      per model name.\n\n.. attribute:: Field.states\n\n   A dictionary that defines dynamic states of the field and overrides the\n   static one.\n\n   Possible keys are ``required``, ``readonly`` and ``invisible``.\n   The values are :class:`~trytond.pyson.PYSON` statements that is evaluated\n   with the values of the record.\n\n.. attribute:: Field.on_change\n\n   A set of field names.\n\n   If this attribute is set, the client calls the method ``on_change_<field\n   name>`` of the model when the user changes the current field value and will\n   give the values of each fields in this list.\n\n   The method signature is::\n\n      on_change_<field name>()\n\n   This method must change the value of the fields to be updated.\n\n   .. note::\n\n      The on_change_<field name> methods are running in a readonly transaction.\n\n   The set of field names is filled by using the decorator :meth:`depends`.\n\n.. attribute:: Field.on_change_with\n\n   A set of field names.\n\n   Same as :attr:`on_change`, but defined the other way around.\n   If this attribute is set, the client will call the method\n   ``on_change_with_<field name>`` of the model when the user changes one of\n   the fields defined in the list and will give the values of each fields in\n   this list.\n\n   The method signature is::\n\n      on_change_with_<field name>()\n\n   This method must return the new value of the field.\n\n   .. note::\n\n      The on_change_with_<field name> methods are running in a readonly\n      transaction.\n\n   The set of field names is filled by using the decorator :meth:`depends`.\n\n.. attribute:: Field.depends\n\n   A :py:class:`set` of extra field names on which the field depends.\n\n   This means that the client read also these fields even if they are not\n   defined on the view.\n   :attr:`Field.depends` is used for example to ensure that\n   :class:`~trytond.pyson.PYSON` statement could be evaluated.\n\n.. attribute:: Field.display_depends\n\n   A computed set of field names on which the field depends when being\n   displayed in a read only view.\n\n.. attribute:: Field.edition_depends\n\n   A computed set of field names on which the field depends when being\n   displayed in a writable view.\n\n.. attribute:: Field.validation_depends\n\n   A computed set of field names on which the field depends when being\n   validated.\n\n.. attribute:: Field.context\n\n   A dictionary which updates the current context for *relation field*.\n\n   .. warning::\n\n      The context could only depend on direct field of the record and without\n      context.\n\n.. attribute:: Field.loading\n\n   Define how the field must be loaded: ``lazy`` or ``eager``.\n\n.. attribute:: Field.name\n\n   The name of the field.\n\nInstance methods:\n\n.. method:: Field.convert_domain(domain, tables, Model)\n\n    Convert the simple :ref:`domain <topics-domain>` clause into a SQL\n    expression or a new domain.\n    :ref:`tables <ref-tables>` could be updated to add new joins.\n\n.. method:: Field.sql_format(value)\n\n    Convert the value to use as parameter of SQL queries.\n\n.. method:: Field.sql_type()\n\n    Return the namedtuple('SQLType', 'base type') which defines the SQL type to\n    use for definition and casting.\n    Or ``None`` if the field is not stored in the database.\n\n    sql_type is using the ``_sql_type`` attribute to compute its return value.\n    The backend is responsible for the computation.\n\n    For the list of supported types by Tryton see :ref:`backend types\n    <topics-backend_types>`.\n\n.. method:: Field.sql_cast(expression)\n\n    Return the SQL expression with cast with the type of the field.\n\n.. method:: Field.sql_column(table)\n\n    Return the Column instance based on table.\n\n.. method:: Field.set_rpc(model)\n\n    Add to :class:`model <trytond.model.Model>` the default\n    :class:`~trytond.rpc.RPC` instances needed by the field.\n\n.. method:: Field.definition(model, language)\n\n    Return a dictionary with the definition of the field.\n\n.. method:: Field.definition_translations(model, language)\n\n    Return a list of translation sources used by :meth:`~Field.definition`.\n\nDefault value\n=============\n\nSee :ref:`default value <topics-fields_default_value>`\n\nSearching\n=========\n\nA class method could be defined for each field which must return a SQL\nexpression for the given domain instead of the default one.\nThe method signature is::\n\n    domain_<field name>(domain, tables)\n\nWhere ``domain`` is the simple :ref:`domain <topics-domain>` clause and\n``tables`` is a nested dictionary, see :ref:`tables <ref-tables>`.\n\nOrdering\n========\n\nA class method could be defined for each field which must return a list of SQL\nexpression on which to order instead of the field.\nThe method signature is::\n\n    order_<field name>(tables)\n\nWhere ``tables`` is a nested dictionary, see :ref:`tables <ref-tables>`.\n\nDepends\n=======\n\n.. method:: depends([\\*fields[, methods]])\n\n   A decorator to define the field names on which the decorated method depends.\n\n   The ``methods`` argument can be used to duplicate the field names from other\n   decorated methods.\n   This is useful if the decorated method calls another method.\n\n.. _ref-models-fields-types:\n\nField types\n===========\n\nBoolean\n-------\n\n.. class:: Boolean(string[, \\**options])\n\n   A :py:class:`boolean <bool>` field.\n\nInteger\n-------\n\n.. class:: Integer(string[, \\**options])\n\n   An :py:class:`integer <int>` field.\n\nBigInteger\n----------\n\n.. class:: BigInteger(string[, \\**options])\n\n   A long :py:class:`integer <int>` field.\n\nChar\n----\n\n.. class:: Char(string[, size[, translate[, strip[, \\**options]]]])\n\n   A single line :py:class:`string <str>` field.\n\n   Search by similarity is used for the ``ilike`` operator and\n   :meth:`~trytond.tools.is_full_text` value if the backend supports it and a\n   threshold is set.\n   The similarity threshold is defined for the context key ``<model\n   name>.<field name>.search_similarity`` or ``search_similarity``.\n\n   The field is ordered using the similarity with the context value from the\n   key ``<model name>.<field name>.order`` if it is set.\n\n:class:`Char` has some extra arguments:\n\n.. attribute:: Char.size\n\n   The maximum length (in characters) of the field. The size is enforced at the\n   storage level and in the client input.\n   The value can be a :class:`~trytond.pyson.PYSON` statement.\n\n.. attribute:: Char.translate\n\n   If ``True``, the value of the field is translatable.\n   The value readed and stored will depend on the ``language`` defined in the\n   context.\n\n.. attribute:: Char.strip\n\n   If ``True``, leading and trailing whitespace are removed.\n   If ``leading``, leading whitespace are removed.\n   If ``trailing``, trailing whitespace are removed.\n   The default value is ``True``.\n\n.. attribute:: Char.autocomplete\n\n   A set of field names.\n\n   If this attribute is set, the client calls the method ``autocomplete_<field\n   name>`` of the :class:`model <trytond.model.Model>` when the user changes\n   one of those field values.\n   The method signature is::\n\n      autocomplete_<field name>()\n\n   This method must return a list of string that is used by the client to make\n   autocompletion proposal.\n   The set of field names could be filled by using the decorator :meth:`depends`.\n\n.. attribute:: Char.search_unaccented\n\n   If this attribute is set to ``True``, ``ilike`` searches is performed on\n   unaccented strings.\n   The default value is ``True``.\n\n   .. warning::\n\n      The database backend must supports unaccented search.\n\n.. attribute:: Char.search_full_text\n\n   If this attribute is set to ``True``, ``ilike`` searches with an\n   :meth:`~trytond.tools.is_full_text` value use the full text search of the\n   backend.\n   The default value is ``False``.\n\n   The context can be used to force the full text search behaviour.\n   This is done using the key ``<model name>.<field name>.search_full_text``.\n   If ``True``, the full text search is used no matter what the value.\n   If ``False``, no full text search is peformed.\n\n   The full text ranking value is added to the similarity if the\n   ``search_full_text`` is ``True``.\n\n   .. note::\n\n      The database backend must support full text search otherwise ``ilike`` is\n      always used.\n\nText\n----\n\n.. class:: Text(string[, size[, translatable[, \\**options]]])\n\n   A multi line :py:class:`string <str>` field.\n\n:class:`Text` has some extra arguments:\n\n.. attribute:: Text.size\n\n   Same as :attr:`Char.size`.\n\n.. attribute:: Text.translate\n\n   Same as :attr:`Char.translate`.\n\n.. attribute:: Text.search_unaccented\n\n   Same as :attr:`Char.search_unaccented`.\n\n.. attribute:: Text.search_full_text\n\n   Same as :attr:`Char.search_full_text`.\n   The default value is ``True``.\n\nFullText\n--------\n\n.. class:: FullText(\\**options)\n\n   An internal field to store a list of parsed strings ordered by weights.\n   The field is ordered using the full text ranking with the context value from\n   the key ``<model name>.<field name>.order`` if it is set.\n\n\nFloat\n-----\n\n.. class:: Float(string[, digits[, \\**options]])\n\n   A :py:class:`floating-point number <float>` field.\n   It is represented in Python by a ``float`` instance.\n\n:class:`Float` has some extra arguments:\n\n.. attribute:: Float.digits\n\n   A tuple of two :py:class:`integers <int>`.\n\n   The first integer defines the total of numbers in the integer part.\n\n   The second integer defines the total of numbers in the decimal part.\n\n   Integers can be replaced by a :class:`~trytond.pyson.PYSON` statement.\n   If digits is ``None`` or any values of the tuple is ``None``, no validation\n   on the numbers is done.\n   The tuple can be replaced by a string containing the name of a\n   :class:`Many2One` pointing to a :class:`~trytond.model.DigitsMixin`.\n\nNumeric\n-------\n\n.. class:: Numeric(string[, digits[, \\**options]])\n\n   A :py:class:`fixed-point number <decimal.Decimal>` field.\n\n:class:`Numeric` has some extra arguments:\n\n.. attribute:: Numeric.digits\n\n   Same as :attr:`Float.digits`.\n\nDate\n----\n\n.. class:: Date(string[, \\**options])\n\n   A :py:class:`date <datetime.date>` field.\n\nInstance methods:\n\n.. method:: Date.sql_cast(expression[, timezone])\n\n   Return the SQL expression cast as date.\n\n   If timezone is set the expression is first converted to this timezone.\n\nDateTime\n--------\n\n.. class:: DateTime(string[, format, \\**options])\n\n   A :py:class:`date and time <datetime.datetime>` field.\n\n   It is stored in `UTC`_ while displayed in the user timezone.\n\n.. _`UTC`: https://en.wikipedia.org/wiki/Coordinated_Universal_Time\n\n:class:`DateTime` has some extra arguments:\n\n.. attribute:: DateTime.format\n\n   A string format as used by :py:meth:`~datetime.datetime.strftime`.\n\n   This format is used to display the time part of the field.\n   The default value is ``%H:%M:%S``.\n   The value can be replaced by a :class:`~trytond.pyson.PYSON` statement.\n\nTimestamp\n---------\n\n.. class:: Timestamp(string[, \\**options])\n\n   A :py:class:`timestamp <datetime.datetime>` field.\n\nTime\n----\n\n.. class:: Time(string[, format, \\**options])\n\n   A :py:class:`time <datetime.time>` field.\n\n:class:`Time` has some extra arguments:\n\n.. attribute:: Time.format\n\n    Same as :attr:`DateTime.format`.\n\nTimeDelta\n---------\n\n.. class:: TimeDelta(string[, converter[, \\**options]])\n\n   An :py:class:`interval <datetime.timedelta>` field.\n\n:class:`TimeDelta` has some extra arguments:\n\n.. attribute:: TimeDelta.converter\n\n   The name of the context key containing the time converter.\n\n   A time converter is a dictionary with the keys:\n   ``s`` (second), ``m`` (minute), ``h`` (hour), ``d`` (day), ``w`` (week),\n   ``M`` (month), ``Y`` (year) and the value in second.\n\nBinary\n------\n\n.. class:: Binary(string[, \\**options])\n\n   A :py:class:`binary <bytes>` field.\n\n   .. warning::\n\n      If the context contains a key composed of the model name and field name\n      separated by a dot and its value is the string ``size`` then the read\n      value is the size instead of the content.\n\n:class:`Binary` has some extra arguments:\n\n.. attribute:: Binary.filename\n\n   Name of the field that holds the data's filename.\n\n   Default value is an empty string, which means the data has no filename (in\n   this case, the filename is hidden, and the \"Open\" button is hidden when the\n   widget is set to \"image\").\n\n.. attribute:: Binary.file_id\n\n   Name of the field that holds the ``FileStore`` identifier.\n\n   Default value is ``None`` which means the data is stored in the database.\n   The field must be on the same table and accept ``char`` values.\n\n   .. warning::\n\n      Switching from database to file-store is supported transparently.\n      But switching from file-store to database is not supported without\n      manually upload to the database all the files.\n\n.. attribute:: Binary.store_prefix\n\n   The prefix to use with the ``FileStore``.\n\n   Default value is ``None`` which means the database name is used.\n\nSelection\n---------\n\n.. class:: Selection(selection, string[, sort[, selection_change_with[, translate[, help_selection[, \\**options]]]]])\n\n   A :py:class:`string <str>` field with limited values to choose from.\n\n:class:`Selection` has some extra arguments:\n\n.. attribute:: Selection.selection\n\n   A list of 2-tuples that looks like this::\n\n      [('M', 'Male'), ('F', 'Female')]\n\n   The first element in each tuple is the actual value stored.\n   The second element is the human-readable name.\n\n   It can also be the name of a class or instance method on the model, that\n   returns an appropriate list.\n   The signature of the method is::\n\n      selection()\n\n   .. note::\n      The method is automaticly added to :attr:`trytond.model.Model.__rpc__` if\n      not manually set.\n\n.. attribute:: Selection.sort\n\n   If ``True``, the choices is sorted by human-readable value.\n\n   Default value is ``True``.\n\n   .. note::\n      If it is ``False``, search results ordered by the field uses the index of\n      the selection instead of the human-readable name.\n\n.. attribute:: Selection.selection_change_with\n\n   A set of field names.\n\n   If this attribute is set, the client calls the ``selection`` method of\n   the model when the user changes on of the fields defined in the list and\n   gives the values of each fields in the list.\n\n   The ``selection`` method should be an instance method.\n\n   The set of field names is filled by using the decorator :meth:`depends`.\n\n.. attribute:: Selection.translate_selection\n\n   If ``True``, the human-readable values will be translated.\n\n   Default value is ``True``.\n\n.. attribute:: Selection.help_selection\n\n   A dictionary mapping the selection value with its help string.\n\nInstance methods:\n\n.. method:: Selection.translated([name])\n\n   Returns a descriptor for the translated value of the field.\n\n   The descriptor must be used on the same class as the field.\n   It uses the language defined in the context of the instance accessed.\n\n\nMultiSelection\n--------------\n\n.. class:: MultiSelection(selection, string[, sort[, translate[, help_selection[, \\**options]]]])\n\n   A :py:class:`tuple` field with limited values to choose from.\n\n:class:`MultiSelection` has some extra arguments:\n\n.. attribute:: MultiSelection.selection\n\n   Same as :attr:`Selection.selection`.\n\n.. attribute:: MultiSelection.sort\n\n   Same as :attr:`Selection.sort`.\n\n.. attribute:: MultiSelection.translate_selection\n\n   Same as :attr:`Selection.translate_selection`.\n\n.. attribute:: MultiSelection.help_selection\n\n   Same as :attr:`Selection.help_selection`.\n\nInstance methods:\n\n.. method:: MultiSelection.translated([name])\n\n   Same as :meth:`Selection.translated` but returns a list of translated\n   values.\n\n\nReference\n---------\n\n.. class:: Reference(string[, selection[, sort[, selection_change_with[, translate[, help_selection[,search_order[, search_context[, \\**options]]]]]]]])\n\n   A :py:class:`string <str>` field that refers to a record of a model.\n\n      '<model name>,<record id>'\n\n   But a ``tuple`` can be used to search or set value.\n\n:class:`Reference` has some extra arguments:\n\n.. attribute:: Reference.selection\n\n   Same as :attr:`Selection.selection` but only for model name.\n\n.. attribute:: Reference.sort\n\n   Same as :attr:`Selection.sort`.\n\n.. attribute:: Reference.selection_change_with\n\n   Same as :attr:`Selection.selection_change_with`.\n\n.. attribute:: Reference.translate_selection\n\n   Same as :attr:`Selection.translate_selection`.\n\n.. attribute:: Reference.help_selection\n\n   Same as :attr:`Selection.help_selection`.\n\n.. attribute:: Reference.datetime_field\n\n   Same as :attr:`Many2One.datetime_field`.\n\n.. attribute:: Reference.search_order\n\n   A dictionary that contains a :ref:`PYSON <ref-pyson>` expression defining\n   the default order used to display search results in the clients per model\n   name.\n\n.. attribute:: Reference.search_context\n\n   Same as :attr:`Many2One.search_context`.\n\nInstance methods:\n\n.. method:: Reference.translated([name])\n\n   Same as :meth:`~Selection.translated` but for the translated name of the\n   target model.\n\n.. method:: Reference.sql_id(column, Model)\n\n   Return the SQL expression that extract the record ID of the column.\n\n\nMany2One\n--------\n\n.. class:: Many2One(model_name, string[, left[, right[, path[, ondelete[, datetime_field[, target_search[, search_order[, search_context[, \\**options]]]]]]]]])\n\n   A many-to-one relation field that refers to a record of the named model.\n\n   A :py:class:`integer <int>` as :attr:`~trytond.model.Model.id` is used for\n   low level APIs.\n\n:class:`Many2One` has some extra arguments:\n\n.. attribute:: Many2One.model_name\n\n   The name of the target model.\n\n.. attribute:: Many2One.left\n\n   The name of the field that stores the left value for the `Modified Preorder\n   Tree Traversal`_.\n   It only works if the :attr:`model_name` is the same then the model.\n\n   .. warning::\n\n      The MPTT Tree will be rebuild on database update if one record is found\n      having left or right field value equals to the default or NULL.\n\n.. _`Modified Preorder Tree Traversal`: http://en.wikipedia.org/wiki/Tree_traversal\n\n.. attribute:: Many2One.right\n\n   The name of the field that stores the right value.\n   See :attr:`left`.\n\n.. attribute:: Many2One.path\n\n   The name of the :class:`Char` field that stores the path.\n   It only works if the :attr:`model_name` is the same as the model.\n\n   .. note::\n\n      The path is used to optimize searches using the ``child_of`` or\n      ``parent_of`` operators.\n\n   .. warning::\n\n      The paths in the tree will be rebuilt during the database update if any\n      of the records are found to have a path field equal to the default, or\n      ``NULL``.\n\n.. attribute:: Many2One.ondelete\n\n   Define the behavior of the record when the target record is deleted.\n\n   Allowed values are:\n\n      - ``CASCADE``: tries to delete the record.\n\n      - ``RESTRICT``: prevents the deletion of the target record.\n\n      - ``SET NULL``: clears the relation field.\n\n    ``SET NULL`` is the default setting.\n\n   .. note::\n\n      ``SET NULL`` is override into ``RESTRICT`` if :attr:`~Field.required` is\n      ``True``.\n\n.. attribute:: Many2One.datetime_field\n\n   If set, the target record will be read at the date defined by the datetime\n   field name of the record.\n\n   It is usually used in combination with\n   :attr:`~trytond.model.ModelSQL._history` to request a value for a given date\n   and time on a historicized model.\n\n.. attribute:: Many2One.target_search\n\n   Define the kind of SQL query to use when searching on related target.\n\n   Allowed values are:\n\n      - ``subquery``: uses a subquery based on the ids.\n\n      - ``join``: adds a join on the main query.\n\n   ``join`` is the default value.\n\n   .. note::\n\n      ``join`` could improve the performance if the target has a huge amount of\n      records.\n\n.. attribute:: Many2One.search_order\n\n   A :ref:`PYSON <ref-pyson>` expression defining the default order used to\n   display search results in the clients.\n\n.. attribute:: Many2One.search_context\n\n   A dictionary defining the default context used when searching from the\n   client.\n\n   .. note::\n\n      ``search_context`` overrides the values from the client ``context``.\n\n\nOne2Many\n--------\n\n.. class:: One2Many(model_name, field, string[, add_remove[, order[, datetime_field[, size[, search_order[, search_context[, \\**options]]]]]]])\n\n   A one-to-many relation field that refers to records of the named model.\n\n   It requires to have the opposite :class:`Many2One` field or a\n   :class:`Reference` field defined on the target model.\n\n   A :py:class:`tuple <tuple>` composed of :py:class:`integer <int>` as\n   :attr:`~trytond.model.Model.id` is used for low level APIs.\n\n:class:`One2Many` accepts as written and created value a :py:class:`list\n<list>` of :py:class:`tuples <tuple>` like this:\n\n   - ``('create', [{<field name>: value, ...}, ...])``:\n     create new target records and link them to this one.\n\n   - ``('write', ids, {<field name>: value, ...}, ...)``:\n     write values to target ids.\n\n   - ``('delete', ids)``:\n     delete the target ids.\n\n   - ``('add', ids)``:\n     link the target ids to this record.\n\n   - ``('remove', ids)``:\n     unlink the target ids from this record.\n\n   - ``('copy', ids[, {<field name>: value, ...}, ...])``:\n     copy the target ids to this record.\n     Optional field names and values may be added to override some of the\n     fields of the copied records.\n\n.. note::\n\n   :class:`~trytond.pyson.PYSON` statement or :attr:`Field.depends` of target\n   records can access value of the parent record fields by prepending\n   ``_parent_`` to the opposite field name and followed by the dotted notation.\n\n:class:`One2Many` has some extra arguments:\n\n.. attribute:: One2Many.model_name\n\n   The name of the target model.\n\n.. attribute:: One2Many.field\n\n   The name of the field that handles the opposite :class:`Many2One` or\n   :class:`Reference`.\n\n:class:`One2Many` has some extra arguments:\n\n.. attribute:: One2Many.add_remove\n\n   A :ref:`domain <topics-domain>` to select records to add.\n\n   If set, the client will allow to add/remove existing records instead of only\n   create/delete.\n\n.. attribute:: One2Many.filter\n\n   A :ref:`domain <topics-domain>` that is not a constraint but only a filter\n   on the records.\n\n   .. warning::\n\n      Only a static domain is allowed, it cannot contain any\n      :class:`~trytond.pyson.PYSON` statements.\n\n.. attribute:: One2Many.order\n\n   A list of tuple defining the default order of the records like for\n   :attr:`trytond.model.ModelSQL._order`.\n\n.. attribute:: One2Many.datetime_field\n\n   Same as :attr:`Many2One.datetime_field`.\n\n.. attribute:: One2Many.size\n\n   An integer or a PYSON expression denoting the maximum number of records\n   allowed in the relation.\n\n.. attribute:: One2Many.search_order\n\n   Same as :attr:`Many2One.search_order`.\n\n.. attribute:: One2Many.search_context\n\n   Same as :attr:`Many2One.search_context`.\n\nInstance methods:\n\n.. method:: One2Many.remove(instance, records)\n\n   Remove the target records from the instance instead of deleting them.\n\nMany2Many\n---------\n\n.. class:: Many2Many(relation_name, origin, target, string[, order[, datetime_field[, size[, search_order[, search_context[, \\**options]]]]]])\n\n   A many-to-many relation field that refers to records of the targeted model.\n\n   It requires to have the opposite origin :class:`Many2One` field or a\n   :class:`Reference` field defined on the relation model and a\n   :class:`Many2One` field pointing to the target.\n\n   A :py:class:`tuple <tuple>` composed of :py:class:`integer <int>` as\n   :attr:`~trytond.model.Model.id` is used for low level APIs.\n\n:class:`Many2Many` accepts as written and created value a :py:class:`list\n<list>` of :py:class:`tuples <tuple>` like the :class:`One2Many`.\n\n:class:`Many2Many` has some extra arguments:\n\n.. attribute:: Many2Many.relation_name\n\n   The name of the relation model.\n\n.. attribute:: Many2Many.origin\n\n   The name of the field that has the :class:`Many2One` or :class:`Reference`\n   to the record.\n\n.. attribute:: Many2Many.target\n\n   The name of the field that has the :class:`Many2One` to the target record.\n\n   .. note::\n\n      A :class:`Many2Many` field can be used on a simple\n      :class:`~trytond.model.ModelView`, like in a\n      :class:`~trytond.wizard.Wizard`.\n      For this, :attr:`~Many2Many.relation_name` is set to the target model and\n      :attr:`~Many2Many.origin` and :attr:`~Many2Many.target` are set to\n      ``None``.\n\n:class:`Many2Many` has some extra arguments:\n\n.. attribute:: Many2Many.order\n\n   Same as :attr:`One2Many.order`.\n\n.. attribute:: Many2Many.datetime_field\n\n   Same as :attr:`Many2One.datetime_field`.\n\n.. attribute:: Many2Many.size\n\n   An integer or a :class:`~trytond.pyson.PYSON` expression denoting the\n   maximum number of records allowed in the relation.\n\n.. attribute:: Many2Many.add_remove\n\n   An alias to the :attr:`~Field.domain` for compatibility with the\n   :class:`One2Many`.\n\n.. attribute:: Many2Many.filter\n\n   Same as :attr:`One2Many.filter`.\n\n.. attribute:: Many2Many.search_order\n\n   Same as :attr:`Many2One.search_order`.\n\n.. attribute:: Many2Many.search_context\n\n   Same as :attr:`Many2One.search_context`.\n\nInstance methods:\n\n.. method:: Many2Many.get_relation()\n\n   Return the relation :class:`~trytond.model.Model`.\n\n.. method:: Many2Many.get_target()\n\n   Return the target :class:`~trytond.model.Model`.\n\n.. method:: Many2Many.delete(instance, records):\n\n   Delete the target records from the instance instead of removing them.\n\n\nOne2One\n-------\n\n.. class:: One2One(relation_name, origin, target, string[, datetime_field[, \\**options]])\n\n   A one-to-one relation field that refers to a record of the targeted model.\n\n   .. warning::\n      It is on the relation_name :class:`~trytond.model.Model` that the unicity\n      of the couple (origin, target) must be checked.\n\n   A :py:class:`integer <int>` as :attr:`~trytond.model.Model.id` is used for\n   low level APIs.\n\n:class:`One2One` has some extra arguments:\n\n.. attribute:: One2One.datetime_field\n\n   Same as :attr:`Many2One.datetime_field`.\n\n.. attribute:: One2One.filter\n\n   Same as :attr:`One2Many.filter`.\n\nInstance methods:\n\n.. method:: One2One.get_relation()\n\n   Return the relation :class:`~trytond.model.Model`.\n\n.. method:: One2One.get_target()\n\n   Return the target :class:`~trytond.model.Model`.\n\n\nFunction\n--------\n\n.. class:: Function(field, getter[, setter[, searcher[, getter_with_context]]])\n\n   A function field can emulate any other given :class:`field <Field>`.\n\n:class:`Function` has some extra arguments:\n\n.. attribute:: Function.getter\n\n   The name of the classmethod or instance of the :class:`~trytond.model.Model`\n   for getting values.\n   The signature of the classmethod is::\n\n      getter(instances, name)\n\n   where ``name`` is the name of the field, and it must return a dictionary\n   with a value for each instance.\n\n   Or the signature of the classmethod is::\n\n      getter(instances, names)\n\n   where ``names`` is a list of name fields, and it must return a dictionary\n   containing for each names a dictionary with a value for each instance.\n\n   The signature of the instancemethod is::\n\n      getter(name)\n\n   where ``name`` is the name of the field, and it must return the value.\n\n.. attribute:: Function.setter\n\n   The name of the classmethod of the :class:`~trytond.model.Model` to set the\n   value.\n   The signature of the method id::\n\n      setter(instances, name, value)\n\n   where ``name`` is the name of the field and ``value`` the value to set.\n\n   .. warning::\n\n       The modifications made to instances are not saved automatically.\n\n.. attribute:: Function.searcher\n\n   The name of the classmethod of the :class:`~trytond.model.Model` to search\n   on the field.\n   The signature of the method is::\n\n      searcher(name, clause)\n\n   where ``name`` is the name of the field and ``clause`` is a :ref:`domain\n   clause <topics-domain>`.\n   It must return a list of :ref:`domain <topics-domain>` clauses but the\n   ``operand`` can be a SQL query.\n\n.. attribute:: Function.getter_with_context\n\n   A boolean telling if the getter result depends on the context.\n\n   If it does not depend, the getter is called without context and the result\n   is stored in the transaction cache when readonly.\n\n   The default value is ``True``.\n\nInstance methods:\n\n.. method:: Function.get(ids, model, name[, values])\n\n   Call the :attr:`~Function.getter` classmethod where ``model`` is the\n   :class:`~trytond.model.Model` instance of the field, ``name`` is the name of\n   the field.\n\n.. method:: Function.set(ids, model, name, value)\n\n   Call the :attr:`~Function.setter` classmethod where ``model`` is the\n   :class:`~trytond.model.Model` instance of the field, ``name`` is the name of\n   the field, ``value`` is the value to set.\n\n.. method:: Function.search(model, name, clause)\n\n   Call the :attr:`~Function.searcher` classmethod where ``model`` is the\n   :class:`~trytond.model.Model` instance of the field, ``name`` is the name of\n   the field, ``clause`` is a clause of :ref:`domain <topics-domain>`.\n\nMultiValue\n----------\n\n.. class:: MultiValue(field)\n\n   A multivalue field that is like a :class:`Function` field but with\n   predefined :attr:`~Function.getter` and :attr:`~Function.setter` that use\n   the :class:`~trytond.model.MultiValueMixin` for stored values.\n\n.. warning::\n\n   The :meth:`~trytond.model.MultiValueMixin.get_multivalue` and\n   :meth:`~trytond.model.MultiValueMixin.set_multivalue` should be prefered\n   over the descriptors of the field.\n\n.. warning::\n\n   The :ref:`default <topics-fields_default_value>` method of the field must\n   accept pattern as keyword argument.\n\n\nDict\n----\n\n.. class:: Dict(schema_model[, \\**options])\n\n   A :py:class:`dictionary <dict>` field with predefined keys.\n\n.. note::\n    It is possible to store the dict as JSON in the database if the backend\n    supports by manually altering the column type to JSON on the database.\n\n:class:`Dict` has some extra arguments:\n\n.. attribute:: Dict.schema_model\n\n   The name of the :class:`~trytond.model.DictSchemaMixin` model that stores\n   the definition of keys.\n\n.. attribute:: Dict.search_unaccented\n\n   Same as :attr:`Char.search_unaccented` but when searching on key's value.\n\nInstance methods:\n\n.. method:: Dict.translated([name[, type_]])\n\n   Return a descriptor for the translated ``values`` or ``keys`` of the field\n   following ``type_``.\n   The descriptor must be used on the same class as the field.\n   Default ``type_`` is ``values``.\n"
  },
  {
    "path": "doc/ref/filestore.rst",
    "content": ".. _ref-filestore:\n.. module:: trytond.filestore\n\nFileStore\n=========\n\n.. class:: FileStore()\n\n   Store and retrieve files from the directory defined in the configuration\n   ``path`` of ``database`` section.\n\n   It uses a two levels of directory composed of the 2 chars of the file hash.\n   It is an append only storage.\n\n.. method:: FileStore.get(id[, prefix])\n\n   Retrieve the content of the file referred by the id in the prefixed\n   directory.\n\n.. method:: FileStore.getmany(ids[, prefix])\n\n   Retrieve a list of contents for the sequence of ids.\n\n.. method:: FileStore.size(id[, prefix])\n\n   Return the size of the file referred by the id in the prefixed directory.\n\n.. method:: FileStore.sizemany(ids[, prefix])\n\n   Return a list of sizes for the sequence of ids.\n\n.. method:: FileStore.set(data[, prefix])\n\n   Store the data in the prefixed directory and return the identifiers.\n\n.. method:: FileStore.setmany(data[, prefix])\n\n   Store the sequence of data and return a list of identifiers.\n\n.. note::\n   The class can be overridden by setting a fully qualified name of a\n   alternative class defined in the configuration ``class`` of the ``database``\n   section.\n"
  },
  {
    "path": "doc/ref/i18n.rst",
    "content": ".. _ref-i18n:\n.. module:: trytond.i18n\n\nInternationalization\n====================\n\n.. function:: gettext(message_id, [language[, \\**variables]])\n\n   Return the message translated into the ``language``.\n\n   The ``message_id`` is the ``XML`` id for the ``ir.message`` that is to be\n   translated, and the ``variables`` keyword arguments are used as a mapping to\n   format the string.\n   If ``language`` is not set, then the :attr:`Transaction.language\n   <trytond.transaction.Transaction.language>` is used.\n\n.. function:: lazy_gettext(message_id, [language[, \\**variables]])\n\n   Return a LazyString that will be translated with gettext later when actually\n   used.\n"
  },
  {
    "path": "doc/ref/index.rst",
    "content": ".. _ref-index:\n\n=============\nAPI Reference\n=============\n\nReference of the ``trytond`` API:\n\n.. toctree::\n   :maxdepth: 1\n\n   models\n   fields\n   wizard\n   pyson\n   transaction\n   exceptions\n   backend\n   tools/index\n   pool\n   rpc\n   i18n\n   sendmail\n   filestore\n   cache\n   bus\n   tests\n"
  },
  {
    "path": "doc/ref/models.rst",
    "content": ".. _ref-models:\n.. module:: trytond.model\n\n======\nModels\n======\n\n.. contents::\n   :local:\n   :backlinks: entry\n   :depth: 2\n\nModel\n=====\n\n.. class:: Model([id[, \\**kwargs]])\n\nThe base class that every kind of :ref:`model <topics-models>` inherits.\n\nClass attributes are:\n\n.. attribute:: Model.__name__\n\n   The a unique name to reference the model throughout the platform.\n\n.. attribute:: Model.__access__\n\n   A set that contains the names of relation field for which the access rights\n   are also checked for this model.\n\n.. attribute:: Model.__rpc__\n\n   A dictionary with method name as key and an instance of\n   :class:`~trytond.rpc.RPC` as value.\n\n.. attribute:: Model._rec_name\n\n   The name of the field used as name of records.\n   The default value is ``name``.\n\n.. attribute:: Model.id\n\n   The definition of the :class:`~trytond.model.fields.Integer` field ``id`` of\n   records.\n\n.. attribute:: Model.__queue__\n\n   Return a queue caller for the model.\n   The called method will be pushed into the queue.\n\n.. attribute:: Model._fields\n\n   A dictionary with the field name as key and its\n   :class:`~fields.Field` instance as value.\n\n.. attribute:: Model._record\n\n   The record class to store internaly the values of the instances.\n\n.. attribute:: Model._defaults\n\n   A dictionary with the field name as key and its default method as value.\n\nClass methods:\n\n.. classmethod:: Model.__setup__()\n\n   Setup the class before adding into the :class:`~trytond.pool.Pool`.\n   See :meth:`trytond.pool.PoolBase.__setup__`.\n\n.. classmethod:: Model.__post_setup__()\n\n   Setup the class after added into the :class:`~trytond.pool.Pool`.\n   See :meth:`trytond.pool.PoolBase.__post_setup__`.\n\n.. classmethod:: Model.__register__(module_name)\n\n   Register the model in ``ir.model`` and ``ir.model.field``.\n   See :meth:`trytond.pool.PoolBase.__register__`.\n\n.. classmethod:: Model.default_get(fields_names[, with_rec_name])\n\n   Return a dictionary with the default values for each field in\n   ``fields_names``.\n   Default values are defined by the returned value of each instance method\n   with the pattern ``default_<field name>()``.\n\n   ``with_rec_name`` allow to add ``rec_name`` value for each many2one field.\n\n   The ``default_rec_name`` key in the context can be used to define the value\n   of the :attr:`~Model._rec_name` field.\n\n.. classmethod:: Model.fields_get([fields_names[, level]])\n\n   Return the definition of each field on the model.\n\n   ``level`` defines the number of relations to include in the relation field\n   definition.\n\n.. classmethod:: Model.__names__([field[, record]])\n\n   Return a dictionary with the name of the ``model``, the ``field`` and the\n   ``record`` and the ``value`` of the field.\n   It is a convenience-method used to format messages which should include\n   those names.\n\nInstance methods:\n\n.. method:: Model.on_change(fieldnames)\n\n   Return the list of changes by calling ``on_change`` method of each field.\n\n.. method:: Model.on_change_with(fieldnames)\n\n   Return the new values of all fields by calling ``on_change_with`` method of\n   each field.\n\n.. method:: Model.on_change_notify(fieldnames)\n\n    Returns a list of type and message couple to display on the client side.\n    Available types are ``info``, ``warning`` and ``error``.\n\n    .. note::\n      To be called by the client, this method must be decorated\n      by :meth:`~trytond.model.fields.depends` with the fields needed.\n\n.. method:: Model.pre_validate()\n\n   Validate the instance before being stored.\n   This method is called by the client to validate the instance.\n\nModelView\n=========\n\n.. class:: ModelView\n\nAdd the requirements to display the record in a view.\n\nClass attributes:\n\n.. attribute:: ModelView._buttons\n\n   A dictionary with button name as key and the states dictionary for the\n   button.\n   The keys are ``invisible``, ``readonly`` and ``icon`` which have a\n   :class:`~trytond.pyson.PYSON` statement as value and ``depends`` which has a\n   list of field names on which the states depend.\n   This is used as default attributes of the buttons for the views that show\n   them.\n\nStatic methods:\n\n.. staticmethod:: ModelView.button()\n\n   Decorate button's method to check group access and rule.\n\n.. staticmethod:: ModelView.button_action(action)\n\n   Same as :meth:`~ModelView.button` but return the id of the XML id action or\n   the action value updated by the returned value of the method.\n\n.. staticmethod:: ModelView.button_change([\\*fields[, methods]])\n\n   Same as :meth:`~ModelView.button` but for button that change values of the\n   fields on client side (similar to :ref:`on_change\n   <topics-fields_on_change>`).\n\n   ``methods`` can be used to duplicate the field names from other decorated\n   methods.\n   This is useful if the decorated method calls another method.\n\n   .. note::\n      Only on instance methods.\n\nClass methods:\n\n.. classmethod:: ModelView.fields_view_get([view_id[, view_type[, level]]])\n\n   Return a view definition used by the client.\n   The definition is::\n\n        {\n            'model': model name,\n            'type': view type,\n            'view_id': view id,\n            'arch': XML description,\n            'fields': {\n                field name: {\n                    ...\n                },\n            },\n            'field_childs': field for tree,\n        }\n\n.. classmethod:: ModelView.view_toolbar_get()\n\n   Returns the model specific actions and exports in a dictionary with keys:\n\n   ``print``\n      a list of available reports.\n   ``action``\n      a list of available actions.\n   ``relate``\n      a list of available relations.\n   ``exports``\n      a list of available exports.\n\n.. classmethod:: ModelView.view_attributes()\n\n   Returns a list of XPath, attribute, value and an optional depends list.\n   Each element from the XPath will get the attribute set with the JSON encoded\n   value.\n   If the depends list is set its fields are added to the view if the xpath\n   matches at least one element.\n\n   .. note::\n\n      The ``view_id`` is set to the\n      :attr:`~trytond.transaction.Transaction.context` when this method is\n      called.\n\n.. classmethod:: ModelView.parse_view(tree, type[, view_id[, field_children[, level[, view_depends]]]])\n\n   Return the sanitized XML and the corresponding fields definition.\n\n   .. note::\n\n      This method is public mainly to allow modification the existing XML of\n      the view by code.\n\nModelStorage\n============\n\n.. class:: ModelStorage\n\nAdd storage capability of record.\n\nClass attributes are:\n\n.. attribute:: ModelStorage.create_uid\n\n   The definition of the :class:`~fields.Many2One` field that points to the\n   user who created the record.\n\n.. attribute:: ModelStorage.create_date\n\n   The definition of the :class:`~fields.Timestamp` field that stores the\n   creation time of the record.\n\n.. attribute:: ModelStorage.write_uid\n\n   The definition of the :class:`~fields.Many2One` field that points to the\n   last user who modified the record.\n\n.. attribute:: ModelStorage.write_date\n\n   The definition of the :class:`~fields.Timestamp` field that stored the last\n   modification time of the record.\n\n.. attribute:: ModelStorage.rec_name\n\n   The name of the :class:`~fields.Field` used as record name.\n\nStatic methods:\n\n.. staticmethod:: ModelStorage.default_create_uid()\n\n    Return the default value for :attr:`create_uid`.\n\n.. staticmethod:: ModelStorage.default_create_date()\n\n    Return the default value for :attr:`create_date`.\n\nClass methods:\n\n.. classmethod:: ModelStorage.create(vlist)\n\n   Create records.\n\n   ``vlist`` is list of dictionaries with fields names as key and created\n   values as value and return the list of new instances.\n\n.. classmethod:: ModelStorage.trigger_create(records)\n\n   Trigger create actions.\n   It calls actions defined in ``ir.trigger`` with ``on_create`` set and\n   ``condition`` is true.\n\n.. classmethod:: ModelStorage.read(ids, fields_names)\n\n   Return a list of dictionary for the record ids.\n   The dictionary is composed of the fields as key and their values.\n\n   ``fields_names`` can contain dereferenced fields from related models.\n   Their values will be returned under the referencing field suffixed by a\n   ``.``.\n   The number of *dots* in the name is not limited.\n\n   The virtual fields ``_write`` and ``_delete`` can be used the read the\n   writeable and deleteable state of the records.\n   Regarding the ``_timestamp`` virtual fields it contains a timestamp that is\n   used in the context to make a soft lock preventing update collisions.\n\n   .. note::\n      The order of the returned list is not guaranteed.\n\n.. classmethod:: ModelStorage.index_get_field(name)\n\n   Return the index to order of the calls to field get.\n\n.. classmethod:: ModelStorage.write(records, values, [[records, values], ...])\n\n   Write ``values`` on the list of records.\n\n   ``values`` is a dictionary with fields names as key and writen values as\n   value.\n\n.. classmethod:: ModelStorage.trigger_write_get_eligibles(records)\n\n   Return eligible records for write actions by triggers.\n   This dictionary is to pass to :meth:`~ModelStorage.trigger_write`.\n\n.. classmethod:: ModelStorage.trigger_write(eligibles)\n\n   Trigger write actions.\n   It will call actions defined in ``ir.trigger`` with ``on_write`` set and\n   ``condition`` was false before :meth:`~ModelStorage.write` and true after.\n\n.. classmethod:: ModelStorage.index_set_field(name)\n\n   Return the index to order of the calls to field set.\n\n.. classmethod:: ModelStorage.delete(records)\n\n   Delete records.\n\n.. classmethod:: ModelStorage.trigger_delete(records)\n\n   Trigger delete actions.\n   It will call actions defined in ``ir.trigger`` with ``on_delete`` set and\n   ``condition`` is true.\n\n.. classmethod:: ModelStorage.copy(records[, default])\n\n   Duplicate the records.\n\n   ``default`` is a dictionary of default value per field name for the created\n   records.\n\n   The values of ``default`` may be also callable that take a dictionary\n   containing the fields and values of the record copied and return of the\n   value.\n\n   The keys of ``default`` may use the dotted notation for the\n   :class:`~fields.One2Many` to define the default to pass to its ``copy``\n   operation.\n\n   New records are returned following the input order.\n\n.. classmethod:: ModelStorage.search(domain[, offset[, limit[, order[, count]]]])\n\n   Return a list of records that match the :ref:`domain <topics-domain>`.\n\n   If ``offset`` or ``limit`` are set, the result starts at the offset and has\n   the length of the limit.\n\n   The ``order`` is a list of tuples defining the order of the result::\n\n      [ ('field name', 'ASC'), ('other field name', 'DESC'), ... ]\n\n   The first element of the tuple is a field name of the model and the second\n   is the sort ordering as ``ASC`` for ascending, ``DESC`` for descending or\n   empty for a default order.\n   This second element may contain ``NULLS FIRST`` or ``NULLS LAST`` to sort\n   null values before or after non-null values.\n   If neither is specified the default behavior of the backend is used.\n\n   In case the field used is a :class:`~fields.Many2One`, it is also possible\n   to use the dotted notation to sort on a specific field from the target\n   record.\n   Or for a :class:`~fields.Dict` field, the dotted notation is used to sort on\n   the key's value.\n\n   If ``count`` is set to ``True``, then the result is the number of records.\n   The count result is limited upto the value of ``limit`` if set.\n\n.. classmethod:: ModelStorage.search_count(domain[, offset[, limit]])\n\n   Return the number of records that match the :ref:`domain <topics-domain>`.\n\n   The result is limited upto the value of ``limit`` if set and reduced by offset.\n\n.. classmethod:: ModelStorage.search_read(domain[, offset[, limit[, order[, fields_names]]]])\n\n   Call :meth:`search` and :meth:`read` at once.\n\n   Useful for the client to reduce the number of calls.\n\n.. classmethod:: ModelStorage.search_rec_name(name, clause)\n\n   :attr:`~fields.Function.searcher` for the :class:`~fields.Function` field\n   :attr:`rec_name`.\n\n.. classmethod:: ModelStorage.search_global(cls, text)\n\n   Yield tuples (record, name, icon) for records matching text.\n\n   It is used for the global search.\n\n.. classmethod:: ModelStorage.count()\n\n   Return an estimation of the number of records stored.\n\n.. classmethod:: ModelStorage.browse(ids)\n\n   Return a list of record instance for the ``ids``.\n\n.. classmethod:: ModelStorage.export_data(records, fields_names[, header])\n\n   Return a list of list of values for each ``records``.\n\n   The list of values follows ``fields_names``.\n   The result includes the description of the fields if ``header`` is set.\n\n   Relational fields are defined with ``/`` at any depth.\n\n   Descriptor on fields are available by appending ``.`` and the name of the\n   method on the field that returns the descriptor.\n\n.. classmethod:: ModelStorage.export_data_domain(domain, fields_names[, offset[, limit[, order[, header]]]])\n\n   Call :meth:`search` and :meth:`export_data` together.\n\n   Useful for the client to reduce the number of calls and the data transfered.\n\n.. classmethod:: ModelStorage.import_data(fields_names, data)\n\n   Create or update records for all values in ``data``.\n\n   The field names of values must be defined in ``fields_names``.\n   It returns the number of imported records.\n\n.. classmethod:: ModelStorage.check_xml_record(records, values)\n\n   Verify if the records are originating from XML data.\n\n   It is used to prevent modification of data coming from XML files.\n\n   .. note::\n      This method must be overiden to change this behavior.\n\n.. classmethod:: ModelStorage.validate(records)\n\n   Validate the integrity of records after creation and modification.\n\n   This method must be overridden to add validation and must raise an\n   :exc:`~trytond.model.exceptions.ValidationError` if validation fails.\n\n\n.. classmethod:: ModelStorage.validate_fields(records, field_names)\n\n   Validate the integrity of records after modification of the fields. This\n   method must be overridden to add validation for the field names set and must\n   raise an exception if validation fails.\n\nDual methods:\n\n.. classmethod:: ModelStorage.save(records)\n\n   Save the modification made on the records.\n\nInstance methods:\n\n.. method:: ModelStorage.resources()\n\n   Return a dictionary with the number of attachments (``attachment_count``),\n   notes (``note_count``) and unread note (``note_unread``).\n\n.. method:: ModelStorage.get_rec_name(name)\n\n   :attr:`~fields.Function.getter` for the :class:`~fields.Function` field\n   :attr:`rec_name`.\n\nModelSQL\n========\n\n.. class:: ModelSQL\n\nImplement :class:`ModelStorage` for an SQL database.\n\nClass attributes are:\n\n.. attribute:: ModelSQL._table\n\n   The name of the database table which is mapped to the class.\n\n   If not set, the value of :attr:`~Model.__name__` is used with dots converted\n   to underscores.\n\n.. attribute:: ModelSQL._order\n\n   The default ``order`` parameter of :meth:`~ModelStorage.search` method.\n\n.. attribute:: ModelSQL._order_name\n\n   The name of the field on which the records must be sorted when sorting on a\n   field refering to the model.\n\n   If not set, :attr:`~Model._rec_name` is used.\n\n.. attribute:: ModelSQL._history\n\n   If true, all changes on records are stored in an history table.\n\n.. attribute:: ModelSQL._sql_constraints\n\n   A list of SQL constraints that are added on the table::\n\n      [ (<constraint name>, <constraint>, <xml id>), ... ]\n\n   constraint name\n      The name of the SQL constraint in the database.\n\n   constraint\n      An instance of :class:`Constraint`\n\n   xml id\n      The message id for :meth:`~trytond.i18n.gettext`\n\n.. attribute:: ModelSQL._sql_indexes\n\n   A :py:class:`set <set>` containing the :class:`Index` that are created on\n   the table.\n\nClass methods:\n\n.. classmethod:: ModelSQL.__table__()\n\n   Return a SQL Table instance for the Model.\n\n.. classmethod:: ModelSQL.__table_history__()\n\n   Return a SQL Table instance for the history of Model.\n\n.. classmethod:: ModelSQL.__table_handler__([module_name[, history]])\n\n   Return a :class:`~trytond.backend.TableHandler` instance for the Model.\n\n.. classmethod:: ModelSQL.table_query()\n\n   Could be defined to use a custom SQL query instead of a table of the\n   database.\n   It should return a SQL FromItem.\n\n   .. warning::\n      By default all CRUD operation raises an error on models implementing this\n      method so the :meth:`~ModelStorage.create`, :meth:`~ModelStorage.write`\n      and :meth:`~ModelStorage.delete` methods may also been overriden if\n      needed.\n\n.. classmethod:: ModelSQL.history_revisions(ids)\n\n   Return a sorted list of all revisions for ids.\n\n   The list is composed of the date, id and username of the revision.\n\n.. classmethod:: ModelSQL.restore_history(ids, datetime)\n\n   Restore the record ids from history at the specified date time.\n\n   Restoring a record still generates an entry in the history table.\n\n   .. warning::\n      No access rights are verified and the records are not validated.\n\n.. classmethod:: ModelSQL.restore_history_before(ids, datetime)\n\n   Restore the record ids from history before the specified date time.\n\n   Restoring a record still generates an entry in the history table.\n\n   .. warning::\n      No access rights are verified and the records are not validated.\n\n.. classmethod:: ModelSQL.search(domain[, offset[, limit[, order[, count[, query]]]]])\n\n   Same as :meth:`ModelStorage.search` with the additional ``query`` argument.\n\n   If ``query`` is set to ``True``, the the result is the SQL query.\n\n.. classmethod:: ModelSQL.search_domain(domain[, active_test[, tables]])\n\n   Convert a :ref:`domain <topics-domain>` into a SQL expression by returning\n   the updated tables dictionary and a SQL expression.\n\n   .. _ref-tables:\n\n   Where ``tables`` is a nested dictionary containing the existing joins::\n\n        {\n            None: (<Table invoice>, None),\n            'party': {\n                None: (<Table party>, <join_on sql expression>),\n                'addresses': {\n                    None: (<Table address>, <join_on sql expression>),\n                    },\n                },\n            }\n\nDual methods:\n\n.. classmethod:: ModelSQL.lock([records])\n\n   Take a lock for update on the records or take a lock on the whole table.\n\nConstraint\n----------\n\n.. class:: Constraint(table)\n\nRepresent a SQL constraint for the ``table``.\n\nInstance attributes:\n\n.. attribute:: Constraint.table\n\n   The SQL Table on which the constraint is defined.\n\nCheck\n^^^^^\n\n.. class:: Check(table, expression)\n\nRepresent a check :class:`Constraint` which enforce the validity of the\n``expression``.\n\nInstance attributes:\n\n.. attribute:: Check.expression\n\n   The SQL expression to check.\n\nUnique\n^^^^^^\n\n.. class:: Unique(table, \\*columns)\n\nRepresent a unique :class:`Constraint` which enforce the uniqueness of the\ngroup of columns.\n\nInstance attributes:\n\n.. attribute:: Unique.columns\n\n   The tuple of SQL Column instances.\n\n.. attribute:: Unique.operators\n\n   The tuple of ``Equal`` operators.\n\nExclude\n^^^^^^^\n\n.. class:: Exclude(table[, (expression, operator), ...[, where]])\n\nRepresent an exclude :class:`Constraint` which guarantees that if any two rows\nare compared on the specified expression using the specified operator not all\nof these comparisons will return ``TRUE``.\n\nInstance attributes:\n\n.. attribute:: Exclude.excludes\n\n   The tuple of expression and operator.\n\n.. attribute:: Exclude.columns\n\n   The tuple of expressions.\n\n.. attribute:: Exclude.operators\n\n   The tuple of operators.\n\n.. attribute:: Exclude.where\n\n   The clause for which the exclusion applies.\n\nIndex\n-----\n\n.. class:: Index(table[, \\*expressions, [, \\*\\*options]])\n\nRepresent a SQL index for the ``table`` for the sequence of ``expressions``.\nAn ``expression`` is a :py:class:`tuple <tuple>` of SQL expression and a\n:attr:`~Index.Usage`.\n\nAvailable options are:\n\n   * ``include``: a list of columns to include in the index\n   * ``where``: the where clause for partial index\n\n.. attribute:: Index.Unaccent(expression)\n\nApply unaccent function if the database supports it.\n\n.. attribute:: Index.Usage(\\*\\*options)\n\nRepresent a usage of a SQL expression.\nAvailable options are:\n\n   * ``collation``: the name of the collation\n   * ``order``: the sort order\n\n.. attribute:: Index.Equality(\\*\\*options)\n\nRepresent an equality usage.\n\n.. attribute:: Index.Range(\\*\\*options)\n\nRepresent an range usage.\n\n.. attribute:: Index.Similarity(\\*\\*options)\n\nRepresent a similar usage only for text.\nAdditional options are available:\n\n   * ``begin``: optimize for constant pattern and anchored to the beginning of\n     the string\n\nWorkflow\n========\n\n.. class:: Workflow\n\nA mixin_ to handle transition check.\n\nClass attribute:\n\n.. attribute:: Workflow._transition_state\n\n   The name of the field that will be used to check state transition.\n   The default value is 'state'.\n\n.. attribute:: Workflow._transitions\n\n   A set containing tuples of from and to state.\n\nStatic methods:\n\n.. staticmethod:: Workflow.transition(state)\n\n   Decorate method to filter records for which the transition is valid and\n   finally to update the state of the filtered record.\n\nModelSingleton\n==============\n\n.. class:: ModelSingleton\n\nModify :class:`ModelStorage` into a singleton_.\nThis means that there will be only one record of this model.\n\nIt is commonly used to store configuration value.\n\n.. _singleton: http://en.wikipedia.org/wiki/Singleton_pattern\n\nClass methods:\n\n.. classmethod:: ModelSingleton.get_singleton()\n\n   Return the instance of the unique record if there is one.\n\nDictSchemaMixin\n===============\n\n.. class:: DictSchemaMixin\n\nA mixin_ for the schema of :class:`~fields.Dict` field.\n\nClass attributes are:\n\n.. attribute:: DictSchemaMixin.name\n\n   A :class:`~fields.Char` field for the name of the key.\n\n.. attribute:: DictSchemaMixin.string\n\n   A :class:`~fields.Char` field for the string of the key.\n\n.. attribute:: DictSchemaMixin.help\n\n   The :class:`~fields.Char` field used as the help text for the key.\n\n.. attribute:: DictSchemaMixin.type\\_\n\n   The :class:`~fields.Selection` field for the type of the key.\n\n   The available types are:\n\n   * boolean\n   * integer\n   * char\n   * float\n   * numeric\n   * date\n   * datetime\n   * selection\n\n.. attribute:: DictSchemaMixin.digits\n\n   The :class:`~fields.Integer` field for the digits number when the type is\n   ``float`` or ``numeric``.\n\n.. attribute:: DictSchemaMixin.domain\n\n   A :ref:`domain <topics-domain>` constraint on the dictionary key that will\n   be enforced only on the client side.\n\n   The key must be referenced by its name in the left operator of the domain.\n   The :ref:`PYSON <ref-pyson>` evaluation context used to compute the domain\n   is the dictionary value.\n   Likewise the domain is tested using the dictionary value.\n\n.. attribute:: DictSchemaMixin.selection\n\n   The :class:`~fields.Text` field to store the couple of key and label when\n   the type is ``selection``.\n\n   The format is a key/label separated by \":\" per line.\n\n.. attribute:: DictSchemaMixin.selection_sorted\n\n   If the :attr:`selection` must be sorted on label by the client.\n\n.. attribute:: DictSchemaMixin.selection_json\n\n   The :class:`~fields.Function` field to return the JSON_ version of the\n   :attr:`selection`.\n\nStatic methods:\n\n.. staticmethod:: DictSchemaMixin.default_digits()\n\n   Return the default value for :attr:`digits`.\n\nClass methods:\n\n.. classmethod:: DictSchemaMixin.get_keys(records)\n\n   Return the definition of the keys for the records.\n\n.. classmethod:: DictSchemaMixin.get_relation_fields()\n\n   Return a dictionary with the field definition of all the keys like the\n   result of :meth:`Model.fields_get`.\n\n   It is possible to disable this method (returns an empty dictionary) by\n   setting in the ``dict`` section of the configuration, the\n   :attr:`Model.__name__` to ``False``.\n\nInstance methods:\n\n.. method:: DictSchemaMixin.get_selection_json(name)\n\n   :attr:`~fields.Function.getter` for the :attr:`selection_json`.\n\n.. method:: DictSchemaMixin.format(value[, lang])\n\n   Format the value using the key definition and the language.\n\nMatchMixin\n==========\n\n.. class:: MatchMixin\n\nA mixin_ to add to a :class:`Model` a match method on pattern.\nThe pattern is a dictionary with field name as key and the value to compare.\nThe record matches the pattern if for all dictionary entries, the value of the\nrecord is equal or not defined.\n\nInstance methods:\n\n.. method:: MatchMixin.match(pattern[, match_none])\n\n   Return if the instance match the pattern.\n\n   If ``match_none`` is set ``None`` value of the instance will be compared.\n\nUnionMixin\n==========\n\n.. class:: UnionMixin\n\nA mixin_ to create a :class:`ModelSQL` which is the UNION_ of some\n:class:`ModelSQL`'s. The ids of each models are sharded to be unique.\n\nStatic methods:\n\n.. staticmethod:: UnionMixin.union_models()\n\n   Return the list of :class:`ModelSQL`'s names\n\nClass methods:\n\n.. classmethod:: UnionMixin.union_shard(column, model)\n\n   Return a SQL expression that shards the column containing record id of model\n   name.\n\n.. classmethod:: UnionMixin.union_unshard(record_id)\n\n   Return the original instance of the record for the sharded id.\n\n.. classmethod:: UnionMixin.union_column(name, field, table, Model)\n\n   Return the SQL column that corresponds to the field on the union model.\n\n.. classmethod:: UnionMixin.union_columns(model)\n\n   Return the SQL table and columns to use for the UNION for the model name.\n\nSymbolMixin\n===========\n\n.. class:: SymbolMixin\n\nA mixin_ to manage the display of symbols on the client side.\n\nInstance methods:\n\n.. method:: SymbolMixin.get_symbol(sign, [symbol])\n\n   Return a symbol and its position.\n\n   The position indicates whether the symbol should appear before (0) or after\n   (1) the value.\n   If no symbol parameter is supplied then the mixin uses the value of\n   attribute named ``symbol``.\n\nDigitsMixin\n===========\n\n.. class:: DigitsMixin\n\nA mixin_ to manage the digits of :attr:`fields.Float.digits` and\n:attr:`fields.Numeric.digits` from a :class:`Model`.\n\nInstance methods:\n\n.. method:: DigitsMixin.get_digits()\n\n   Return a tuple of two integers to use a ``digits`` attribute.\n\nsequence_ordered\n================\n\n.. function:: sequence_ordered([field_name, [field_label, [order]]])\n\nReturn a mixin_ class which defines the order of a :class:`ModelSQL` with an\n:class:`~fields.Integer` field.\n\n``field_name`` indicates the name of the field to be created and its default\nvalues is ``sequence``.\n``field_label`` defines the label which will be used by the field and defaults\nto ``Sequence``.\nOrder specifies the order direction and defaults to ``ASC NULLS FIRST``.\n\nMultiValueMixin\n===============\n\n.. class:: MultiValueMixin\n\nA mixin_ for :class:`Model` to help having :class:`~fields.MultiValue` fields\nwith multi-values on a :class:`ValueMixin`.\nThe values are stored by creating one record per pattern.\nThe patterns are the same as those on :class:`MatchMixin`.\n\nClass methods:\n\n.. classmethod:: MultiValueMixin.multivalue_model(field)\n\n   Return the :class:`ValueMixin` on which the values are stored for the field\n   name.\n\n   The default is class name suffixed by the field name.\n\n.. classmethod:: MultiValueMixin.setter_multivalue(records, name, value, \\*\\*pattern)\n\n   :attr:`~fields.Function.getter` method for the\n   :class:`trytond.model.fields.Function` fields.\n\nInstance methods:\n\n.. method:: MultiValueMixin.multivalue_records(field)\n\n   Return the list of all :class:`ValueMixin` records linked to the instance.\n\n   By default, it returns the value of the first found\n   :class:`~fields.One2Many` linked to the multivalue model or all the records\n   of this one.\n\n.. method:: MultiValueMixin.multivalue_record(field, \\*\\*pattern)\n\n   Return a new record of :class:`ValueMixin` linked to the instance.\n\n.. method:: MultiValueMixin.get_multivalue(name, \\*\\*pattern)\n\n   Return the value of the field ``name`` for the pattern.\n\n.. method:: MultiValueMixin.set_multivalue(name, value[, save], \\*\\*pattern)\n\n   Store the value of the field ``name`` for the pattern.\n\n   If ``save`` is true, it will be stored in the database, otherwise the\n   modified :class:`ValueMixin` records are returned unsaved.\n   ``save`` is true by default.\n\n.. warning::\n    To customize the pattern, both methods must be override the same way.\n\nValueMixin\n==========\n\n.. class:: ValueMixin\n\nA mixin_ to store the values of :class:`MultiValueMixin`.\n\nDeactivableMixin\n================\n\n.. class:: DeactivableMixin\n\nA mixin_ to add soft deletion to the model.\nIt renders all the fields as read-only when the record is inactive.\n\nClass attributes are:\n\n.. attribute:: DictSchemaMixin.active\n\n   The definition of the :class:`trytond.model.fields.Boolean` field to store\n   soft deletion state.\n\n   False values is considered as soft deletion.\n\ntree\n====\n\n.. function:: tree([parent[, name[, separator]]])\n\nReturn a mixin_ class :class:`TreeMixin`.\n\n``parent`` indicates the name of the field that defines the parent of the tree\nand its default value is ``parent``.\n``name`` indicates the name of the field that defines the name of the record and\nits default value is ``name``.\nIf ``separator`` is set, the :meth:`~ModelStorage.get_rec_name` constructs the\nname by concatenating each parent names using it as separator and\n:meth:`~ModelStorage.search_rec_name` is adapted to search across the tree.\n\n\n.. class:: TreeMixin\n\n.. classmethod:: TreeMixin.check_recursion(records)\n\n   Helper method that checks if there is no recursion in the tree defined by\n   :meth:`tree`.\n\navatar_mixin\n============\n\n.. function:: avatar_mixin([size[, default]])\n\nReturn a mixin_ :class:`AvatarMixin`.\n\n``size`` defines the size of the avatar image and its default value is ``64``.\n``default`` indicates the name of the field to use for generating a default\navatar, if it's not set then no default avatar is generated.\n\n.. class:: AvatarMixin\n\n.. attribute::  AvatarMixin.avatars\n\n   The :class:`~fields.One2Many` field used to store the ``ir.avatar`` records.\n\n.. attribute:: AvatarMixin.avatar\n\n   The :class:`~fields.Binary` field that contains the avatar.\n\n.. attribute:: AvatarMixin.avatar_url\n\n   The :class:`~fields.Char` field that containts the URL for the avatar.\n\n.. attribute:: AvatarMixin.has_avatar\n\n   Indicate whether the record has an avatar.\n\n.. classmethod:: AvatarMixin.generate_avatar(records, field)\n\n   Generate a default avatar for each record using the field.\n\n\n.. _mixin: http://en.wikipedia.org/wiki/Mixin\n.. _JSON: http://en.wikipedia.org/wiki/Json\n.. _UNION: http://en.wikipedia.org/wiki/Union_(SQL)#UNION_operator\n\n\n"
  },
  {
    "path": "doc/ref/pool.rst",
    "content": ".. _ref-pool:\n.. module:: trytond.pool\n\nPool\n====\n\n.. class:: Pool([database_name])\n\n   Store the instances of :class:`~trytond.model.Model`,\n   :class:`~trytond.wizard.Wizard` and *Report* per database.\n\nStatic methods:\n\n.. staticmethod:: Pool.register(klass, ..., type_, module[, depends])\n\n   Register the classes of type (``model``, ``report`` or ``wizard``) for the\n   module.\n\n   If ``depends`` is set, the registration happens only if all the modules are\n   activated.\n\n.. staticmethod:: Pool.register_mixin(mixin, classinfo, module)\n\n   Register the mixin for the module.\n\n   The ``mixin`` are included to all subclasses of ``classinfo``.\n\nClass methods:\n\n.. classmethod:: Pool.start()\n\n   Start the pool by registering all Tryton modules found.\n\n.. classmethod:: Pool.stop(database_name)\n\n   Stop the pool by removing instances for the database.\n\n.. classmethod:: Pool.database_list()\n\n   List all started databases.\n\nInstance methods:\n\n.. method:: Pool.get(name[, type])\n\n   Return the named object of ``type`` from the pool.\n\n.. method:: Pool.iterobject([type])\n\n   Return an interator over objects of ``type``.\n\n.. method:: Pool.fill(module, modules)\n\n   Fill the pool with the registered classes from the module and for the\n   activated modules and return a list of classes for each type in a\n   dictionary.\n\n.. method:: Pool.setup([classes])\n\n   Call all setup methods of the classes provided or for all the registered\n   classes.\n\n.. method:: Pool.setup_mixin([type[, name]])\n\n   Include all the mixin registered for the filled modules to the corresponding\n   registered type of classes or named.\n\n\nPoolMeta\n--------\n\n.. class:: PoolMeta\n\n   A metaclass helper to setup __name__ on class to be registered in the\n   :class:`Pool`.\n\n\nPoolBase\n--------\n\n.. class:: PoolBase\n\n   The base class of registered classes.\n\nClass methods:\n\n.. classmethod:: PoolBase.__setup__()\n\n   Setup the class.\n\n.. classmethod:: PoolBase.__post_setup__()\n\n   Post setup the class.\n\n.. classmethod:: PoolBase.__register__()\n\n   Registare the class.\n"
  },
  {
    "path": "doc/ref/pyson.rst",
    "content": ".. _ref-pyson:\n.. module:: trytond.pyson\n\nPYSON\n=====\n\nPYSON is the Python Statement and Object Notation.\n\nThere is also a more :ref:`practical introduction into\nPYSON statements <topics-pyson>`.\n\n.. class:: PYSON\n\n   Base class of any PYSON statement.\n   It is never used directly.\n\nInstance methods:\n\n.. method:: PYSON.pyson()\n\n   Return the internal dictionary representation of the statement.\n\n.. method:: PYSON.types()\n\n   Return a set of all possible types which the statement can become when\n   evaluated.\n\nClass methods:\n\n.. classmethod:: PYSON.eval(dct, context)\n\n   Return the evaluation of the statement given in ``dct`` within the\n   ``context``.\n\n   ``dct`` contains a dictionary which is the internal representation of a\n   PYSON statement.\n\n   ``context`` contains a dictionary with contextual values.\n\n\nEncoder and Decoder\n-------------------\n\n.. class:: PYSONEncoder()\n\n   Encoder for PYSON statements into string representations.\n\nInstance methods:\n\n.. method:: PYSONEncoder.encode(object)\n\n   Return a string representation of a given PYSON statement.\n\n   ``object`` contains a PYSON statement.\n\n\n.. class:: PYSONDecoder([context[, noeval]])\n\n   Decoder for string into the evaluated or not PYSON statement.\n\nInstance methods:\n\n.. method:: PYSONDecoder.decode(object)\n\n   Return a PYSON statement evaluated or not of a given string.\n\n   ``object`` contains a string.\n\nStatements\n----------\n\nThe following classes can be used as :class:`PYSON` statement:\n\n.. contents::\n   :local:\n   :backlinks: entry\n   :depth: 1\n\nEval\n^^^^\n\n.. class:: Eval(value[, default])\n\n   Represent the PYSON statement for evaluations.\n\n   When evaluated, it returns the value of the statement named by ``value``, if\n   defined in the evaluation context, otherwise the ``default`` value (empty\n   string by default).\n\n   .. note::\n\n      The default value determines the type of the statement.\n\n   .. note::\n\n      If the ``value`` includes dots the value will be dereferenced.\n      For example::\n\n         Eval('_parent_sale.number')\n\n      The ``number`` value of the ``_parent_sale`` key of the evaluation\n      context will be returned.\n\n\nNot\n^^^\n\n.. class:: Not(value)\n\n   Represent the PYSON statement for logical negations.\n\n   When evaluated, returns the boolean negation of the value of the statement\n   named by ``value``, if defined in the evaluation context.\n   Returns an instance of itself.\n\nBool\n^^^^\n\n.. class:: Bool(value)\n\n   Represent the PYSON statement for boolean evaluations.\n\n   Returns the boolean representation of the value of the statement named by\n   ``value``.\n\nAnd\n^^^\n\n.. class:: And(\\*statements)\n\n   Represent the PYSON statement for logical *and* operations.\n\n   Returns the result of the logical conjunction of two or more values named by\n   the statements in the ``statements`` tuple.\n\nOr\n^^\n\n.. class:: Or(\\*statements)\n\n   Represent the PYSON statement for logical *or* operations.\n\n   Returns the result of the logical disjunction of two or more values named by\n   the statements in the ``statements`` tuple.\n\nEqual\n^^^^^\n\n.. class:: Equal(statement1, statement2)\n\n   Represent the PYSON statement for equation comparisons.\n\n   Returns ``True`` when a value of a statement named by ``statement1`` and the\n   value of a statement named by ``statement2`` are equal, otherwise returns\n   ``False``.\n\nGreater\n^^^^^^^\n\n.. class:: Greater(statement1, statement2[, equal])\n\n   Represent the PYSON statement for *greater-than* comparisons.\n\n   Returns ``True`` when the value of the statement named by ``statement1`` is\n   strictly greater than the value of the statement named by ``statement2``,\n   otherwise returns false.\n   Is the value of the variable named by ``equal`` is ``True``, then returns\n   also ``True`` when both values of statements named by ``statement1`` and\n   ``statement2`` are equal.\n   In this case :class:`Greater` works as a *greater-than or equal* operator.\n\n   .. note::\n\n      ``None`` value is replaced by ``0`` for the comparison.\n\nLess\n^^^^\n\n.. class:: Less(statement1, statement2[, equal])\n\n   Represent the PYSON statement for *less-than* comparisons.\n\n   Returns ``True`` when the value of the statement named by ``statement1`` is\n   strictly less than the value of the statement named by ``statement2``,\n   otherwise returns ``False``.\n   Is the value of the variable named ``equal`` is true, then returns also true\n   when both values of the statements named by ``statement1`` and\n   ``statement2`` are equal.\n   In this case :class:`Less`  works as a *less-than or equal* operator.\n\n   .. note::\n\n      ``None`` value is replaced by ``0`` for the comparison.\n\nIf\n^^\n\n.. class:: If(condition, then_statement, else_statement)\n\n   Represent the PYSON statement for conditional flow control operations.\n\n   Returns the value of the statement named by ``then_statement`` when the\n   value of the statement named by ``condition`` evaluates true.\n   Otherwise returns the value of the statement named by ``else_statement``.\n\nGet\n^^^\n\n.. class:: Get(obj, key[, default])\n\n   Represent the PYSON statement for dictionary look-up operations and\n   evaluation.\n\n   Look up and returns the value of a key named by ``key`` in an object named\n   by ``obj`` if defined.\n   Otherwise returns the value of the variable named by ``default``.\n\nIn\n^^\n\n.. class:: In(key, obj)\n\n   Represent the PYSON statement for look-up dictionary or integer objects.\n\n   Returns true when a list (or dictionary) object named by ``obj`` contains\n   the value of the variable (or key) named by ``key``.\n   Otherwise returns false.\n\nDate\n^^^^\n\n.. class:: Date([year[, month[, day[, delta_years[, delta_month[, delta_days[, start]]]]]]])\n\n   Represent the PYSON statement for date related conversions and basic\n   calculations.\n\n   Returns a date object which represents the values of arguments named by the\n   *variables* explained below.\n   Missing values of arguments named by ``year`` or ``month`` or ``day`` take\n   their defaults from ``start`` or the actual date. When values of arguments\n   named by ``delta_*`` are given, they are added to the values of the\n   appropriate arguments in a date and time preserving manner.\n\n   Arguments:\n\n   ``year``\n      A PYSON statement of type int or long.\n\n   ``month``\n      A PYSON statement of type int or long.\n\n   ``day``\n      A PYSON statement of type int or long.\n\n   ``delta_years``\n      A PYSON statement of type int or long.\n\n   ``delta_month``\n      A PYSON statement of type int or long.\n\n   ``delta_days``\n      A PYSON statement of type int or long.\n\n   ``start``\n      A PYSON statement of type date.\n\nDateTime\n^^^^^^^^\n\n.. class:: DateTime([year[, month[, day[, hour[, minute[, second[, microsecond[, delta_years[, delta_months[, delta_days[, delta_hours[, delta_minutes[, delta_seconds[, delta_microseconds[, start]]]]]]]]]]]]]]])\n\n   Represent the PYSON statement for date and time related conversions and\n   calculations.\n\n   Returns a date time object which represents the values of variables named by\n   the *arguments* explained below.\n   Missing values of arguments named by  ``year``, ``month``, ``day``,\n   ``hour``, ``minute``, ``second``, ``microseconds`` take their defaults from\n   ``start`` or the actual date and time in `UTC`_.\n   When values of arguments named by ``delta_*`` are given, these are added  to\n   the appropriate attributes in a date and time preserving manner.\n\n   Arguments:\n\n   ``year``\n       A PYSON statement of type int or long.\n\n   ``month``\n       A PYSON statement of type int or long.\n\n   ``day``\n       A PYSON statement of type int or long.\n\n   ``hour``\n       A PYSON statement of type int or long.\n\n   ``minute``\n       A PYSON statement of type int or long.\n\n   ``second``\n       A PYSON statement of type int or long.\n\n   ``microsecond``\n       A PYSON statement of type int or long.\n\n   ``delta_years``\n       A PYSON statement of type int or long.\n\n   ``delta_month``\n       A PYSON statement of type int or long.\n\n   ``delta_days``\n       A PYSON statement of type int or long.\n\n   ``delta_hours``\n       A PYSON statement of type int or long.\n\n   ``delta_minutes``\n       A PYSON statement of type int or long.\n\n   ``delta_seconds``\n       A PYSON statement of type int or long.\n\n   ``delta_microseconds``\n       A PYSON statement of type int or long.\n\n   ``start``\n       A PYSON statement of type datetime.\n\n.. _`UTC`: https://en.wikipedia.org/wiki/Coordinated_Universal_Time\n\nLen\n^^^\n\n.. class:: Len(value)\n\n   Represent the PYSON statement for length of a dictionary, list or string.\n\n   Returns the number of items in ``value``.\n\nId\n^^\n\n.. class:: Id(module, fs_id)\n\n   Represent the PYSON statement for filesystem id evaluations.\n\n   When converted into the internal dictionary, it returns the database id\n   stored in ``ir.model.data``.\n"
  },
  {
    "path": "doc/ref/rpc.rst",
    "content": ".. _ref-rpc:\n.. module:: trytond.rpc\n\nRPC\n===\n\n.. class:: RPC([readonly[, instantiate[, result[, check_access[, unique[, fresh_session[, cache]]]]]]])\n\n   Define the behavior of Remote Procedure Call.\n\nInstance attributes are:\n\n.. attribute:: RPC.readonly\n\n   The transaction mode\n\n.. attribute:: RPC.instantiate\n\n   The position or the slice of the argument to be instanciated\n\n.. attribute:: RPC.result\n\n   The function to transform the result\n\n.. attribute:: RPC.check_access\n\n   Set ``_check_access`` in the context to activate the access right on model\n   and field.\n   Default is ``True``.\n\n.. attribute:: RPC.unique\n\n   If set, it ensures the instantiated records are unique.\n   Default is ``True``.\n\n.. attribute:: RPC.fresh_session\n\n   If set, it requires a fresh session.\n   Default is ``False``.\n\n.. attribute:: RPC.cache\n\n   A :class:`RPCCache` instance to compute the cache duration for the answer.\n\n\nRPCCache\n--------\n\n.. class:: RPCCache([days[, seconds])\n\n   Define cache duration of RPC result.\n\nInstance attributes are:\n\n.. attribute:: RPC.duration\n\n   A :py:class:`datetime.timedelta` instance.\n\nInstance methods are:\n\n.. method:: RCP.headers\n\n   Return a dictionary of the headers.\n"
  },
  {
    "path": "doc/ref/sendmail.rst",
    "content": ".. _ref-sendmail:\n.. module:: trytond.sendmail\n\nSendmail\n========\n\n.. function:: sendmail_transactional(from_addr, to_addrs, msg[, transaction[, datamanager[, strict]]])\n\n   Send email message only if the current transaction is successfully committed.\n\n   The required arguments are an :rfc:`5322` from-address string, a list of\n   :rfc:`5322` to-address strings (a bare string is treated as a list with 1\n   address), and an email message.\n   The caller may pass a :class:`~trytond.transaction.Transaction` instance to\n   join otherwise the current one is joined.\n   A specific data manager can be specified otherwise the default\n   :class:`SMTPDataManager` is used for sending email.\n   The strict value is passed to instantiate the default :class:`SMTPDataManager`.\n\n   .. warning::\n\n      An SMTP failure is only logged without raising any exception.\n\n.. function:: sendmail(from_addr, to_addrs, msg[, server[, strict]])\n\n   Send email message like :meth:`sendmail_transactional` but directly without\n   caring about the transaction and return the ``server``.\n\n   The caller may pass a server instance from `smtplib`_.\n   It may return a new server instance if a reconnection was needed and if the\n   instance comes from :meth:`get_smtp_server`.\n   If strict is ``True``, an exception is raised if it is not possible to\n   connect to the server.\n\n.. function:: get_smtp_server([uri[, strict]])\n\n   Return a SMTP instance from `smtplib`_ using the ``uri`` or the one defined\n   in the ``email`` section of the :ref:`configuration <topics-configuration>`.\n   If strict is ``True``, an exception is raised if it is not possible to\n   connect to the server.\n\n\n.. class:: SMTPDataManager([uri[, strict]])\n\n   Implement a data manager which send queued email at commit.\n\n   An option optional ``uri`` can be passed to configure the SMTP connection.\n   If strict is ``True``, the data manager prevents the transaction if it fails\n   to send the emails.\n\n.. method:: SMTPDataManager.put(from_addr, to_addrs, msg)\n\n   Queue the email message to send.\n\n.. _`smtplib`: https://docs.python.org/2/library/smtplib.html\n"
  },
  {
    "path": "doc/ref/tests.rst",
    "content": ".. _ref-test:\n.. module:: trytond.tests.test_tryton\n\nTests\n=====\n\n.. attribute:: DB_NAME\n\n   The name of the database to use for testing.\n   Its value is taken from the environment variable of the same name.\n\n.. attribute:: USER\n\n   The user id used to test the transactions\n\n.. attribute:: CONTEXT\n\n   The context used to test the transactions\n\n.. function:: activate_module(name)\n\n   Activate the named module for the tested database.\n\n   In case database does not exist and the ``DB_CACHE`` environment variable is\n   set then Tryton restores a backup found in the directory pointed by\n   ``DB_CACHE``.\n   Otherwise it procees to the creation of the database and the activation of\n   the module.\n\nModuleTestCase\n--------------\n\n.. class:: ModuleTestCase()\n\n   A subclass of `unittest.TestCase`_ that tests a Tryton module.\n   Some tests are included to ensure that the module works properly.\n\n   It creates a temporary database with the module activated in setUpClass_ and\n   drops it in the tearDownClass_ method.\n\n.. attribute:: ModuleTestCase.module\n\n   Name of the tested module.\n\n.. _`unittest.TestCase`: https://docs.python.org/library/unittest.html#test-cases\n.. _setUpClass: https://docs.python.org/library/unittest.html#unittest.TestCase.setUpClass\n.. _tearDownClass: https://docs.python.org/library/unittest.html#unittest.TestCase.tearDownClass\n\nHelpers\n-------\n\n.. function:: with_transaction(user=1, context=None)\n\n   Return a decorator to run a test case inside a\n   :class:`~trytond.transaction.Transaction`.\n   It is rolled back and the cache cleared at the end of the test.\n\ndoctest helpers\n---------------\n\n.. function:: doctest_setup\n\n   Prepare the run of the `doctest`_ by creating a database and dropping it\n   beforehand if necessary.\n   This function should be used as the ``setUp`` parameter.\n\n   .. deprecated:: 4.2\n\n      The ``doctest_setup`` function should not be used anymore to set up\n      :py:func:`~doctest.DocFileSuite`.\n      New modules should use :func:`~trytond.tests.tools.activate_modules`\n      instead.\n\n.. function:: doctest_teardown()\n\n   Clean up after the run of the doctest_ by dropping the database.\n   It should be used as ``tearDown`` parameter when creating a\n   ``DocFileSuite``.\n\n.. attribute:: doctest_checker\n\n   A specialized doctest checker to ensure the Python compatibility.\n\n\n.. function:: load_doc_tests(name, path, loader, tests, pattern)\n\n   An helper that follows the ``load_tests`` protocol to load as\n   :py:class:`~doctest.DocTest` all ``*.rst`` files in ``directory``,\n   with the module ``name`` and the ``path`` to the module file from which the\n   doc tests are registered.\n\n.. function:: suite()\n\n   A function returning a subclass of ``unittest.TestSuite`` that drops the\n   database if it does not exist prior to the run of the tests.\n\n.. _doctest: https://docs.python.org/library/doctest.html\n\n.. module:: trytond.tests.tools\n\nTools\n-----\n\n.. function:: activate_modules(modules)\n\n   Activate a list of ``modules`` for scenario based on proteus doctests.\n\n.. function:: set_user(user, config)\n\n   Set the user of the ``config`` proteus connection to ``user``.\n"
  },
  {
    "path": "doc/ref/tools/email.rst",
    "content": ".. _ref-tools-email_:\n.. module:: trytond.tools.email_\n\nEmail\n=====\n\n.. function:: set_from_header(message, sender, from\\_)\n\n   Fill email headers to appear at best from the address.\n"
  },
  {
    "path": "doc/ref/tools/immutabledict.rst",
    "content": ".. _ref-immutabledict:\n.. module:: trytond.tools.immutabledict\n\nImmutableDict\n=============\n\n.. class:: ImmutableDict\n\n   Implement an immutable dictionary.\n"
  },
  {
    "path": "doc/ref/tools/index.rst",
    "content": ".. _ref-tools-index:\n\n=====\nTools\n=====\n\nTools API reference.\n\n.. toctree::\n    :maxdepth: 1\n\n    misc\n    email\n    singleton\n    immutabledict\n    timezone\n"
  },
  {
    "path": "doc/ref/tools/misc.rst",
    "content": ".. _ref-tools:\n.. module:: trytond.tools\n\nMiscellaneous\n=============\n\n.. function:: file_open(name[, mode[, subdir[, encoding]]])\n\n   Open the named file in subdir from the root directory.\n\n.. function:: find_path(name[, subdir])\n\n   Return the path of the named file in subdir from root directory.\n\n.. function:: find_dir(name[, subdir])\n\n   Return the path of the named directory in subdir from root directory.\n\n.. function:: resolve(name)\n\n   Resolve a dotted name to a global object.\n\n.. function:: unescape_wildcard(string[, wildcards[, escape]])\n\n   Return the string without the wild card escapes.\n\n.. function:: is_full_text(value[, escape])\n\n   Determine if the value can be used as full text search.\n\n   This is the case when the value starts and ends with a ``%`` or does not\n   contain any wild cards.\n\n.. function:: sql_pairing(x, y)\n\n   Return an SQL expression that pairs SQL integers x and y.\n\n.. function:: firstline(text)\n\n   Return first non-empty line of a text field.\n\n.. function:: remove_forbidden_chars(value)\n\n   Return a copy of the string with forbidden char from\n   :class:`~trytond.model.fields.Char` replaced by space.\n"
  },
  {
    "path": "doc/ref/tools/singleton.rst",
    "content": ".. _ref-tools-singleton:\n.. module:: trytond.tools.singleton\n\nSingleton\n=========\n\n.. class:: Singleton\n\n   A metaclass to create a `singleton`_ object.\n\n.. _`singleton`: http://en.wikipedia.org/wiki/Singleton_pattern\n"
  },
  {
    "path": "doc/ref/tools/timezone.rst",
    "content": ".. _ref-tools-timezone:\n.. module:: trytond.tools.timezone\n\ntimezone\n========\n\n.. function:: get_tzinfo(zoneid)\n\n   Get a class representing a IANA time zone specified by the string ``zoneid``.\n\n.. function:: available_timezones()\n\n   Return a set of all the valid IANA keys available.\n\n.. attribute:: UTC\n\n   The UTC :py:class:`datetime.tzinfo` instance.\n\n.. attribute:: SERVER\n\n   The server timezone :py:class:`datetime.tzinfo` instance.\n\n   Tryton tests the environment variables ``TRYTOND_TZ`` and ``TZ`` in this\n   order to select to IANA key to use.\n   If they are both empty, it defaults to ``UTC``.\n"
  },
  {
    "path": "doc/ref/transaction.rst",
    "content": ".. _ref-transaction:\n.. module:: trytond.transaction\n\nTransaction\n===========\n\n.. class:: Transaction\n\n   Represents a Tryton transaction that contains thread-local parameters of a\n   database connection.\n   The Transaction instances are `context manager`_ that commits or\n   rollbacks the database transaction.\n   In the event of an exception the transaction is rolled back, otherwise it is\n   commited.\n\n.. attribute:: Transaction.database\n\n   The database.\n\n.. attribute:: Transaction.readonly\n\n.. attribute:: Transaction.connection\n\n   The database connection as defined by the `PEP-0249`_.\n\n.. attribute:: Transaction.user\n\n   The id of the user.\n\n.. attribute:: Transaction.context\n\n.. attribute:: Transaction.create_records\n\n.. attribute:: Transaction.delete_records\n\n.. attribute:: Transaction.trigger_records\n\n.. attribute:: Transaction.check_warnings\n\n    The set of warnings already checked.\n\n.. attribute:: Transaction.timestamp\n\n.. attribute:: Transaction.started_at\n\n   The monotonic timestamp when the transaction started.\n\n.. attribute:: Transaction.language\n\n   The language code defines in the context.\n\n.. attribute:: Transaction.counter\n\n   Count the number of modification made in this transaction.\n\n.. staticmethod:: Transaction.monotonic_time\n\n   Return a monotonic time used to populate :attr:~Transaction.started_at.\n\n.. method:: Transaction.start(database_name, user[, readonly[, context[, close[, autocommit]]]])\n\n   Start a new transaction and return a `context manager`_.\n   The non-readonly transaction will be committed when exiting the ``with``\n   statement without exception.\n   The other cases will be rollbacked.\n\n.. method:: Transaction.stop([commit])\n\n   Stop the transaction.\n   If commit is ``True``, the transaction will be committed otherwise it will\n   be rollbacked.\n   The `context manager`_ returned by :meth:`~Transaction.start` should be used\n   instead of calling this method.\n\n.. method:: Transaction.set_context(context, \\**kwargs)\n\n   Update the transaction context and return a `context manager`_.\n   The context is restored when exiting the ``with`` statement.\n\n.. method:: Transaction.reset_context()\n\n   Clear the transaction context and return a `context manager`_.\n   The context is restored when exiting the ``with`` statement.\n\n.. method:: Transaction.set_user(user[, set_context])\n\n   Modify the user of the transaction and return a `context manager`_.\n   ``set_context`` will put the previous user id in the context to simulate the\n   record rules.\n   The user will be restored when exiting the ``with`` statement.\n\n.. method:: Transaction.set_current_transaction(transaction)\n\n   Add a specific ``transaction`` on the top of the transaction stack.\n   A transaction is commited or rollbacked only when its last reference is\n   popped from the stack.\n\n.. method:: Transaction.new_transaction([autocommit[, readonly]])\n\n   Create a new transaction with the same database, user and context as the\n   original transaction and adds it to the stack of transactions.\n\n.. method:: Transaction.commit()\n\n   Commit the transaction and all data managers associated.\n\n.. method:: Transaction.rollback()\n\n   Rollback the transaction and all data managers associated.\n\n.. method:: Transaction.join(datamanager)\n\n   Register in the transaction a data manager conforming to the `Two-Phase\n   Commit protocol`_.\n\n   This method returns the registered datamanager.\n   It could be a different yet equivalent (in term of python equality)\n   datamanager than the one passed to the method.\n\n.. method:: Transaction.atexit(func, \\*args, \\*\\*kwargs)\n\n   Register a function to be executed upon normal transaction termination.\n   The function can not use the current transaction because it will be already\n   committed or rollbacked.\n\n.. _`context manager`: http://docs.python.org/reference/datamodel.html#context-managers\n.. _`PEP-0249`: https://www.python.org/dev/peps/pep-0249/\n.. _`Two-Phase Commit protocol`: https://en.wikipedia.org/wiki/Two-phase_commit_protocol\n"
  },
  {
    "path": "doc/ref/wizard.rst",
    "content": ".. _ref-wizard:\n.. module:: trytond.wizard\n\n\nWizard\n======\n\nA wizard is a `finite state machine`_.\n\nThere is also a more :ref:`practical introduction into wizards\n<topics-wizard>`.\n\n.. _`finite state machine`: http://en.wikipedia.org/wiki/Finite-state_machine\n\n.. class:: Wizard(session_id)\n\n   This is the base for any wizard.\n   It contains the engine for the finite state machine.\n   A wizard must have some :class:`State` instance attributes that the engine\n   uses.\n\nClass attributes are:\n\n.. attribute:: Wizard.__name__\n\n   The unique name to reference the wizard throughout the platform.\n\n.. attribute:: Wizard.start_state\n\n   The name of the starting state.\n\n.. attribute:: Wizard.end_state\n\n   The name of the ending state.\n\n   If an instance method with this name exists on the wizard, it is called on\n   deletion of the wizard and it may return one of the :ref:`client side action\n   keywords <topics-views-client-actions>`.\n\n.. attribute:: Wizard.__rpc__\n\n   Same as :attr:`trytond.model.Model.__rpc__`.\n\n.. attribute:: Wizard.states\n\n   A dictionary with state name as key and :class:`State` as value.\n\n.. attribute:: model\n\n   The :class:`~trytond.model.Model` class on which the wizard is executed.\n\n.. attribute:: record\n\n   The :class:`~trytond.model.Model` instance on which the wizard is executed.\n\n.. attribute:: records\n\n   The list of :class:`~trytond.model.Model` instances on which the wizard is\n   executed.\n\nClass methods are:\n\n.. classmethod:: Wizard.__setup__()\n\n   Setup the class before adding into the :class:`~trytond.pool.Pool`.\n\n.. classmethod:: Wizard.__post_setup__()\n\n   Setup the class after added into the :class:`~trytond.pool.Pool`.\n\n.. classmethod:: Wizard.__register__(module_name)\n\n   Register the wizard.\n\n.. classmethod:: Wizard.create()\n\n   Create a session for the wizard and returns a tuple containing the session\n   id, the starting and ending state.\n\n.. classmethod:: Wizard.delete(session_id)\n\n   Delete the session.\n\n.. classmethod:: Wizard.execute(session_id, data, state_name)\n\n   Execute the wizard for the state.\n\n   ``session_id`` is a session id.\n\n   ``data`` is a dictionary with the session data to update.\n\n   ``active_id``, ``active_ids``, ``active_model`` and ``action_id`` must be\n   set in the context according to the records on which the wizard is run.\n\n\nState\n-----\n\n.. class:: State()\n\n   The base for any wizard state.\n\nInstance attributes are:\n\n.. attribute:: State.name\n\n   The name of the state.\n\n\nStateView\n---------\n\n.. class:: StateView(model_name, view, buttons)\n\n   A :class:`StateView` is a state that will display a form in the client.\n\n   The form is defined by the :class:`~trytond.model.ModelView` with the name\n   ``model_name``, the ``XML`` id in ``view`` and the ``buttons``.\n   The default values of the view can be set with a method on wizard having the\n   same name as the state but starting with ``default_``.\n   The values of the view can be also set with a method on wizard having the\n   same name as the state but starting with ``value_``.\n\n   .. note::\n      The difference between default values and values is that the client calls\n      :meth:`~trytond.model.Model.on_change` and\n      :meth:`~trytond.model.Model.on_change_with` for the default values.\n\nInstance attributes are:\n\n.. attribute:: StateView.model_name\n\n   The name of the :class:`~trytond.model.ModelView`.\n\n.. attribute:: StateView.view\n\n   The XML id of the form view.\n\n.. attribute:: StateView.buttons\n\n   The list of :class:`Button` instances to display on the form.\n\nInstance methods are:\n\n.. method:: StateView.get_view(wizard, state_name)\n\n   Return the view definition like\n   :meth:`~trytond.model.ModelView.fields_view_get`.\n\n   ``wizard`` is a :class:`Wizard` instance.\n\n   ``state_name`` is the name of the :class:`StateView` instance.\n\n.. method:: StateView.get_defaults(wizard, state_name, fields)\n\n   Return default values for the fields.\n\n   ``wizard`` is a :class:`Wizard` instance.\n\n   ``state_name`` is the name of the :class:`State`.\n\n   ``fields`` is the list of field names.\n\n.. method:: StateView.get_values(wizard, state_name, fields)\n\n   Return values for the fields.\n\n   ``wizard`` is a :class:`Wizard` instance.\n\n   ``state_name`` is the name of the :class:`State`.\n\n   ``fields`` is the list of field names.\n\n.. method:: StateView.get_buttons(wizard, state_name)\n\n   Return button definitions of the wizard.\n\n   ``wizard`` is a :class:`Wizard` instance.\n\n   ``state_name`` is the name of the :class:`StateView` instance.\n\n\nStateTransition\n---------------\n\n.. class:: StateTransition()\n\n   A :class:`StateTransition` brings the wizard to the ``state`` returned by\n   the method having the same name as the state but starting with\n   ``transition_``.\n\n\nStateAction\n-----------\n\n.. class:: StateAction(action_id)\n\n   A :class:`StateTransition` which let the client launch an ``ir.action``.\n\n   This action definition can be customized with a method on wizard having the\n   same name as the state but starting with ``do_``.\n\nInstance attributes are:\n\n.. attribute:: StateAction.action_id\n\n   The XML id of the ``ir.action``.\n\nInstance methods are:\n\n.. method:: StateAction.get_action()\n\n   Return the ``ir.action`` definition.\n\n\nStateReport\n-----------\n\n.. class:: StateReport(report_name)\n\n   A :class:`StateAction` which find the report action by name instead of XML\n   id.\n\n\nButton\n------\n\n.. class:: Button(string, state[, icon[, default[, validate]]])\n\n    Define of a wizard button.\n\nInstance attributes are:\n\n.. attribute:: Button.string\n\n   The label display on the button.\n\n.. attribute:: Button.state\n\n   The next state to reach if button is clicked.\n\n.. attribute:: Button.icon\n\n   The name of the icon to display on the button.\n\n.. attribute:: Button.default\n\n   A boolean to set it as default on the form.\n\n.. attribute:: Button.validate\n\n   A boolean or None.\n\n   If ``True``, validation of the form will occur, if ``False`` it won't.\n   If the value is ``None`` the validation will occur only if the state of the\n   button is not the wizard ending state.\n"
  },
  {
    "path": "doc/releases.rst",
    "content": ".. _releases-index:\n\n=============\nRelease notes\n=============\n\n.. include:: ../CHANGELOG\n"
  },
  {
    "path": "doc/topics/access_rights.rst",
    "content": ".. _topics-access_rights:\n\n=============\nAccess Rights\n=============\n\nThere are 5 levels of access rights: `Model`_ , `Actions`_, `Field`_, `Button`_\nand `Record Rule`_. They are based on the user's group membership.\nIf any of those levels are violated, an error is raised.\n\nThe access rights are checked if the :attr:`Transaction.context\n<trytond.transaction.Transaction.context>` has the key ``_check_access`` set to\n``True`` (set by default by :attr:`RPC.check_access\n<trytond.rpc.RPC.check_access>`) and if the\n:attr:`~trytond.transaction.Transaction.user` is not ``root``.\n\nModel\n=====\n\nThey are defined by records of ``ir.model.access`` which define for each couple\nof model and group, the ``read``, ``write``, ``create`` and ``delete``\npermission. The permissions are related to the\n:class:`~trytond.model.ModelStorage` methods with the same name and on\n:meth:`~trytond.model.ModelStorage.search` using the ``read`` permission.\n\nIf any group the user belongs to has the checked permission activated, then the\nuser is granted this permission.\n\nIf there is no record for the model, then access is granted to all users.\n\n.. note::\n    Relation fields for which the user has no read access are automatically\n    removed from the :ref:`views <topics-views>`.\n\nActions\n=======\n\nEach ``ir.action`` has a ``groups`` field which contains a list of user groups\nthat are allowed to see and launch it.\n\nThere is a special case for :ref:`wizard <topics-wizard>` for which the read\naccess on the model is also checked and also the write access if there is no\ngroups linked.\n\nField\n=====\n\nThey are defined by records of ``ir.model.field.access`` and work like those\nfor `Model`_ but are applied to :ref:`fields <ref-models-fields>`.\n\n.. note::\n    Fields for which the user has no read access are automatically removed from\n    the :ref:`views <topics-views>`.\n\nButton\n======\n\nFor each button of a model the records of ``ir.model.button`` define the list of\ngroups that are allowed to call it. The user only needs to belong to one of the\ngroups to be granted the permission to use it.\n\nIf no group is defined for a button, the ``write`` permission to the model is\nchecked instead.\n\nThe ``read`` permission to the model is always enforced.\n\n.. note::\n    Buttons for which the user has no access are marked readonly.\n\nButton Rule\n-----------\n\nThe ``ir.model.button`` can contain a list of rules which define how many\ndifferent users must click on the button.  Each rule, for which the condition\nis met, must be passed to actually trigger the action. The counter can be reset\nwhen another defined button is clicked.\n\nRecord Rule\n===========\n\nThe record rules are conditions that records must meet for the user to be\ngranted permission to use them.\nThey are defined by records of ``ir.rule.group`` which contains:\n\n    - a model on which it applies\n    - the permissions granted\n    - a set of user groups to which the rule applies\n    - a global flag to always enforce\n    - a default flag to add to all users\n    - a list of ``ir.rule`` with a :ref:`domain <topics-domain>` to select the\n      records to which the rule applies.\n\nA rule group matches a record if the record is validated by at least one of the\ndomains.\nThe access is granted to a record:\n\n    - if the user belongs to a group which has at least one matching rule group\n      that has the permission,\n\n    - or if there is a default matching rule group with the permission,\n\n    - or if there is a global matching rule group with the permission.\n\nOtherwise the access is denied if there is any matching rule group.\n\n.. note::\n    Records for which the user has no ``read`` access are filtered out from the\n    :meth:`~trytond.model.ModelStorage.search` result.\n"
  },
  {
    "path": "doc/topics/actions.rst",
    "content": ".. _topics-actions:\n\n=======\nActions\n=======\n\nActions are used to describe specific behaviors in the client.\n\nThere are four types of actions:\n\n    * Report\n\n    * Window\n\n    * Wizard\n\n    * URL\n\n\nKeyword\n-------\n\nKeywords define where to display the action in the client.\n\nThere are five places:\n\n    * Open tree (``tree_open``)\n\n    * Print form (``form_print``)\n\n    * Action form (``form_action``)\n\n    * Form relate (``form_relate``)\n\n    * Open Graph (``graph_open``)\n\nReport\n======\n\n.. TODO\n\nWindow\n======\n\nThe window action describe how to create a new tab in the client.\n\nView\n----\n\n.. TODO\n\nDomain\n------\n\nThe window action could have a list of domains which could be activated on the\nview. The boolean field count indicates if the client must display the number\nof records for this domain.\n\n.. warning::\n    The counting option must be activated only on domains which have not too\n    much records otherwise it may overload the database.\n\nWizard\n======\n\n.. TODO\n\nURL\n===\n\n.. TODO\n"
  },
  {
    "path": "doc/topics/backend_types.rst",
    "content": ".. _topics-backend_types:\n\nBackend Types supported\n=======================\n\nThis table give a comprehensive list of the SQL Types that are expected to be\nsupported by the database backends. If the type is not supported then the\nbackend will have to emulate the behavior described here.\n\nThe columns are in the following order:\n\n* The SQL type [#]_ representing the field\n* The python type expected on input\n* The python type received on output\n\n.. _`SQL 92`: http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt\n.. _`PostgreSQL type`: https://www.postgresql.org/docs/current/static/datatype.html\n\n``None`` will represent the ``NULL`` value and vice versa, it can be used as\ninput or output for any SQL type.\n\n+----------------------+----------------------+----------------------+\n| SQL Type             | Python input type    | Python output type   |\n+======================+======================+======================+\n| ``BOOL``             | bool                 | bool                 |\n+----------------------+----------------------+----------------------+\n| ``INTEGER``          | int                  | int                  |\n+----------------------+----------------------+----------------------+\n| ``BIGINT``           | int                  | int                  |\n+----------------------+----------------------+----------------------+\n| ``FLOAT``            | float / int          | float                |\n+----------------------+----------------------+----------------------+\n| ``NUMERIC``          | decimal.Decimal_     | decimal.Decimal_     |\n+----------------------+----------------------+----------------------+\n| ``VARCHAR`` /        | str                  | str                  |\n| ``VARCHAR(length)``  |                      |                      |\n+----------------------+----------------------+----------------------+\n| ``TEXT``             | str                  | str                  |\n+----------------------+----------------------+----------------------+\n| ``TIMESTAMP``        | datetime.datetime_   | datetime.datetime_   |\n|                      | [#utc_tz]_           | [#utc_tz]_           |\n+----------------------+----------------------+----------------------+\n| ``DATETIME``         | datetime.datetime_   | datetime.datetime_   |\n|                      | without microseconds | without microseconds |\n|                      | [#utc_tz]_           | [#utc_tz]_           |\n+----------------------+----------------------+----------------------+\n| ``DATE``             | datetime.date_       | datetime.date_       |\n+----------------------+----------------------+----------------------+\n| ``TIME``             | datetime.time_       | datetime.time_       |\n+----------------------+----------------------+----------------------+\n| ``INTERVAL``         | datetime.timedelta_  | datetime.timedelta_  |\n+----------------------+----------------------+----------------------+\n| ``BLOB``             | bytes                | bytes                |\n+----------------------+----------------------+----------------------+\n| ``JSON``             | dict                 | dict                 |\n+----------------------+----------------------+----------------------+\n\n.. [#] Corresponding to the `SQL 92`_ standard or to a `PostgreSQL type`_.\n.. [#utc_tz] datetime objects are in UTC but without timezone.\n\n.. _datetime.date: https://docs.python.org/library/datetime.html#date-objects\n.. _datetime.datetime: https://docs.python.org/library/datetime.html#datetime-objects\n.. _datetime.time: https://docs.python.org/library/datetime.html#time-objects\n.. _datetime.timedelta: https://docs.python.org/library/datetime.html#timedelta-objects\n.. _decimal.Decimal: https://docs.python.org/library/decimal.html#decimal-objects\n"
  },
  {
    "path": "doc/topics/bus.rst",
    "content": ".. _topics-notification:\n\n=====================\nSending notifications\n=====================\n\nTryton embeds a bus system allowing the system to send text messages to clients\nlogged in the system.\n\nIt allows the server to warn quickly the client user about some events using\nthe :meth:`~trytond.bus.notify` function.\nSending the notifications is done in a transactional way and will occur at then\nend of the transaction.\n\nFor example, we warn the user of low stock level when selecting a product:\n\n.. code-block:: python\n\n    from trytond.bus import notify\n\n    class SaleLine:\n        __name__ = 'sale.line'\n\n        def on_change_product(self):\n            super().on_change_product()\n            if compute_stock(self.product) < 0:\n                notify('Not enough stock', priority=3)\n"
  },
  {
    "path": "doc/topics/configuration.rst",
    "content": ".. _topics-configuration:\n\n=============================\nConfiguration file for Tryton\n=============================\n\nThe configuration file controls some aspects of the behavior of Tryton.\nThe file uses a simple ini-file format. It consists of sections, led by a\n``[section]`` header and followed by ``name = value`` entries:\n\n.. highlight:: ini\n\n::\n\n    [database]\n    uri = postgresql://user:password@localhost/\n    path = /var/lib/trytond\n\nFor more information see ConfigParser_.\n\n.. _ConfigParser: http://docs.python.org/2/library/configparser.html\n\nThe default value of any option can be changed using environment variables\nwith names using this syntax: ``TRYTOND_<SECTION>__<NAME>``.\n\nSections\n========\n\nThis section describes the different main sections that may appear in a Tryton\nconfiguration file, the purpose of each section, its possible keys, and their\npossible values.\nSome modules could request the usage of other sections for which the guideline\nasks them to be named like their module.\n\n.. contents::\n   :local:\n   :backlinks: entry\n   :depth: 2\n\nweb\n---\n\nDefines the behavior of the web interface.\n\nlisten\n~~~~~~\n\nDefines the couple of host (or IP address) and port number separated by a colon\nto listen on.\n\nDefault ``localhost:8000``\n\n.. note::\n   To listen on all IPv4 interfaces use the value ``0.0.0.0:8000`` and for all\n   IPv6 interfaces use ``[::]:8000``.\n\nhostname\n~~~~~~~~\n\nDefines the hostname to use when generating a URL when there is no request\ncontext available, for example during a cron job.\n\nroot\n~~~~\n\nDefines the root path served by ``GET`` requests.\n\nDefault: Under the ``www`` directory of user's home running ``trytond``.\n\nnum_proxies\n~~~~~~~~~~~\n\nThe number of proxy servers in front of ``trytond``.\n\nDefault: 0\n\ncache_timeout\n~~~~~~~~~~~~~\n\nThe cache timeout in seconds.\n\nDefault: 12h\n\ncors\n~~~~\n\nThe list (one per line) of origins allowed for `Cross-Origin Resource sharing\n<https://en.wikipedia.org/wiki/Cross-origin_resource_sharing>`_.\nFor example::\n\n   cors =\n      http://example.com\n      https://example.com\n\navatar_base\n~~~~~~~~~~~\n\nThe base URL without a path for avatar URL.\n\nDefault: ``''``\n\n.. note:: It can be used to setup a CDN.\n\n\navatar_timeout\n~~~~~~~~~~~~~~\n\nThe time in seconds that the avatar can be stored in cache.\n\nDefault: 7 days\n\ndatabase\n--------\n\nDefines how the database is managed.\n\nuri\n~~~\n\nContains the URI to connect to the SQL database. The URI follows the :rfc:`3986`.\nThe typical form is:\n\n    database://username:password@host:port/?param1=value1&param2=value2\n\nThe parameters are database dependent, check the database documentation for a\nlist of valid parameters.\n\nDefault: The value of the environment variable ``TRYTOND_DATABASE_URI`` or\n``sqlite://`` if not set.\n\nThe available databases are:\n\nPostgreSQL\n**********\n\n``psycopg2`` supports two type of connections:\n\n    - TCP/IP connection: ``postgresql://user:password@localhost:5432/``\n    - Unix domain connection: ``postgresql://username:password@/``\n\nPlease refer to `psycopg2 for the complete specification of the URI\n<https://www.psycopg.org/docs/module.html#psycopg2.connect>`_.\n\nA list of parameters supported by PostgreSQL can be found in the\n`documentation\n<https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PARAMKEYWORDS>`__.\n\nSQLite\n******\n\nThe URI is defined as ``sqlite://``\n\nIf the name of the database is ``:memory:``, the parameter ``mode`` will be set\nto ``memory`` thus using a pure in-memory database.\n\nThe recognized query parameters can be found in SQLite's\n`documentation\n<https://www.sqlite.org/uri.html#recognized_query_parameters>`__.\n\npath\n~~~~\n\nThe directory where Tryton stores files and so the user running\n:command:`trytond` must have write access on this directory.\n\nDefault: The :file:`db` folder under the user home directory running\n:command:`trytond`.\n\nlist\n~~~~\n\nA boolean value to list available databases.\n\nDefault: ``True``\n\nretry\n~~~~~\n\nThe number of retries when a database operational error occurs during a request.\n\nDefault: ``5``\n\nlanguage\n~~~~~~~~\n\nThe main language of the database that will be used for storage in the main\ntable for translations.\n\nDefault: ``en``\n\navatar_filestore\n~~~~~~~~~~~~~~~~\n\nThis configuration value indicates whether the avatars should be stored in the\n:py:mod:`trytond.filestore` (``True``) or the database (``False``).\n\nDefault: ``False``\n\navatar_prefix\n~~~~~~~~~~~~~\n\nThe prefix to use with the :ref:`FileStore <ref-filestore>` to store avatars.\n\nDefault: ``None``\n\ndefault_name\n~~~~~~~~~~~~\n\nThe name of the database to use for operations without a database name.\nDefault: ``template1`` for PostgreSQL, ``:memory:`` for SQLite.\n\ntimeout\n~~~~~~~\n\nThe timeout duration in seconds after which the connections to unused databases\nare closed.\nDefault: ``1800`` (30 minutes)\n\nminconn\n~~~~~~~\n\nThe minimum number of connections to keep in the pool (if the backend supports\npool) per process.\nDefault: ``1``\n\nmaxconn\n~~~~~~~\n\nThe maximum number of simultaneous connections to the database per process.\nDefault: ``64``\n\nunaccent_function\n~~~~~~~~~~~~~~~~~\n\nThe name of the unaccent function.\n\nDefault: ``unaccent``\n\nsimilarity_function\n~~~~~~~~~~~~~~~~~~~\n\nThe name of the similarity function.\n\nDefault: ``similarity``\n\nrequest\n-------\n\nmax_size\n~~~~~~~~\n\nThe maximum size in bytes of unauthenticated request (zero means no limit).\n\nDefault: 2MB\n\nmax_size_authenticated\n~~~~~~~~~~~~~~~~~~~~~~\n\nThe maximum size in bytes of an authenticated request (zero means no limit).\n\nDefault: 2GB\n\n\ncache\n-----\n\nDefines size of various cache.\n\ntransaction\n~~~~~~~~~~~\n\nThe number of contextual caches kept per transaction.\n\nDefault: ``10``\n\nmodel\n~~~~~\n\nThe number of different model kept in the cache per transaction.\n\nDefault: ``200``\n\nrecord\n~~~~~~\n\nThe number of record loaded kept in the cache of the list.\nIt can be changed locally using the ``_record_cache_size`` key in\n:attr:`Transaction.context <trytond.transaction.Transaction.context>`.\n\nDefault: ``2000``\n\nfield\n~~~~~\n\nThe number of field to load with an ``eager`` :attr:`Field.loading\n<trytond.model.fields.Field.loading>`.\n\nDefault: ``100``\n\nclean_timeout\n~~~~~~~~~~~~~\n\nThe minimum number of seconds between two cleanings of the cache.\nIf the value is 0, the notification between processes will be done using\nchannels if the back-end supports them.\n\nDefault: ``300``\n\ncount_timeout\n~~~~~~~~~~~~~\n\nThe cache timeout duration in seconds of the estimation of records.\n\nDefault: ``86400`` (1 day)\n\ncount_clear\n~~~~~~~~~~~\n\nThe number of operations after which the counting estimation of records is\ncleared.\n\nDefault: ``1000``\n\nqueue\n-----\n\nworker\n~~~~~~\n\nActivate asynchronous processing of the tasks. Otherwise they are performed at\nthe end of the requests.\n\nDefault: ``False``\n\nclean_days\n~~~~~~~~~~\n\nThe number of days after which processed tasks are removed.\n\nDefault: ``30``\n\nbatch_size\n~~~~~~~~~~\n\nThe default number of the instances to process in a batch.\n\nDefault: ``20``\n\nerror\n-----\n\nclean_days\n~~~~~~~~~~\n\nThe number of days after which reported errors are removed.\n\nDefault: ``90``\n\ntable\n-----\n\nThis section allows to override the default generated table name for a\n:class:`~trytond.model.ModelSQL`.\nThe main goal is to bypass limitation on the name length of the database\nbackend.\nFor example::\n\n    [table]\n    account.invoice.line = acc_inv_line\n    account.invoice.tax = acc_inv_tax\n\nssl\n---\n\nActivates SSL_ on the web interface.\n\n.. note:: It is recommended to delegate the SSL support to a proxy.\n\nprivatekey\n~~~~~~~~~~\n\nThe path to the private key.\n\ncertificate\n~~~~~~~~~~~\n\nThe path to the certificate.\n\n.. tip::\n   Set only one of ``privatekey`` or ``certificate`` to ``true`` if the SSL is\n   delegated.\n\nemail\n-----\n\n.. note:: Email settings can be tested with the ``trytond-admin`` command\n\nuri\n~~~\n\nThe SMTP-URL_ to connect to the SMTP server which is extended to support SSL_\nand STARTTLS_.\nThe available protocols are:\n\n    - ``smtp``: simple SMTP\n    - ``smtp+tls``: SMTP with STARTTLS\n    - ``smtps``: SMTP with SSL\n\nThe uri accepts the following additional parameters:\n\n* ``local_hostname``: used as FQDN of the local host in the HELO/EHLO commands,\n  if omited it will use the value of ``socket.getfqdn()``.\n* ``timeout``: A number of seconds used as timeout for blocking operations. A\n  ``socket.timeout`` will be raised when exceeded. If omited the default timeout\n  will be used.\n\n\nDefault: ``smtp://localhost:25``\n\nfrom\n~~~~\n\nDefines the default ``From`` address (using :rfc:`5322`) for emails sent by\nTryton.\n\nFor example::\n\n    from: \"Company Inc\" <info@example.com>\n\nretry\n~~~~~\n\nThe number of retries when the SMTP server returns a temporary error.\n\nDefault: ``5``\n\nsession\n-------\n\nauthentications\n~~~~~~~~~~~~~~~\n\nA comma separated list of the authentication methods to try when attempting to\nverify a user's identity. Each method is tried in turn, following the order of\nthe list, until one succeeds. In order to allow `multi-factor authentication`_,\nindividual methods can be combined together using a plus (``+``) symbol.\n\nExample::\n\n    authentications = password+sms,ldap\n\nEach combined method can have options to skip them if they are met except for\nthe first method.\nThey are defined by appending their name to the method name after a question\nmark (``?``) and separated by colons (``:``).\n\nExample::\n\n   authentications = password+sms?ip_address:device_cookie\n\n\nBy default, Tryton only supports the ``password`` method.  This method compares\nthe password entered by the user against a stored hash of the user's password.\nBy default, Tryton supports the ``ip_address`` and ``device_cookie`` options.\nThe ``ip_address`` compares the client IP address with the known network list\ndefined in `authentication_ip_network`_.\nThe ``device_cookie`` checks the client device is a known device of the user.\nOther modules can define additional authentication methods and options, please\nrefer to their documentation for more information.\n\nDefault: ``password``\n\nauthentication_ip_network\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\nA comma separated list of known IP networks used to check for ``ip_address``\nauthentication method option.\n\nDefault: ``''``\n\nmax_age\n~~~~~~~\n\nThe time in seconds that a session stay valid.\n\nDefault: ``2592000`` (30 days)\n\ntimeout\n~~~~~~~\n\nThe time in seconds without activity before the session is no more fresh.\n\nDefault: ``300`` (5 minutes)\n\nmax_attempt\n~~~~~~~~~~~\n\nThe maximum authentication attempt before the server answers unconditionally\n``Too Many Requests`` for any other attempts. The counting is done on all\nattempts over a period of ``timeout``.\n\nDefault: ``5``\n\nmax_attempt_ip_network\n~~~~~~~~~~~~~~~~~~~~~~\n\nThe maximum authentication attempt from the same network before the server\nanswers unconditionally ``Too Many Requests`` for any other attempts. The\ncounting is done on all attempts over a period of ``timeout``.\n\nDefault: ``300``\n\nip_network_4\n~~~~~~~~~~~~\n\nThe network prefix to apply on IPv4 address for counting the authentication\nattempts.\n\nDefault: ``32``\n\nip_network_6\n~~~~~~~~~~~~\n\nThe network prefix to apply on IPv6 address for counting the authentication\nattempts.\n\nDefault: ``56``\n\npassword\n--------\n\nlength\n~~~~~~\n\nThe minimal length required for the user password.\n\nDefault: ``8``\n\nforbidden\n~~~~~~~~~\n\nThe path to a file containing one forbidden password per line.\n\nreset_timeout\n~~~~~~~~~~~~~\n\nThe time in seconds until the reset password expires.\n\nDefault: ``86400`` (24h)\n\npasslib\n~~~~~~~\n\nThe path to the `INI file to load as CryptContext\n<https://passlib.readthedocs.io/en/stable/narr/context-tutorial.html#loading-saving-a-cryptcontext>`_.\nIf no path is set, Tryton will use the schemes ``argon2``, ``scrypt``,\n``bcrypt`` or ``pbkdf2_sha512``.\n\nDefault: ``None``\n\nattachment\n----------\n\nDefines how to store the attachments\n\nfilestore\n~~~~~~~~~\n\nA boolean value to store attachment in the :ref:`FileStore <ref-filestore>`.\n\nDefault: ``True``\n\nstore_prefix\n~~~~~~~~~~~~\n\nThe prefix to use with the ``FileStore``.\n\nDefault: ``None``\n\nbus\n---\n\nallow_subscribe\n~~~~~~~~~~~~~~~\n\nA boolean value to allow clients to subscribe to bus channels.\n\nDefault: ``False``\n\nurl_host\n~~~~~~~~\n\nIf set redirects bus requests to the host URL.\n\nlong_polling_timeout\n~~~~~~~~~~~~~~~~~~~~\n\nThe time in seconds to keep the connection to the client opened when using long\npolling for bus messages\n\nDefault: ``300``\n\ncache_timeout\n~~~~~~~~~~~~~\n\nThe number of seconds a message should be kept by the queue before being\ndiscarded.\n\nDefault: ``300``\n\nselect_timeout\n~~~~~~~~~~~~~~\n\nThe timeout duration of the select call when listening on a channel.\n\nDefault: ``5``\n\nhtml\n----\n\nsrc\n~~~\n\nThe URL pointing to `TinyMCE <https://www.tiny.cloud/>`_ editor.\n\nDefault: ``https://cloud.tinymce.com/stable/tinymce.min.js``\n\nplugins\n~~~~~~~\n\nThe space separated list of TinyMCE plugins to load.\nIt can be overridden for specific models and fields using the names:\n``plugins-<model>-<field>`` or ``plugins-<model>``.\n\nDefault: ``\n\ncss\n~~~\n\nThe JSON list of CSS files to load.\nIt can be overridden for specific models and fields using the names:\n``css-<model>-<field>`` or ``css-<model>``.\n\nDefault: ``[]``\n\nclass\n~~~~~\n\nThe class to add on the body.\nIt can be overridden for specific models and fields using the names:\n``class-<model>-<field>`` or ``class-<model>``.\n\nDefault: ``''``\n\nwsgi middleware\n---------------\n\nThe section lists the `WSGI middleware`_ class to load.\nEach middleware can be configured with a section named ``wsgi <middleware>``\ncontaining ``args`` and ``kwargs`` options.\n\nExample::\n\n    [wsgi middleware]\n    ie = werkzeug.contrib.fixers.InternetExplorerFix\n\n    [wsgi ie]\n    kwargs={'fix_attach': False}\n\n.. note::\n   The options can be set using environment variables with names like:\n   ``TRYTOND_WSGI_<MIDDLEWARE>__<NAME>``.\n\n\n.. _JSON-RPC: http://en.wikipedia.org/wiki/JSON-RPC\n.. _XML-RPC: http://en.wikipedia.org/wiki/XML-RPC\n.. _SMTP-URL: https://datatracker.ietf.org/doc/html/draft-earhart-url-smtp-00\n.. _SSL: http://en.wikipedia.org/wiki/Secure_Sockets_Layer\n.. _STARTTLS: http://en.wikipedia.org/wiki/STARTTLS\n.. _WSGI middleware: https://en.wikipedia.org/wiki/Web_Server_Gateway_Interface#Specification_overview\n.. _`multi-factor authentication`: https://en.wikipedia.org/wiki/Multi-factor_authentication\n"
  },
  {
    "path": "doc/topics/cron.rst",
    "content": ".. _topics-cron:\n\n=================\nScheduled Actions\n=================\n\nTryton provides a scheduler (aka cron) which can execute methods of\n:ref:`models <topics-models>` periodically at set intervals.\n\nThe planning is managed by ``ir.cron`` records which store the method to call\nand the interval of time between calls. The method must be a class method of a\n:class:`~trytond.model.Model` which can be called without any parameters.\n\n.. note::\n\n   The timezone used to schedule the action is\n   :attr:`timezone.SERVER <trytond.tools.timezone.SERVER>`.\n\nTo register a new method with the scheduler, you must extend the ``ir.cron``\nmodel and append the new method to the\n:attr:`~trytond.model.fields.Selection.selection` attribute of the ``method``\nfield in :meth:`~trytond.model.Model.__setup__()`. The name of the selection\nmust be the model name and the method name joined together with a ``|`` between\nthem.\n\nExample:\n\n.. highlight:: python\n\n::\n\n    from trytond.model import Model\n    from trytond.pool import PoolMeta\n\n    class Cron(metaclass=PoolMeta):\n        __name__ = 'ir.cron'\n\n        @classmethod\n        def __setup__(cls):\n            super().__setup__()\n            cls.method.selection.append(\n                ('my_model|my_method', \"Run my method\"),\n                )\n\n\n    class MyModel(Model):\n        \"My Model\"\n        __name__ = 'my_model'\n\n        @classmethod\n        def my_method(cls):\n            pass\n"
  },
  {
    "path": "doc/topics/domain.rst",
    "content": ".. _topics-domain:\n\n\n======\nDomain\n======\n\nDomains_ represent a set of records. A domain is a list of none or\nmore clauses. A clause is a condition, which returns true or false.\nA record belongs to a domain, when the final result of the list of\nclauses returns true.\n\n.. _Domains: http://en.wikipedia.org/wiki/Data_domain\n\n\nSyntax\n======\n\nThe definition of a simple domain with one clause is represented\nby this pattern::\n\n    domain = [(<field name>, <operator>, <operand>)]\n\n``field name``\n    Is the name of a :mod:`~trytond.model.fields` or a\n    :ref:`pyson <topics-pyson>` statement, that evaluates to a\n    string.\n\n    A field of type :class:`~trytond.model.fields.Many2One` or\n    :class:`~trytond.model.fields.Many2Many` or\n    :class:`~trytond.model.fields.One2Many` or\n    :class:`~trytond.model.fields.One2One` or\n    :class:`~trytond.model.fields.Reference` can be dereferenced to related\n    models. This is illustrated by the following example::\n\n        domain = [('country.name', '=', 'Japan')]\n\n    The number of *dots* in a clause is not limited.\n\n    .. warning::\n        For :class:`trytond.model.fields.Reference`, an extra ending clause is\n        needed to define the target model to join, for example::\n\n            domain = [('origin.party.name', '=', 'John Doe', 'sale.sale')]\n\n    A field of type :class:`~trytond.model.fields.Dict` can be searched by key\n    also by using one *dot*. For example::\n\n        domain = [('attributes.color', '=', 'yellow')]\n\n    .. warning::\n        Order comparison of ``date`` and ``datetime`` types is not supported.\n\n``operator``\n    Is an operator out of `Domain Operators`_ or a\n    :ref:`pyson <topics-pyson>` statement, that evaluates to\n    a domain operator string.\n\n``operand``\n   Is an operand or a :ref:`pyson <topics-pyson>` statement. The\n   type of operand depends on the kind of <field name>.\n\nThe definition of an empty domain is::\n\n    domain = []\n\nAn empty domain without clauses will always return all *active*\nrecords. A record is active, when its appropriate\n:class:`~trytond.model.Model` contains a\n:class:`~trytond.model.fields.Boolean` field with name ``active``,\nand set to true. When the appropriate :class:`~trytond.model.Model`\ndoes not contain a :class:`~trytond.model.fields.Boolean` field with\nname ``active`` all records are returned.\n\nA domain can be setup as a combination of clauses, like shown in\nthis pattern::\n\n    domain = [\n        ('field name1', 'operator1', 'operand1'),\n        ('field name2', 'operator2', 'operand2'),\n        ('field name3', 'operator3', 'operand3'),\n        ]\n\nThe single clauses are implicitly combined with a logical\nAND_ operation.\n\n\nIn the domain syntax it is possible to provide explicitly the\ncombination operation of the clauses. These operations can be AND_\nor OR_. This is illustrated by the following pattern::\n\n    domain = ['OR', [\n                ('field name1', 'operator1', 'operand1'),\n                ('field name2', 'operator2', 'operand2'),\n            ], [\n                ('field name3', 'operator3', 'operand3'),\n            ],\n        ]\n\n.. _AND: http://en.wikipedia.org/wiki/Logical_and\n.. _OR: http://en.wikipedia.org/wiki/Logical_or\n\n\nHere the domain is evaluated like this: ``((clause1 AND clause2)\nOR clause3)``. Please note that the ``AND`` operation is implicit\nassumed when no operator is given. While the ``OR`` operation must\nbe given explicitly. The former pattern is equivalent to the\nfollowing completely explicit domain definition::\n\n    domain = ['OR',\n                 ['AND', [\n                         ('field name1', 'operator1', 'operand1'),\n                     ], [\n                         ('field name2', 'operator2', 'operand2'),\n                     ],\n                 ], [\n                     ('field name3', 'operator3', 'operand3'),\n             ],\n        ]\n\nObviously the use of the implicit ``AND`` operation makes the code\nmore readable.\n\n\nDomain Operators\n================\n\nThe following operators are allowed in the domain syntax.\n``<field name>``, ``<operator>`` and ``<operand>`` are dereferenced\nto their values. The description of each operator follows this\npattern, unless otherwise noted::\n\n    (<field name>, <operator>, <operand>)\n\n``=``\n-----\n\n    Is a parity operator. Returns true when ``<field name>``\n    equals to ``<operand>``.\n\n``!=``\n------\n\n    Is an imparity operator. It is the negation of the `=`_ operator.\n\n``like``\n--------\n\n    Is a pattern matching operator. Returns true when ``<field name>``\n    is contained in the pattern represented by ``<operand>``.\n\n    In ``<operand>`` an underscore (``_``) matches any single\n    character, a percent sign (``%``) matches any string with zero\n    or more characters. To use ``_`` or ``%`` as literal, use the\n    backslash ``\\`` to escape them. All matching is case sensitive.\n\n``not like``\n------------\n\n    Is a pattern matching operator. It is the negation of the `like`_\n    operator.\n\n``ilike``\n---------\n\n    Is a pattern matching operator. The same use as `like`_ operator,\n    but matching is case insensitive.\n\n``not ilike``\n-------------\n\n    Is a pattern matching operator. The negation of the  `ilike`_ operator.\n\n``in``\n------\n\n    Is a list member operator. Returns true when ``<field name>`` is\n    in ``<operand>`` list.\n\n``not in``\n----------\n\n    Is a list non-member operator. The negation of the `in`_ operator.\n\n``<``\n-----\n\n    Is a *less than* operator. Returns true for type string of\n    ``<field name>``  when ``<field name>`` is alphabetically\n    sorted before ``<operand>``.\n\n    Returns true for type number of ``<field name>`` when\n    ``<field name>`` is less than ``<operand>``.\n\n``>``\n-----\n\n    Is a *greater than* operator. Returns true for type string of\n    ``<field name>`` when ``<field name>`` is alphabetically\n    sorted after  ``<operand>``.\n\n    Returns true for type number of ``<field name>`` when\n    ``<field name>`` is greater ``<operand>``.\n\n``<=``\n------\n\n    Is a *less than or equal* operator. Returns the same as using the\n    `<`_ operator, but also returns true when ``<field name>`` is\n    equal to ``<operand>``.\n\n``>=``\n------\n\n    Is a *greater than or equal* operator. Returns the same as using\n    the `>`_ operator, but also returns true when ``<field name>``\n    is equal to ``<operand>``.\n\n``child_of``\n------------\n\n    Is a parent child comparison operator. Returns true for records that are\n    a child of ``<operand>``. ``<operand>`` is a list of ``ids`` and ``<field\n    name>`` must be a :class:`~trytond.model.fields.Many2One` or a\n    :class:`~trytond.model.fields.Many2Many`.\n    In case ``<field name>`` is not linked to itself, the clause pattern\n    extends to::\n\n        (<field name>, ['child_of'|'not_child_of'], <operand>, <parent field>)\n\n    Where ``<parent field>`` is the name of the field constituting the\n    :class:`~trytond.model.fields.Many2One` on the target model.\n\n``not child_of``\n----------------\n\n    Is a parent child comparison operator. It is the negation of the\n    `child_of`_ operator.\n\n``parent_of``\n-------------\n\n    Is a parent child comparison operator. It is the same as `child_of`_\n    operator but if ``<field name>`` is a parent of ``<operand>``.\n\n``not parent_of``\n-----------------\n\n    Is a parent child comparison operator. It is the negation of this\n    `parent_of`_ operator.\n\n``where``\n---------\n\n    Is a :class:`trytond.model.fields.One2Many` /\n    :class:`trytond.model.fields.Many2Many` domain operator. It returns true\n    for every row of the target model that match the domain specified as\n    ``<operand>``.\n\n``not where``\n-------------\n\n    Is a :class:`trytond.model.fields.One2Many` /\n    :class:`trytond.model.fields.Many2Many` domain operator. It returns true\n    for every row of the target model that does not match the domain specified\n    as ``<operand>``.\n"
  },
  {
    "path": "doc/topics/index.rst",
    "content": ".. _topics-index:\n\n=============\nUsing trytond\n=============\n\nIntroduction key parts of ``trytond``:\n\n.. toctree::\n   :maxdepth: 1\n\n   install\n   configuration\n   setup_database\n   logs\n   start_server\n   models/index\n   backend_types\n   models/fields_default_value\n   models/fields_on_change\n   domain\n   pyson\n   access_rights\n   user_errors_warnings\n   triggers\n   actions\n   views/index\n   views/extension\n   wizard\n   reports/index\n   rpc\n   task_queue\n   cron\n   user_application\n   bus\n   modules/index\n   translation\n   testing\n"
  },
  {
    "path": "doc/topics/install.rst",
    "content": ".. _topics-install:\n\n======================\nHow to install Tryton\n======================\n\nInstall Tryton\n==============\n\nThere are three options to install Tryton:\n\n    * Install the version provided by your operating system distribution. This\n      is the quickest and recommended option for those who has operating system\n      that distributes Tryton.\n\n    * Install the published package.\n      You first need to have `pip <https://pip.pypa.io/>`_ installed.\n      Then to install ``trytond`` run:\n\n      .. code-block:: console\n\n         $ python -m pip install trytond\n\n      You can also install for example the ``sale`` module with:\n\n      .. code-block:: console\n\n         $ python -m pip install trytond_sale\n\n    * Without installation, you need to make sure you have all the dependencies\n      installed and then run:\n\n      .. code-block:: console\n\n         $ python bin/trytond\n\n      You can register modules by linking them into the ``trytond/modules``\n      folder.\n"
  },
  {
    "path": "doc/topics/logs.rst",
    "content": ".. _topics-logs:\n\n=====================\nLogging configuration\n=====================\n\nWithout any configuration, ``trytond`` writes messages to standard output.\nFor each verbose flag set, the log level decreases.\n\nLogs can be configured using a `configparser-format`_ file.\nThe filename can be specified using ``trytond`` ``logconf`` parameter.\n\n.. _`configparser-format`: https://docs.python.org/library/logging.config.html#configuration-file-format\n\nExample\n=======\n\nThis example allows to write messages from INFO level on standard output and on\na disk log file rotated every day.\n\n.. highlight:: ini\n\n::\n\n    [formatters]\n    keys=simple\n\n    [handlers]\n    keys=rotate,console\n\n    [loggers]\n    keys=root\n\n    [formatter_simple]\n    format=[%(asctime)s] %(levelname)s:%(name)s:%(message)s\n    datefmt=%a %b %d %H:%M:%S %Y\n\n    [handler_rotate]\n    class=handlers.TimedRotatingFileHandler\n    args=('/tmp/tryton.log', 'D', 1, 30)\n    formatter=simple\n\n    [handler_console]\n    class=StreamHandler\n    formatter=simple\n    args=(sys.stdout,)\n\n    [logger_root]\n    level=INFO\n    handlers=rotate,console\n"
  },
  {
    "path": "doc/topics/models/fields_default_value.rst",
    "content": ".. _topics-fields_default_value:\n\n=======================\nDefault value of fields\n=======================\n\nWhen a record is created, each field, which doesn't have a value specified,\nis set with the default value if exists.\n\nThe following class method:\n\n.. code-block:: python\n\n    Model.default_<field name>()\n\nReturn the default value for ``field name``.\n\nThis example defines an ``Item`` model which has a default ``since``:\n\n\n.. code-block:: python\n\n    import datetime\n\n    from trytond.model import ModelView, ModelSQL, fields\n\n\n    class Item(ModelSQL, ModelView):\n        \"Item\"\n        __name__ = 'item'\n        since = fields.Date('since')\n\n        @classmethod\n        def default_since(cls):\n            return datetime.date.today()\n\nSee also method :meth:`~trytond.model.Model.default_get`.\n"
  },
  {
    "path": "doc/topics/models/fields_on_change.rst",
    "content": ".. _topics-fields_on_change:\n\n===================\non_change of fields\n===================\n\nTryton allows developers to define methods that can be called once a field's\nvalue has been changed by the user.\nThe instance method has the following name::\n\n  on_change_<field name>\n\nAn instance of :class:`~trytond.model.Model` is created by using the values\nfrom the client's fields specified by the\n:attr:`~trytond.model.fields.Field.on_change` list defined on the field.\nAny change made on the instance will be pushed back to the client-side record.\n\nThere is also a way to define a method that must update the value of a field\nwhenever any field from a predefined list is modified.\nThis list is defined by the :attr:`~trytond.model.fields.Field.on_change_with`\nattribute of the field.\nThe method that will be called has the following name::\n\n   on_change_with_<field_name>\n\nJust like for the classic ``on_change``, an instance of\n:class:`~trytond.model.Model` is created by using the values from the client's\nfields specified by the :attr:`~trytond.model.fields.Field.on_change_with`\nattribute.\nThe returned value of the method is pushed back to the client-side record as\nthe new value of the field.\n"
  },
  {
    "path": "doc/topics/models/index.rst",
    "content": ".. _topics-models:\n\n======\nModels\n======\n\nA model represents a single business logic or concept. It contains fields and\ndefines the behaviors of the record. Most of the time, each model stores\nrecords in a single database table.\n\nThe basics:\n\n    * Each model is a Python class that subclasses one of\n      :class:`~trytond.model.Model`.\n\n    * :ref:`Fields <ref-models-fields>` are defined as model attributes.\n\n    * Tryton generates the table definitions\n\n    * Tryton provides an API following the `active record pattern`_ to access the records.\n\n.. _active record pattern: http://en.wikipedia.org/wiki/Active_record\n\nExample\n=======\n\nThis example defines a ``Party`` model which has a ``name`` and a ``code``\nfields::\n\n    from trytond.model import ModelView, ModelSQL, fields\n\n    class Party(ModelSQL, ModelView):\n        \"Party\"\n        __name__ = \"party.party\"\n        name = fields.Char('Name')\n        code = fields.Char('Code')\n\nThe class must be registered in the :class:`~trytond.pool.Pool` by the\n``register()`` method of the :ref:`module <topics-modules>`.\nModel classes are essentially data mappers to records and Model instances are\nrecords.\n\nModel attributes define meta-information of the model. They are class\nattributes starting with an underscore.  Some model properties are instance\nattributes allowing to update them at other places in the framework.\n"
  },
  {
    "path": "doc/topics/modules/index.rst",
    "content": ".. _topics-modules:\n\n=======\nModules\n=======\n\nThe modules of Tryton extend the functionality of the platform.\nThe server comes by default with only a basic functionality included in these\nmodules: ``ir``, ``res``.\n\nModule Structure\n================\n\nA module is a directory in :file:`trytond/modules` which contains at least two\nfiles:\n\n:file:`__init__.py`\n   A Tryton module must be a Python module.\n\n:file:`tryton.cfg`\n   A Configuration file that describes the Tryton module.\n\n.. _topics-modules-init:\n\n:file:`__init__.py` file\n------------------------\n\nIt is the Python :file:`__init__.py` to define a module.\nIt must contains a method named ``register()`` that must register to the pool\nall the objects of the module.\n\n.. _topics-modules-tryton-cfg:\n\n:file:`tryton.cfg` file\n-----------------------\n\nIt is a configuration file using the format of `ConfigParser`_ that must\ncontain ``tryton`` section with this following keys:\n\n``version``\n   The version number of the module.\n\n``depends``\n   A one per line list of modules on which this module depends.\n\n``extras_depend``\n   A one per line list of modules on which this module *may* depend.\n\n``xml``\n   The one per line list of the XML files of the module.\n   They will be loaded in the given order when the module is activated or\n   updated.\n\nHere is an example:\n\n.. code-block:: ini\n\n    [tryton]\n    version=0.0.1\n    depends:\n        ir\n        res\n        country\n    xml:\n        party.xml\n        category.xml\n        address.xml\n        contact_mechanism.xml\n\nPython Files\n============\n\nThe Python files define the models for the modules.\n\n.. _topics-modules-xml-files:\n\nXML Files\n=========\n\nThe XML files define data that are inserted into the database on activation.\n\nThere is an RNC for those files stored in :file:`trytond/tryton.rnc`.\n\nThe following snippet gives a first idea of what an XML file looks:\n\n.. highlight:: xml\n\n::\n\n  <?xml version=\"1.0\"?>\n  <tryton>\n      <data>\n          <record model=\"res.group\" id=\"group_party_admin\">\n              <field name=\"name\">Party Administration</field>\n          </record>\n          <record model=\"res.user-res.group\"\n              id=\"user_admin_group_party_admin\">\n              <field name=\"user\" ref=\"res.user_admin\"/>\n              <field name=\"group\" ref=\"group_party_admin\"/>\n          </record>\n\n          <menuitem\n              name=\"Party Management\"\n              sequence=\"0\"\n              id=\"menu_party\"\n              icon=\"tryton-users\"/>\n\n          <record model=\"ir.ui.view\" id=\"party_view_tree\">\n              <field name=\"model\">party.party</field>\n              <field name=\"type\">tree</field>\n              <field name=\"arch\">\n                  <![CDATA[\n                  <tree string=\"Parties\">\n                      <field name=\"code\"/>\n                      <field name=\"name\"/>\n                      <field name=\"lang\"/>\n                      <field name=\"vat_code\"/>\n                      <field name=\"active\" tree_invisible=\"1\"/>\n                      <field name=\"vat_country\" tree_invisible=\"1\"/>\n                      <field name=\"vat_number\" tree_invisible=\"1\"/>\n                  </tree>\n                  ]]>\n              </field>\n          </record>\n      </data>\n  </tryton>\n\nHere is the list of the tags:\n\n``tryton``\n   The main tag of the XML\n\n``data``\n   Define a set of data inside the file.\n   It can have the attributes:\n\n   ``noupdate``\n      Prevent the framework to update the records,\n   ``depends``\n      Import data only if all modules in the comma separated module list value\n      are activated,\n   ``grouped``\n      Create records at the end with a grouped call.\n   ``language``\n      Import data only if the language is translatable.\n\n``record``\n   Create a record of the model defined by the attribute ``model`` in the\n   database.\n   The ``id`` attribute can be used to refer to the record later in any XML\n   file.\n\n``field``\n   Set the value of the field with the name defined by the attribute ``name``.\n   Here is the list of attributes:\n\n   ``search``\n      Only for relation field.\n      It contains a domain which is used to search for the value to use.\n      The first value found will be used.\n\n   ``ref``\n      Only for relation field.\n      It contains an XML id of the relation to use as value.\n      It must be prefixed by the module name with an ending dot, if the record\n      is defined in an other module.\n\n   ``eval``\n      Python code to evaluate and use result as value.\n      The following expressions are available:\n\n      ``time``\n         The python time_ module.\n      ``version``\n         The current Tryton version.\n      ``ref``\n         A function that converts an XML id into a database id.\n      ``Decimal``\n         The python Decimal_ object.\n      ``datetime``\n         The python datetime_ module.\n\n   ``pyson``\n      Convert the evaluated value into :ref:`PYSON <ref-pyson>` string.\n\n   ``depends``\n      Set value only if all modules in the comma separated module list value\n      are activated.\n\n   .. note::\n       Field content is considered as a string. So for fields that require\n       other types, it is required to use the ``eval`` attribute.\n\n``menuitem``\n   Shortcut to create ``ir.ui.menu`` records.\n   Here is the list of attributes:\n\n   ``id``\n      The id of the menu.\n\n   ``name``\n      The name of the menu.\n\n   ``icon``\n      The icon of the menu.\n\n   ``sequence``\n      The sequence value used to order the menu entries.\n\n   ``parent``\n      The XML id of the parent menu.\n\n   ``action``\n      The XML id of the action linked to the menu.\n\n   ``groups``\n      A list of XML id of group, that have access to the menu, separated by\n      commas.\n\n   ``active``\n      A boolean telling if the menu is active or not.\n\n.. _ConfigParser: http://docs.python.org/library/configparser.html\n.. _time: http://docs.python.org/library/time.html\n.. _Decimal: https://docs.python.org/library/decimal.html\n.. _datetime: https://docs.python.org/library/datetime.html\n.. _RNG: https://en.wikipedia.org/wiki/RELAX_NG\n"
  },
  {
    "path": "doc/topics/pyson.rst",
    "content": ".. _topics-pyson:\n\n=====\nPYSON\n=====\n\nPYSON is the PYthon Statement and Object Notation. It is a\nlightweight `domain specific language`_ for the general representation\nof statements. PYSON is used to encode statements which can be\nevaluated in different programming languages, serving for the\ncommunication between trytond and any third party software.\nA PYSON parser can easily be implemented in other programming languages.\nSo third party softwares do not need to depend on Python to be able to\nfully communicate with the Tryton server.\n\nPYSON is a `deterministic algorithm`_ which will always succeed to evaluate\nstatements. There is a default behavior for unknown values. It is statically\ntyped and checked on instantiation.\n\nThere is also a :ref:`reference documentation of the API <ref-pyson>`.\n\n.. _`domain specific language`: http://en.wikipedia.org/wiki/Domain-specific_language\n.. _`deterministic algorithm`: http://en.wikipedia.org/wiki/Deterministic_algorithm\n\nSyntax\n======\n\nThe syntax of a PYSON statement follows this pattern::\n\n    Statement(argument1[, argument2[, ...]])\n\nwhere arguments can be another statement or a value. The evaluation\ndirection is inside out, deepest first.\n\n\nPYSON Examples\n==============\n\nGiven the PYSON statement::\n\n    Eval('active_id', -1)\n\n:class:`~trytond.pyson.Eval` checks the evaluation context for the variable\n``active_id`` and returns its value or ``-1`` if not defined.\nA similar expression in Python looks like this::\n\n    'active_id' in locals() and active_id or -1\n\nGiven the PYSON statement::\n\n    Not(Bool(Eval('active')))\n\n:class:`~trytond.pyson.Eval` checks the evaluation context for a variable ``active`` and\nreturns its value to :class:`~trytond.pyson.Bool` or ``''`` if not defined.\n:class:`~trytond.pyson.Bool` returns the corresponding boolean value of the\nformer result to :class:`~trytond.pyson.Not`.\n:class:`~trytond.pyson.Not` returns the boolean negation of the previous\nresult.\nA similar expression in Python looks like this::\n\n    'active' in locals() and active == False\n\nGiven the PYSON statement::\n\n    Or(Not(Equal(Eval('state'), 'draft')), Bool(Eval('lines')))\n\nIn this example are the results of two partial expressions\n``Not(Equal(Eval('state'), 'draft'))`` and ``Bool(Eval('lines'))``\nevaluated by a logical *OR* operator. The first expression part is\nevaluated as follow: When the value of ``Eval('state')`` is equal to\nthe string ``'draft'`` then return true, else false.\n:class:`~trytond.pyson.Not` negates the former result.\nA similar expression in Python looks like this::\n\n    'states' in locals() and 'lines' in locals() and state != 'draft' or bool(lines)\n\nGiven the PYSON statement::\n\n    If(In('company', Eval('context', {})), '=', '!=')\n\nIn this example the result is determined by an `if-then-else`_ condition.\n``In('company', Eval('context', {}))`` is evaluated like this: When\nthe key ``'company'`` is in the dictionary ``context``, returns\ntrue, otherwise false.\n:class:`~trytond.pyson.If` evaluates the former result and returns the string\n``'='`` if the result is true, otherwise returns the string ``'!='``.\nA similar expression in Python looks like this::\n\n    'context' in locals() and isinstance(context, dict) and 'company' in context and '=' or '!='\n\n.. _if-then-else: https://en.wikipedia.org/wiki/Conditional_(computer_programming)#If%E2%80%93then(%E2%80%93else)\n\nGiven the PYSON statement::\n\n    Get(Eval('context', {}), 'company', 0))\n\n:class:`~trytond.pyson.Eval` checks the evaluation context for a variable\n``context`` if defined, return the variable ``context``, otherwise return an\nempty dictionary ``{}``.\n:class:`~trytond.pyson.Get` checks the former resulting dictionary and returns\nthe value of the key ``'company'``, otherwise it returns the number ``0``.\nA similar expression in Python looks like this::\n\n    'context' in locals() and context.get('company', 0) or 0\n"
  },
  {
    "path": "doc/topics/reports/index.rst",
    "content": ".. _topics-reports:\n\n=======\nReports\n=======\n\nTryton can generate dynamic reports in many formats from templates. The reports\nare generated in one step as follows: a report template in a special file\nformat, explained later, is interpolated with dynamic data and placed into a\ndocument of the same file format. Tryton's ability to generate documents in\nthis way allows documents to be generated for any editor that supports the Open\nDocument Format which can be converted to third party formats, such as PDF.\n`LibreOffice`_ must be installed on the server host for format conversion.\n\n.. _LibreOffice: https://www.libreoffice.org/\n\nReport Templates\n================\n\nReport templates are files with a format supported by relatorio_, that contain\nsnippets of the Genshi_ templating language.\n\nHere is an example of the text that would be placed in an open document text\ndocument, ``*.odt``, that displays the full name and the address lines of the\nfirst address of each party.\nThe Genshi code is placed in the template using\n``Functions->Placeholder->Text`` Fields.\nThese are specific to ODT files.\n\n.. _relatorio: https://relatorio.tryton.org/\n.. _Genshi: https://genshi.edgewall.org/\n\nWhen defining an ``ir.action.report`` the following attributes are available:\n\n``name``\n   The name of the report.\n\n``report_name``\n   The ``__name__`` of the report model.\n\n``model``\n   The :attr:`~trytond.model.Model.__name__` of the\n   :class:`~trytond.model.Model` the report is based.\n   Report that is not for a specific model, needs to leave this empty.\n\n``report``\n   The path to the template file starting with the module directory.\n\n``template_extension``\n   The template format.\n\n``single``\n   ``True`` if the template works only for one record.\n   If such report is called with more than one record, a zip file containing\n   all the reports will be generated.\n\n``record_name``\n   A Genshi Expression to compute the filename for each record.\n\nReport Usage\n============\n\nUsing Genshi and Open Office\n----------------------------\n\nSetting up an ODT file\n^^^^^^^^^^^^^^^^^^^^^^\n\nIf you are creating a report from scratch you should perform the following\nsteps:\n\n - Remove user data\n\n    * \"File > Properties...\"\n\n    * Uncheck \"Apply user data\"\n\n    * Click on \"Reset\"\n\n - Select Style and Formatting\n\n    * Press F11 or \"Format > Style and Formatting\"\n\n    * Click on the drop down at the right top\n\n    * Select \"Load Styles\"\n\n    * Click on \"From File...\"\n\n    * Select a existing report (``company/header_A4.odt``)\n\n - Set some parameters\n\n    * Set the zoom to 100% (View>Zoom)\n\n    * Set the document in read-only mode (``File>Properties>Security``)\n      (Decreases the time it takes to open the document.)\n\n - Usage\n\n    * Use Liberation fonts (Only necessary if being officially included in\n      Tryton)\n\n    * Try to use styles in report templates so that they can be extended.\n\nUsing Genshi in an ODT file\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe Genshi code is placed in the template using Functions->Placeholder->Text\nFields. These are specific to ``*.odt`` files and can be found in the open\noffice menu at Insert -> Fields -> Other and then Functions -> Placeholder ->\nText.\nType Genshi code into the Placeholder field.\nThere are alternatives for embedding Genshi that are supported by relatorio but\ntheir use is not encouraged within Tryton.\n\nAlso note that relatorio only supports a subset of Genshi.\nThe directives that are supported by relatorio can be found here: `Quick\nExample`_ .\n\nSee Genshi's documentation for more information: `Genshi XML Template\nLanguage`_.\n\nExamples\n^^^^^^^^\n\nThe modules company, account_invoice and stock all contain helpful examples.\n\nAlso see relatorio's site for some examples:\n\n - `Quick Example`_\n\n - `In Depth Introduction`_\n\n - `Example Documents`_\n\n\nAccessing models from within the report\n---------------------------------------\n\nBy default instances of the models, the report is for, are passed in to the\nreport via a list of ``records`` (or ``record`` if ``single`` is ``True``).\nThese records behave just as they would within ``trytond`` itself.\nYou can access any of the models relations as well.\nFor example within the invoice report each record is an invoice and you can\naccess the name of the party of the invoice via ``invoice.party.name``.\nAdditional objects can be passed to a report.\nThis is discussed below in `Passing custom data to a report`_\n\nWithin Tryton the underlying model the report can be found by following the\nMenu to ``Administration > UI > Actions > Report``.\nFurthermore in Tryton the fields for that model can be found by following the\nmenu to ``Administration > Models > Models``.\nRelation fields can be accessed to any depth.\n\nCreating a simple report template for a model from client\n---------------------------------------------------------\n\nOnce you have created a report template it has to be uploaded to ``trytond``.\nThis can be done by creating a new record in the ``Administration > UI >\nActions > Report`` menu.\nJust make sure to include the template file in the content field.\n\nIn order to make the report printable from a record create a ``Print form``\nkeyword related to the model where the report should be available.\n\nCreating a simple report template for a model in XML\n----------------------------------------------------\n\nLess work has to be done if you just want a simple report representation of a\nmodel.\nFirst, create a report template file in a format supported by relatorio.\nSecond, describe your report in XML making sure to define the correct\n``report_name`` and ``model``.\n\nReplacing existing Tryton reports\n---------------------------------\n\nTo replace an existing report you must deactivate the old report and activate\nthe new report.\n\nFor example to deactivate the sale report:\n\n.. highlight:: xml\n\n::\n\n  <record model=\"ir.action.report\" id=\"sale.report_sale\">\n    <field name=\"active\" eval=\"False\"/>\n  </record>\n\nThen you must activate the new sale report that exists in your new module:\n\n.. highlight:: xml\n\n::\n\n  <record model=\"ir.action.report\" id=\"report_sale\">\n    <field name=\"name\">Sale</field>\n    <field name=\"report_name\">sale.sale</field>\n    <field name=\"model\">sale.sale</field>\n    <field name=\"report\">my_module/sale.odt</field>\n    <field name=\"template_extension\">odt</field>\n  </record>\n\nAnd create the keyword for the new report:\n\n.. highlight:: xml\n\n::\n\n  <record model=\"ir.action.keyword\" id=\"report_sale_keyword\">\n      <field name=\"keyword\">form_print</field>\n      <field name=\"model\">sale.sale,-1</field>\n      <field name=\"action\" ref=\"report_sale\"/>\n  </record>\n\nPassing custom data to a report\n-------------------------------\n\nIn this example ``Report.get_context`` is overridden and an employee\nrecord is set into context.\nNow the invoice report will be able to access the employee record.\n\n.. highlight:: python\n\n::\n\n    from tryton.pool import Pool\n    from trytond.report import Report\n\n    class InvoiceReport(Report):\n        __name__ = 'account.invoice'\n\n        @classmethod\n        def get_context(cls, records, header, data):\n            pool = Pool()\n            Employee = pool.get('company.employee')\n\n            context = super().get_context(records, header, data)\n            employee_id = Transaction().context.get('employee')\n            employee = Employee(employee_id) if employee_id else None\n            context['employee'] = employee\n\n            return context\n\n.. _Genshi XML Template Language: https://genshi.edgewall.org/wiki/Documentation/xml-templates.html\n\n.. _Quick Example: https://relatorio.readthedocs.io/en/latest/quickexample.html\n\n.. _In Depth Introduction: https://relatorio.readthedocs.io/en/latest/indepthexample.html\n\n.. _Example Documents: http://hg.tryton.org/relatorio/file/default/examples\n"
  },
  {
    "path": "doc/topics/rpc.rst",
    "content": ".. _topics-rpc:\n\n=====================\nRemote Procedure Call\n=====================\n\nThere are two protocols supported by trytond: `JSON-RPC`_ (Version 1.0) and\n`XML-RPC`_.\nThe URL of the calls must end with the database name with a trailing '/'.\n\nThe available methods are:\n\ncommon.db.login\n---------------\n\nIt takes as parameters: the user name and a dictionary of login parameters.\nIt returns in case of success the user ID and the session.\nIf the parameters are not valid to authenticate the user, it returns nothing.\nOtherwise if it misses a key in the parameters, it raises a ``LoginException``\nexception with the missing key name, type and the message to ask to the\nuser.\n\ncommon.db.logout\n----------------\n\nIt takes no parameters and it invalidate the current session.\n\n.. TODO - other methods\n\n.. _`JSON-RPC`: https://en.wikipedia.org/wiki/JSON-RPC\n.. _`XML-RPC`: https://en.wikipedia.org/wiki/XML-RPC\n\nAuthorization\n=============\n\nMost of the calls require authorization, there are two methods:\n\nBasic\n-----\n\nIt follows the `Basic access authentication`_.\n\n.. _`Basic access authentication`: https://en.wikipedia.org/wiki/Basic_access_authentication\n\nSession\n-------\n\nThe authorization field is constructed by the username, the user ID and the\nsession combined with a single colon and encoded in Base64.\nThe session is retrieved by calling the method ``common.db.login``.\n"
  },
  {
    "path": "doc/topics/setup_database.rst",
    "content": ".. _topics-setup-database:\n\n=======================\nHow to setup a database\n=======================\n\nThe database section of the :ref:`configuration <topics-configuration>` must be\nset before starting.\n\nCreate a database\n=================\n\nDepending of the database backend choosen, you must create a database (see the\ndocumentation of the choosen backend). The user running ``trytond`` must be\ngranted the priviledge to create tables. For backend that has the option, the\nencoding of the database must be set to ``UTF-8``.\n\nInitialize a database\n=====================\n\nA database can be initialized using this command line:\n\n.. code-block:: console\n\n    $ trytond-admin -c <config file> -d <database name> --all\n\nAt the end of the process, ``trytond-admin`` will ask to set the password for\nthe ``admin`` user.\n\nUpdate a database\n=================\n\nTo upgrade to a new series, the command line is:\n\n.. code-block:: console\n\n    $ trytond-admin -c <config file> -d <database name> --all\n\n.. warning::\n    Prior to upgrade see if there is no manual action to take on the `migration\n    topic`_.\n\n.. _`migration topic`: https://discuss.tryton.org/c/migration\n\nTo activate a new language on an existing database, the command line is:\n\n.. code-block:: console\n\n    $ trytond-admin -c <config file> -d <database name> --all -l <language code>\n\nOnce activated, the language appears in the user preferences.\n\nWhen installing new modules, the list of modules must be updated with:\n\n.. code-block:: console\n\n    $ trytond-admin -c <config file> -d <database name> --update-modules-list\n\nOnce updated, the new modules can be activated from the client or activated with:\n\n.. code-block:: console\n\n    $ trytond-admin -c <config file> -d <database name> -u <module name> --activate-dependencies\n"
  },
  {
    "path": "doc/topics/start_server.rst",
    "content": ".. _topics-start-server:\n\n=======================\nHow to start the server\n=======================\n\nWeb service\n===========\n\nYou can start the default web server bundled in ``trytond`` with this command\nline:\n\n.. code-block:: console\n\n    $ trytond -c <config file>\n\nThe server will wait for client connections on the interface defined in the\n``web`` section of the :ref:`configuration <topics-configuration>`.\n\n.. note::\n\n   When using multiple config files the order is important as last entered\n   files will override the items of first files\n\n.. warning::\n   This runs the of `Werkzeug`_ development server which should not be used on\n   production systems.\n\n.. _`Werkzeug`: https://werkzeug.palletsprojects.com/\n\nWSGI server\n-----------\n\nIf you prefer to run Tryton inside your own WSGI server instead of the simple\nserver of Werkzeug, you can use the application ``trytond.application.app``.\nFollowing environment variables can be set:\n\n * ``TRYTOND_CONFIG``: Point to :ref:`configuration <topics-configuration>`\n   file.\n * ``TRYTOND_LOGGING_CONFIG``: Point to :ref:`logging <topics-logs>` file.\n * ``TRYTOND_LOGGING_LEVEL``: An integer to set the default `logging level`_\n   (default: ``ERROR``).\n * ``TRYTOND_COROUTINE``: Use coroutine for concurrency.\n * ``TRYTOND_DATABASE_NAMES``: A list of database names in CSV format, using\n   python default dialect.\n\n.. warning:: You must manage to serve the static files from the web root.\n\n.. _`logging level`: https://docs.python.org/library/logging.html#logging-levels\n\nCoroutine server\n----------------\n\nThe Werkzeug server uses thread for concurrency. This is not optimal for the\nlong-polling request on the :ref:`bus <ref-bus>` as each client consumes\npermanently one thread.\nYou can start the server with coroutine using the option ``--coroutine``.\n\n.. note::\n   This will use the pure-Python, gevent-friendly `WSGI server\n   <http://www.gevent.org/api/gevent.pywsgi.html>`_.\n\nCron service\n============\n\nIf you want to run some :ref:`scheduled actions <topics-cron>`, you must also\nrun the cron server with this command line:\n\n.. code-block:: console\n\n    $ trytond-cron -c <config file> -d <database>\n\nThe server will wake up every minutes and preform the scheduled actions defined\nin the ``database``.\nYou can also launch the command every few minutes from a scheduler with the\noption ``--once``.\n\nWorker service\n==============\n\nIf you want to use a pool of workers to run :ref:`asynchronously some tasks\n<topics-task-queue>`, you must activate the worker in the ``queue`` section of\nthe :ref:`configuration <topics-configuration>` and run the worker manager with\nthis command line:\n\n.. code-block:: console\n\n    $ trytond-worker -c <config file> -d <database>\n\nThe manager will dispatch tasks from the queue to a pool of worker processes.\n\nServices options\n================\n\nYou will find more options for those services by using ``--help`` arguments.\n"
  },
  {
    "path": "doc/topics/task_queue.rst",
    "content": ".. _topics-task-queue:\n\n==========\nTask Queue\n==========\n\nTryton provides a way to run asynchronously some tasks. You must activate the\nworker in the ``queue`` section of the :ref:`configuration\n<topics-configuration>` and :ref:`run the worker manager\n<topics-start-server>` otherwise the tasks will be run at the end of the\ntransaction.\n\nA task is the parameters that defines how to call a method from a\n:class:`~trytond.model.Model`.\nThis include the :attr:`~trytond.transaction.Transaction.context`, the\n:attr:`~trytond.transaction.Transaction.user` and the arguments.\nThe first argument of the method must be an instance or a list of instances of\n:class:`~trytond.model.Model`.\nThis other arguments must be JSON-ifiable.\n\nA task is pushed into the ``queue`` by calling the desired method on the\n:attr:`~trytond.model.Model.__queue__`.\nThis stores in the queue all the current parameters of the call and it will be\nexecute by a worker or at the end of the transaction if no worker is\nconfigured.\nThe following :attr:`~trytond.transaction.Transaction.context` keys are used as\nparameters for the queue:\n\n``queue_name``\n   The name of the queue.\n   Default value is ``default``.\n\n``queue_scheduled_at``\n   A ``datetime.timedelta`` to add to current time to define when the task\n   should be started.\n   Default value is ``None`` which means directly.\n\n``queue_expected_at``\n   A ``datetime.timedelta`` to add to current time to define when the task\n   should be finished.\n   Default value is ``None`` which means as soon as possible.\n\n``queue_batch``\n   An ``integer`` to divide the instances by batch of this size.\n   If the value is ``true`` then the size is the value defined by the\n   configuration ``queue`` of ``batch_size``.\n   Default is ``None`` which means no division.\n\n.. warning::\n\n    There is no access right verification during the execution of the task.\n\nExample:\n\n.. highlight:: python\n\n::\n\n    from trytond.model import Model\n\n    class MyModel(Model):\n        \"My Model\"\n        __name__ = 'my_model'\n\n        @classmethod\n        def launch(cls, records):\n            for record in records:\n                cls.__queue__.process(record, 42)\n\n        def process(self, value):\n            self.value = value\n"
  },
  {
    "path": "doc/topics/testing.rst",
    "content": ".. _topics-testing:\n\n=======\nTesting\n=======\n\nTryton supports both functional and unit tests.\n\nTesting your module\n~~~~~~~~~~~~~~~~~~~\n\nFunctional tests\n----------------\n\nFunctional tests are written as doctests_ using proteus.\n\nUnit tests\n----------\n\nTryton provides the :class:`~trytond.tests.test_tryton.ModuleTestCase` class\nthat bundles a set of tests that are useful for every module.\n\nUnit tests in :class:`~trytond.tests.test_tryton.ModuleTestCase` can be\ndecorated with :func:`~trytond.tests.test_tryton.with_transaction` to run the\ntest in a transaction.\n\nTo use it in your own module you just have to inherit from\n:class:`~trytond.tests.test_tryton.ModuleTestCase` and set the class attribute\n:attr:`~trytond.tests.test_tryton.ModuleTestCase.module` to the name of your\nmodule.\n\n.. code-block:: python\n\n    from trytond.tests.test_tryton import ModuleTestCase, with_transaction\n\n    class MyModuleTestCase(ModuleTestCase):\n        \"My Module Test Case\"\n        module = 'my_module'\n\n        @with_transaction()\n        def test_method(self):\n            \"Test method\"\n            self.assertTrue(True)\n\n    del ModuleTestCase\n\n\n.. note::\n   The ``ModuleTestCase`` must be deleted to not be discovered by ``unittest``\n   as it fails to run without module declaration.\n\n.. _doctests: https://docs.python.org/library/doctest.html\n.. _unittest: https://docs.python.org/library/unittest.html\n\nRunning trytond's tests\n-----------------------\n\nYou can run a specific test file using ``unittest`` command line like:\n\n.. code-block:: console\n\n   $ python -m unittest trytond.tests.test_tools\n\nTo run all trytond's tests using discover of ``unittest`` with:\n\n.. code-block:: console\n\n   $ python -m unittest discover -s trytond.tests\n\nTo run all modules tests:\n\n.. code-block:: console\n\n   $ python -m unittest discover -s trytond.modules\n\n\nRunning your module's tests\n---------------------------\n\nYou just need to replace the directory path with the one of your module:\n\n.. code-block:: console\n\n   $ python -m unittest discover -s trytond.modules.my_module.tests\n\nExtending trytond's tests\n-------------------------\n\nPython modules extending ``trytond`` core can define additional classes to\nregister in ``tests`` module.\nThose modules must create an entry point ``trytond.tests`` which defines a\n``register`` function to be called with the module name.\n\nTesting options\n~~~~~~~~~~~~~~~\n\nTryton runs tests against the configured database backend.\nYou can specify the name of the database to use via the environment variable\n``DB_NAME``.\nOtherwise it generates a random name.\n\nA configuration file can be used by setting its path to the environment\nvariable ``TRYTOND_CONFIG``.\n\nThe tests recreate frequently the database. You can accelerate the creation by\nsetting a cache directory in ``DB_CACHE`` environment which will be used to\ndump and restore initial databases backups.\n"
  },
  {
    "path": "doc/topics/translation.rst",
    "content": ".. _topics-translation:\n\n===========\nTranslation\n===========\n\nThe translation of the user interface is provided module-wise.\nTranslations are stored in the ``locale/`` directory of a module, each language\nin a `PO-file <https://en.wikipedia.org/wiki/Gettext#Translating>`_.\nThe official language files are named after the `POSIX locale\n<https://en.wikipedia.org/wiki/Locale_(computer_software)#POSIX_platforms>`_\nstandard, e.g. de.po, es.po, es_AR.po, es_EC.po...\n\nThe names of custom language files must match the code of the language in the\n:class:`~trytond.model.Model` ``ir.lang``.\n\nIf a language is set ``translatable``, the translations is loaded into the\ndatabase on each update.\n\nTryton supports derivative translations. This means that if the translation of\na term is missing in one language, it will search on the parent languages.\nAlso when activate a children language, you must also activate all parents.\n\nTranslation Wizards\n===================\n\nSet Translations\n----------------\n\nThe wizard adds new translations to the base language ``en``.\n\nClean Translations\n------------------\n\nThe wizard deletes obsolete translations from the database.\n\nSynchronize Translations\n------------------------\n\nThe wizard updates the translations of the selected language based on the\ntranslations of the base language ``en``. It will also remove duplicate\ntranslations with its direct parent.\n\nExport Translations\n-------------------\n\nThe wizard requires to select a language and a module and will export the\ntranslations for this selection into a PO-file.\n\n\nOverride translations\n=====================\n\nTranslations of a module can be overridden by another module.\nThis can be done by putting a PO file into the :file:`locale/override`\ndirectory of the module that shall contain the translations to override.\n\nTo override the translation of another module the ``msgctxt`` string must have\nthe following content: ``type:name:module.xml_id``\n\ntype\n   The field type of ir.translation.\nname\n   The field name of ir.translation.\nmodule\n   The field module ir.translation.\nxml_id\n   The XML id that is stored in ``ir.model.data`` as ``fs_id``.\n   It is optional and can be omitted if it is None.\n"
  },
  {
    "path": "doc/topics/triggers.rst",
    "content": ".. _topics-triggers:\n\n========\nTriggers\n========\n\nTriggers allow to define methods of :class:`~trytond.model.Model` that are\ncalled at the end of the transaction when one of those events happen to a\nrecord:\n\n* On Creation\n* On Modification\n* On Deletions\n* On Time: When a condition changes over time.\n\nThe method signature is::\n\n    <method name>(cls, records, trigger)\n\nWhere ``records`` is the list of records that triggered the event and\n``trigger`` is the ``ir.trigger`` instance which is triggered.\n\nTriggers are defined by records of ``ir.trigger``. Each record must define a\npyson condition which will be evaluated when the event occurs. Only those\nrecords for which the condition is evaluated to true will be processed by the\ntrigger with the exception of modification triggers which will only process the\nrecords for which the condition is evaluated to false before and evaluated to\ntrue after the modification.\n"
  },
  {
    "path": "doc/topics/user_application.rst",
    "content": ".. _topics-user_application:\n\n================\nUser Application\n================\n\nTryton provides a way to connect URL rules to an callable endpoint using the\ndecorator method ``route`` of the ``trytond.wsgi.app`` instance. This\nallows you to define a custom API based on HTTP that can be used to create a\nspecific user application.\n\nThe decorator takes as first parameter a string which follow the `Rule\nFormat`_ of Werkzeug and as second parameter sequence of HTTP methods.\n\nExample::\n\n    from trytond.wsgi import app\n\n    @app.route('/hello', methods=['GET'])\n    def hello(request):\n        return 'Hello world'\n\n.. _Rule Format: http://werkzeug.pocoo.org/docs/latest/routing/#rule-format\n\nThe following converter is added by Tryton:\n\n``base64``\n   This converter accepts any Base64_ string and transforms it into its\n   corresponding bytes value.\n\n.. _Base64: https://en.wikipedia.org/wiki/Base64\n\nTryton also provides some wrappers in ``trytond.protocols.wrappers`` to ease the\ncreation of such route.\n\n``set_max_request_size(size)``\n   Change the default limit of the request to the size in bytes.\n\n``allow_null_origin``\n   Allow requests which have their ``Origin`` set to ``null``.\n\n``with_pool``\n   Take the first parameter as database name and replace it by the\n   corresponding instance of the :ref:`Pool <ref-pool>`.\n\n``with_transaction([readonly])``\n   Start a :class:`~trytond.transaction.Transaction` using the :ref:`Pool\n   <ref-pool>` from ``with_pool``.\n   If ``readonly`` is not set, the transaction will not be readonly for\n   ``POST``, ``PUT``, ``DELETE`` and ``PATCH`` methods and readonly for all\n   others.\n\n``user_application(name[, json])``\n   Set the :attr:`~trytond.transaction.Transaction.user` from the\n   ``Authorization`` header using the type ``bearer`` and a valid key for the\n   named user application.\n\nUser Application Key\n====================\n\nTryton also provides a easy way to manage access to user application using\nkeys per named application.\nA key is created with a ``POST`` request on the ``URL``\n``/<database_name>/user/application/`` which returns the key. The request must\ncontain as data a JSON object with the keys:\n\n``user``\n   The user login.\n\n``application``\n   The name of the application.\n\nAfter the creation, the key must be validated by the user from the preferences\nof a Tryton client.\n\nA key can be deleted with a ``DELETE`` request on the same ``URL``. The request\nmust contain as data a JSON object with the keys:\n\n``user``\n   The user login.\n\n``key``\n   The key to delete.\n\n``application``\n   The name of the application of the key.\n"
  },
  {
    "path": "doc/topics/user_errors_warnings.rst",
    "content": ".. _topics-user_errors_warnings:\n\n========================\nUser Errors and Warnings\n========================\n\nWhen processing a request, you can stop the flow by raising an exception that\nwill be displayed to the user as an error message or a warning. They are\nrespectively :exc:`~trytond.exceptions.UserError` and\n:exc:`~trytond.exceptions.UserWarning`.\n\nUser Errors\n===========\n\nAn error displays a message and optionally a description to the user.\n\nExample:\n\n.. highlight:: python\n\n::\n\n    from trytond.exceptions import UserError\n    from trytond.model import Model\n\n    class MyModel(Model):\n        \"My Model\"\n        __name__ = 'my_model'\n\n        def process(self):\n            if check_failed:\n                raise UserError(\"You cannot process.\", \"because…\")\n\n.. note::\n    They are often used in combination with :meth:`~trytond.i18n.gettext` to\n    translate the messages.\n\nUser Warnings\n=============\n\nA warning displays a confirmation message with optionally a description to the\nuser. The user can decide to continue so the request is processed again without\nstopping at the warning. Otherwise the user can cancel its request.\nThe warning instance is identified by a name which allows to skip it the next\ntime it is checked, that's why they often build using the ``format`` method\nwhich uses record instances to generate a unique name based on ids.\n\nExample:\n\n.. highlight:: python\n\n::\n\n    from trytond.exceptions import UserWarning\n    from trytond.model import Model\n    from trytond.pool import Pool\n\n    class MyModel(Model):\n        \"My Model\"\n        __name__ = 'my_model'\n\n        def process(self):\n            pool = Pool()\n            Warning = pool.get('res.user.warning')\n            warning_name = Warning.format('mywarning', [self])\n            if Warning.check(warning_name):\n                raise UserWarning(warning_name, \"Process cannot be canceled.\")\n\n.. note::\n    If there is no user interaction the warnings can be skipped by setting the\n    ``_skip_warnings`` key of the context to ``True``.\n"
  },
  {
    "path": "doc/topics/views/extension.rst",
    "content": ".. _topics-extension:\n\n==============\nExtending View\n==============\n\nExtending a view means, that the original view will be modified by a set of\nrules which are defined with XML.\nFor this purpose, the extension engine uses XPath_ expressions.\nThe view is defined with the field ``inherit`` of the ``ir.ui.view``.\n\nIf the field :ref:`domain <topics-domain>` is not set or evaluated to ``True``,\nthe inheritance will be proceeded.\n\n.. _XPath: https://en.wikipedia.org/wiki/XPath\n\nExample:\n\n.. highlight:: xml\n\n::\n\n  <data>\n      <xpath\n          expr=\"/form/notebook/page/separator[@name=&quot;signature&quot;]\"\n          position=\"before\">\n          <label name=\"company\"/>\n          <field name=\"company\"/>\n          <label name=\"employee\"/>\n          <field name=\"employee\"/>\n      </xpath>\n  </data>\n\ndata\n----\n\nEach view must start with this tag.\n\nxpath\n-----\n\n``expr``\n   The XPath expression to find the nodes in the inherited view.\n\n``position``\n   Define the position in relation to the nodes found.\n   It can be ``before``, ``after``, ``replace``, ``inside`` or\n   ``replace_attributes`` which will change the attributes.\n"
  },
  {
    "path": "doc/topics/views/index.rst",
    "content": ".. _topics-views:\n\n=====\nViews\n=====\n\nThe views are used to display records of an :class:`ModelView\n<trytond.model.ModelView>` to the user.\n\nIn Tryton, :class:`ModelView <trytond.model.ModelView>` can have several views.\nAn ``action`` opens a window and defines which view to show.\n\nThe views are built from XML that is stored in the :file:`view` directory of\nthe module or in the databases thanks to the model ir.ui.view.\n\nSo generally, they are defined in XML files with this kind of XML where name is\nthe name of the XML file in the :file:`view` directory:\n\n.. highlight:: xml\n\n::\n\n  <record model=\"ir.ui.view\" id=\"view_id\">\n      <field name=\"model\">model name</field>\n      <field name=\"type\">type name</field>\n      <!--field name=\"inherit\" ref=\"inherit_view_id\"/-->\n      <!--field name=\"field_childs\">field name</field-->\n      <field name=\"name\">view_name</field>\n  </record>\n\n\nThere are different types of views:\n\n.. contents::\n   :local:\n   :backlinks: entry\n   :depth: 2\n\nSome attributes are shared by many form elements:\n\n.. _common-attributes-id:\n\n``id``\n   A unique identifier for the tag if there is no name attribute.\n\n.. _common-attributes-yexpand:\n\n``yexpand``\n   A boolean to specify if the label should expand to take up any extra\n   vertical space.\n\n.. _common-attributes-yfill:\n\n``yfill``\n   A boolean to specify if the label should fill the vertical space allocated\n   to it in the table cell.\n\n.. _common-attributes-yalign:\n\n``yalign``\n   The vertical alignment, from 0.0 to 1.0.\n\n.. _common-attributes-xexpand:\n\n``xexpand``\n   The same as ``yexpand`` but for horizontal space.\n\n.. _common-attributes-xfill:\n\n``xfill``\n   The same as ``yfill`` but for horizontal space.\n\n.. _common-attributes-xalign:\n\n``xalign``\n   The horizontal alignment, from ``0.0`` to ``1.0``.\n\n.. _common-attributes-colspan:\n\n``colspan``\n   The number of columns the widget must take in the table.\n\n.. _common-attributes-col:\n\n``col``\n   The number of columns the container must have.\n   A negative value (or zero) remove the constraint on the number of columns.\n   The default value is ``4``.\n\n.. _common-attributes-states:\n\n``states``\n   A string of :ref:`PYSON statement <topics-pyson>` that is evaluated with the\n   values of the current record.\n\n   It must return a dictionary where keys can be:\n\n   ``invisible``\n      If true, the widget is hidden.\n\n   ``required``\n      If true, the field is required.\n\n   ``readonly``\n      If true, the field is readonly.\n\n   ``icon``\n      Only for button, it must return the icon name to use or False.\n\n   ``pre_validate``\n      Only for button, it contains a domain to apply on the record before\n      calling the button.\n\n   ``depends``\n      Only for button, it must return the list of field on which the button\n      depends.\n\n.. _common-attributes-help:\n\n``help``\n   The string that is displayed when the cursor hovers over the widget.\n\n.. _common-attributes-pre_validate:\n\n``pre_validate``\n   A boolean only for fields :class:`trytond.model.fields.One2Many` to specify\n   if the client must pre-validate the records using\n   :meth:`trytond.model.Model.pre_validate`.\n\n.. _common-attributes-completion:\n\n``completion``\n   A boolean only for fields :class:`trytond.model.fields.Many2One`,\n   :class:`trytond.model.fields.Many2Many` and\n   :class:`trytond.model.fields.One2Many` to specify if the client must\n   auto-complete the field.\n   The default value is ``True``.\n\n.. _common-attributes-create:\n\n``create``\n   A boolean to specify if the user can create targets from the widget.\n   The default value is ``True``.\n\n``delete``\n   A boolean to specify if the user can delete targets from the widget.\n   The default value is ``True``.\n\n.. _common-attributes-factor:\n\n``factor``\n   A factor to apply on fields :class:`trytond.model.fields.Integer`,\n   :class:`trytond.model.fields.Float` and\n   :class:`trytond.model.fields.Numeric` to display on the widget.\n   The default value is ``1``.\n\n.. _common-attributes-symbol:\n\n``symbol``\n   Only on numerical fields, the name of field which provides the symbol to\n   display.\n\n.. _common-attributes-grouping:\n\n``grouping``\n   A boolean only on numerical fields to specify if the client must use\n   grouping separators to display on the widget.\n   The default value is ``True``.\n\n.. _common-attributes-help_field:\n\n``help_field``\n   The name of Dict field mapping the Selection value with its help string.\n\n\nForm\n====\n\nA form view is used to display one record.\n\nElements of the view are put on the screen following the rules:\n\n    * Elements are placed on the screen from left to right, from top to bottom,\n      according to the order of the XML.\n\n    * The screen composed of a table with a fixed number of columns and enough\n      rows to handle all elements.\n\n    * Elements take one or more columns when they are put in the table. If\n      there are not enough free columns on the current row, the elements are put\n      at the beginning of the next row.\n\n.. _example_form_view:\n\nExample:\n\n.. highlight:: xml\n\n::\n\n  <form col=\"6\">\n      <label name=\"name\"/>\n      <field name=\"name\" xexpand=\"1\"/>\n      <label name=\"code\"/>\n      <field name=\"code\"/>\n      <label name=\"active\"/>\n      <field name=\"active\" xexpand=\"0\" width=\"100\"/>\n      <notebook colspan=\"6\">\n          <page string=\"General\">\n              <field name=\"addresses\" mode=\"form,tree\" colspan=\"4\"\n                  view_ids=\"party.address_view_form,party.address_view_tree_sequence\"/>\n              <label name=\"type\"/>\n              <field name=\"type\" widget=\"selection\"/>\n              <label name=\"lang\"/>\n              <field name=\"lang\" widget=\"selection\"/>\n              <label name=\"website\"/>\n              <field name=\"website\" widget=\"url\"/>\n              <separator string=\"Categories\" colspan=\"4\"/>\n              <field name=\"categories\" colspan=\"4\"/>\n          </page>\n          <page string=\"Accounting\">\n              <label name=\"vat_country\"/>\n              <field name=\"vat_country\"/>\n              <label name=\"vat_number\"/>\n              <field name=\"vat_number\"/>\n          </page>\n      </notebook>\n  </form>\n\nThe RNG describing the XML of a form view is stored in\n``trytond/ir/ui/form.rng``.\nThere is also a RNC in ``trytond/ir/ui/form.rnc``.\n\n\nform\n----\n\nEach form view must start with this tag with those attributes:\n\n.. _form-attributes-on_write:\n\n``on_write``\n   The name of a method on the Model of the view that is called when a record\n   is saved.\n   The method must return a list of record ids that the client must reload if\n   they are already loaded.\n   The function must have this syntax:\n\n      ``on_write(self, ids)``\n\n   .. note::\n      The method must be registered in :attr:`trytond.model.Model.__rpc__`.\n\n``creatable``\n   A boolean to specify if the form can be used to create new record.\n   The default value is ``True``.\n\n``cursor``\n   The name of the field that must have the cursor by default.\n\n:ref:`col <common-attributes-col>`.\n\n.. _form-label:\n\nlabel\n-----\n\nDisplay static string with those attributes:\n\n``string``\n   The string that is displayed in the label.\n\n``name``\n   The name of the field whose description is used for string.\n   Except if ``string`` is set, it uses this value and the value of the\n   field if ``string`` is empty.\n\n:ref:`id <common-attributes-id>`,\n:ref:`yexpand <common-attributes-yexpand>`,\n:ref:`yfill <common-attributes-yfill>`,\n:ref:`yalign <common-attributes-yalign>`,\n:ref:`xexpand <common-attributes-xexpand>`,\n:ref:`xfill <common-attributes-xfill>`,\n:ref:`xalign <common-attributes-xalign>`,\n:ref:`colspan <common-attributes-colspan>`,\n:ref:`states <common-attributes-states>`,\n:ref:`help <common-attributes-help>`.\n\nIt requires that either ``id`` or ``name`` is defined.\n\nfield\n-----\n\nDisplay a field of the object with the value of the current record with those\nattributes:\n\n``name``\n   The name of the field.\n\n``string``\n   The string that is displayed for the widget.\n\n``widget``\n   The widget that must be used instead of the default one.\n\n``help``\n   The string that is displayed when the cursor stays over the widget.\n\n``width``\n   The minimum width the widget should request, or -1 to unset.\n\n``height``\n   The minimum height the widget should request, or -1 to unset.\n\n``readonly``\n   Boolean to set the field readonly.\n\n``mode``\n   It is a comma separated list, that specifies the order of the view used to\n   display the relation. (Example: ``tree,form``)\n   Only for :class:`~trytond.model.fields.One2Many` fields.\n\n``view_ids``\n   A comma separated list that specifies the view ids used to display the\n   relation.\n   For :class:`~trytond.model.fields.Many2One` and\n   :class:`~trytond.model.fields.Many2Many`, the order should always be\n   ``tree`` then ``form``.\n\n``product``\n   Only for :class:`~trytond.model.fields.One2Many` fields, a comma separated\n   list of target field name used to create records from the Cartesian product.\n\n``completion``\n   Only for :class:`~trytond.model.fields.Many2One` fields, it is a boolean to\n   set the completion of the field.\n\n``invisible``\n   The field is not displayed, but it fills cells in the table.\n\n``filename_visible``\n   Only for :class:`~trytond.model.fields.Binary` fields, boolean that enables\n   the display of the filename.\n\n``toolbar``\n   Only for Rich Text widget, boolean that enables the display of the Rich Text\n   toolbar.\n   The default value is ``True``.\n\n``spell``\n   Only for Text widgets, a :ref:`PYSON statement <topics-pyson>` that is\n   evaluated to the language code for which spell checking must be done.\n\n:ref:`yexpand <common-attributes-yexpand>`,\n:ref:`yfill <common-attributes-yfill>`,\n:ref:`xexpand <common-attributes-xexpand>`,\n:ref:`xfill <common-attributes-xfill>`,\n:ref:`colspan <common-attributes-colspan>`,\n:ref:`help <common-attributes-help>`,\n:ref:`pre_validate <common-attributes-pre_validate>`,\n:ref:`completion <common-attributes-completion>`,\n:ref:`factor <common-attributes-factor>`,\n:ref:`symbol <common-attributes-symbol>`,\n:ref:`help_field <common-attributes-help_field>`.\n\n.. _form-image:\n\nimage\n-----\n\nDisplay an image with those attributes:\n\n``type``\n   The type of image source. Available values are ``icon`` or ``url``.\n   The default value is ``icon``.\n\n``name``\n   The image name or the field name which contains the image name.\n   For the ``icon`` type it must be the name of a record of ``ir.ui.icon``.\n   For the ``url`` type it must be the URL. It can be relative to the server.\n\n``url_size``\n   The name of the size parameter to add to the URL.\n\n``size``\n   The size of the image in pixels.\n   The default value is ``48``.\n\n:ref:`yexpand <common-attributes-yexpand>`,\n:ref:`yfill <common-attributes-yfill>`,\n:ref:`colspan <common-attributes-colspan>`,\n:ref:`states <common-attributes-states>`,\n:ref:`help <common-attributes-help>`.\n\n.. _form-separator:\n\nseparator\n---------\n\nDisplay a horizontal separator with those attributes:\n\n``string``\n   The string that is displayed above the separator.\n\n``name``\n   The name of the field from which the description is used for string.\n\n:ref:`id <common-attributes-id>`,\n:ref:`yexpand <common-attributes-yexpand>`,\n:ref:`yfill <common-attributes-yfill>`,\n:ref:`colspan <common-attributes-colspan>`,\n:ref:`states <common-attributes-states>`,\n:ref:`help <common-attributes-help>`.\n\nIt requires that either ``id`` or ``name`` is defined.\n\n.. _form-newline:\n\nnewline\n-------\n\nForce to use a new row.\n\n\n.. _form-button:\n\nbutton\n------\n\nDisplay a button with those attributes:\n\n``name``\n   The name of the function that is called on click.\n   The function must have this syntax:\n\n        ``button(cls, records)``\n\n   The function may return an ``ir.action`` id or one of those client side\n   action keywords:\n\n   .. _topics-views-client-actions:\n\n   ``new``\n      to create a new record\n   ``delete``\n      to delete the selected records\n   ``remove``\n      to remove the record if it has a parent\n   ``copy``\n      to copy the selected records\n   ``next``\n      to go to the next record\n   ``previous``\n      to go to the previous record\n   ``close``\n      to close the current tab\n   ``switch <view type> [<view id>]``\n      to switch the view\n   ``reload``\n      to reload the current tab\n   ``reload context``\n      to reload user context\n   ``reload menu``\n      to reload menu\n\n``icon``\n   The name of an icon to display in the button.\n\n``confirm``\n   A text that is displayed in a confirmation pop-up when the button is\n   clicked.\n\n``keyword``\n   Specify where the button is displayed in the client toolbar.\n   The valid values are the keywords starting with ``form_`` from :ref:`Actions\n   <topics-actions>` without the ``form_`` part.\n\n:ref:`colspan <common-attributes-colspan>`,\n:ref:`states <common-attributes-states>`,\n:ref:`help <common-attributes-help>`.\n\n.. warning::\n    The button should be registered on ``ir.model.button`` where the default\n    value of the ``string``, ``confirm`` and ``help`` attributes can be can be\n    defined.\n\n.. _form-link:\n\nlink\n----\n\nDisplay an ``ir.action.act_window`` as a button with a counter or one counter\nper tab.\nWhen clicked it opens the window.\nThe available attributes are:\n\n``name``\n   The XML id of ``ir.action.act_window``.\n\n``icon``\n   The name of the icon to display.\n\n``empty``\n   If set to ``hide`` the button is not displayed if the counter is zero.\n   The default is ``show``.\n\n:ref:`colspan <common-attributes-colspan>`,\n:ref:`states <common-attributes-states>`.\n\n.. _form-notebook:\n\nnotebook\n--------\n\nDisplay a notebook which can contain ``page`` tags with the attributes:\n\n:ref:`colspan <common-attributes-colspan>`,\n:ref:`states <common-attributes-states>`.\n\n.. _form-page:\n\npage\n----\n\nDefine a tab inside a ``notebook`` with the attributes:\n\n``string``\n   The string that is displayed in the tab.\n\n``angle``\n   The angle in degrees between the baseline of the label and the horizontal,\n   measured counterclockwise.\n\n:ref:`col <common-attributes-col>`,\n:ref:`id <common-attributes-id>`,\n:ref:`states <common-attributes-states>`.\n\nIt requires that either ``id`` or ``name`` is defined.\n\n.. _form-group:\n\ngroup\n-----\n\nGroup widgets inside a sub-form with the attributes:\n\n``string``\n   If set a frame is drawn around the field with a label containing the string.\n   Otherwise, the frame is invisible.\n\n``rowspan``\n   The number of rows the group spans in the table.\n\n``expandable``\n   If this attribute is present the content of the group is expandable by the\n   user to reveal its content.\n   A value of ``1`` means that the group starts expanded, a value of ``0``\n   means that the group starts unexpanded.\n   There is no default value.\n\n``homogeneous``\n   If ``True`` all the tables cells are the same size.\n\n\n:ref:`col <common-attributes-col>`,\n:ref:`id <common-attributes-id>`,\n:ref:`yexpand <common-attributes-yexpand>`,\n:ref:`yfill <common-attributes-yfill>`,\n:ref:`yalign <common-attributes-yalign>`,\n:ref:`xexpand <common-attributes-xexpand>`,\n:ref:`xfill <common-attributes-xfill>`,\n:ref:`xalign <common-attributes-xalign>`,\n:ref:`colspan <common-attributes-colspan>`,\n:ref:`states <common-attributes-states>`.\n\nIt requires that either ``id`` or ``name`` is defined.\n\n.. _form-paned:\n\nhpaned, vpaned\n--------------\n\n``position``\n   The pixel position of divider, a negative value means that the position is\n   unset.\n\n:ref:`id <common-attributes-id>`,\n:ref:`colspan <common-attributes-colspan>` (the default value is ``4``).\n\n.. _form-child:\n\nchild\n-----\n\nDefine the two children of a ``hpaned`` or ``vpaned``.\n\nTree\n====\n\nA tree view is used to display records inside a list or a tree.\n\nIt is a tree if there is a ``field_childs`` defined and this tree has the drag\nand drop activated if the ``field_childs`` and the ``parent field`` are defined\nin the ``ir.ui.view`` record.\n\nThe columns of the view are put on the screen from left to right.\n\n.. _example_tree_view:\n\nExample:\n\n.. highlight:: xml\n\n::\n\n  <tree sequence=\"sequence\">\n      <field name=\"name\"/>\n      <field name=\"percentage\">\n          <suffix name=\"percentage\" string=\"%\"/>\n      </field>\n      <field name=\"group\"/>\n      <field name=\"type\"/>\n      <field name=\"active\"/>\n      <field name=\"sequence\" tree_invisible=\"1\"/>\n  </tree>\n\nThe RNG that describes the XML for a tree view is stored in\n``trytond/ir/ui/tree.rng``.\nThere is also a RNC in ``trytond/ir/ui/tree.rnc``.\n\n\ntree\n----\n\nEach tree view must start with this tag with those attributes:\n\n``editable``\n   A boolean to specify if the list is editable.\n\n``creatable``\n   A boolean to specify if the editable list can be used to create new record.\n   The default value is ``true``.\n\n``sequence``\n   The name of the field that is used for sorting.\n   This field must be an integer and it is updated to match the new sort order\n   when the user uses \"Drag and Drop\" on list rows.\n\n``keyword_open``\n   A boolean to specify if the client should look for a tree_open action on\n   double click instead of switching view.\n\n``tree_state``\n   A boolean to specify if the client should save the state of the tree.\n\n``visual``\n   A :ref:`PYSON statement <topics-pyson>` that is evaluated as string\n   ``muted``, ``success``, ``warning`` or ``danger`` with the context of the\n   record to provide a visual context to the row.\n\n:ref:`on_write <form-attributes-on_write>`.\n\nfield\n-----\n\n``name``\n   The name of the field.\n\n``readonly``\n   A boolean to set the field readonly.\n\n``widget``\n   The widget that must be used instead of the default one.\n\n``tree_invisible``\n   A string of :ref:`PYSON statement <topics-pyson>` that is evaluated as\n   boolean with the context of the view to display or not the column.\n\n``optional``\n   A boolean to define if the column is hidden or not.\n   Defining the optional attribute allows each user to show/hide the column.\n   The attribute value is used as default when the user has no custom setting\n   for it.\n\n``visual``\n   A :ref:`PYSON statement <topics-pyson>` that is evaluated as string\n   ``muted``, ``success``, ``warning`` or ``danger`` with the context of the\n   record to provide a visual context to the field.\n\n``icon``\n   The name of the field that contains the name of the icon to display in the\n   column.\n\n``sum``\n   A text for the sum widget that is added on the bottom of list with the sum\n   of all the fields in the column.\n\n``width``\n   The width of the column.\n\n``expand``\n   An integer that specifies if the column should be expanded to take available\n   extra space in the view.\n   This space is shared proportionally among all columns that have their\n   ``expand`` attribute set.\n   Resize doesn't work if this option is enabled.\n\n:ref:`pre_validate <common-attributes-pre_validate>`,\n:ref:`completion <common-attributes-completion>`,\n:ref:`factor <common-attributes-factor>`,\n:ref:`symbol <common-attributes-symbol>`,\n:ref:`help_field <common-attributes-help_field>`.\n\nprefix, suffix\n--------------\n\nA ``field`` could contain one or many ``prefix`` or ``suffix`` that is\ndisplayed in the same column with the attributes:\n\n``string``\n   The text that is displayed.\n\n``name``\n   The name of the field whose value is displayed.\n\n``icon``\n   The image name or the field name which contains the image name.\n   For the ``icon`` type it must be the name of a record of ``ir.ui.icon``.\n   For the ``url`` type it must be the URL and it can be relative to the server.\n\n``icon_type``\n   The type of icon source. Available values are ``icon`` or ``url``.\n   The default value is ``icon``.\n\n``url_size``\n   The name of the size parameter to add to the URL.\n\nbutton\n------\n\nSame as form-button_.\n\nList-Form\n=========\n\nA List-forms view displays records as a list of editable forms.\nIt uses the same schema as the form views.\n\n.. note:: The performance of the list-form does not allow to scale well for\n          large number of records\n\nGraph\n=====\n\nA graph view is used to display records in graph.\n\n.. _example_graph_view:\n\nExample:\n\n.. highlight:: xml\n\n::\n\n  <graph string=\"Invoice by date\" type=\"vbar\">\n    <x>\n        <field name=\"invoice_date\"/>\n    </x>\n    <y>\n        <field name=\"total_amount\"/>\n    </y>\n  </graph>\n\n\nThe RNG that describes the XML for a graph view is stored in\n``trytond/ir/ui/graph.rng``.\nThere is also a RNC in ``trytond/ir/ui/graph.rnc``.\n\ngraph\n-----\n\nEach graph view must start with this tag with those attributes:\n\n``type``\n   The type of graph: ``vbar``, ``hbar``, ``line``, ``pie``.\n\n``background``\n   An hexadecimal value for the color of the background.\n\n``color``\n   The main color.\n\n``legend``\n   A boolean to specify if the legend must be displayed.\n\nx, y\n----\n\nDescribe the field that must be used for axis.\n``x`` must contain only one tag ``field`` and ``y`` must at least one but may\ncontain many.\n\nfield\n-----\n\n``name``\n   The name of the field on the record to use.\n\n``string``\n   The string to use as label for the field.\n\n``key``\n   Used to distinguish fields with the same name but with different domain.\n\n``domain``\n   A :ref:`PySON statement <topics-pyson>` which is evaluated with the record\n   value as context.\n   If the result is true the field value is added to the graph.\n\n``fill``\n   Define if the graph is filled.\n\n``empty``\n   Define if the line graph must put a point for missing dates.\n\n``color``\n   The color of the field.\n\n``interpolation``\n   Define how the line graph must interpolate points.\n   The default is ``linear``.\n\n   ``constant-center``\n      Use the value of the nearest point, see `Nearest-neighbor interpolation`_\n\n   ``constant-left``\n      Use the value of the nearest left point.\n\n   ``constant-right``\n      Use the value of the nearest right point.\n\n   ``linear``\n      See `linear interpolation`_\n\n.. _`Nearest-neighbor interpolation`:\n    http://en.wikipedia.org/wiki/Nearest-neighbor_interpolation\n.. _`linear interpolation`: http://en.wikipedia.org/wiki/Linear_interpolation\n\n\nBoard\n=====\n\nBoard view is used to display multiple views at once.\n\nElements are put on the screen following the same rules as for ``Form`` view.\n\nThe views can be updated by the selection of records on an other view inside\nthe same board by using in the domain the ``active_id`` or ``active_ids`` from\nthe ``_actions`` dictionary with the action id of the other view as key.\nFor example:\n.. highlight:: xml\n\n::\n\n   <field\n      name=\"domain\"\n      pyson=\"1\"\n      eval=\"[('field', '=', Eval('_actions', {}).get('module.action_id', {}).get('active_id'))]\"/>\n\nThe RNG that describes the XML for a board view is stored in\n``trytond/ir/ui/board.rng``.\nThere is also a RNC in ``trytond/ir/ui/graph.rnc``.\n\nboard\n-----\n\nEach board view must start with this tag with the attribute:\n\n:ref:`col <common-attributes-col>`.\n\nimage\n-----\n\nSame as form-image_.\n\nseparator\n---------\n\nSame as form-separator_.\n\nlabel\n-----\n\nSame as form-label_.\n\nnewline\n-------\n\nSame as form-newline_.\n\nnotebook\n--------\n\nSame as form-notebook_.\n\npage\n----\n\nSame as form-page_.\n\ngroup\n-----\n\nSame as form-group_.\n\nhpaned, vpaned\n--------------\n\nSame as form-paned_.\n\nchild\n-----\n\nSame as form-child_.\n\naction\n------\n\n``name``\n   The id of the action window.\n\n:ref:`colspan <common-attributes-colspan>`.\n\nCalendar\n========\n\nCalendar view is use to display records as events on a calendar based on a\n``dtstart`` and optionally a ``dtend``.\n\nExample:\n\n.. highlight:: xml\n\n::\n\n  <calendar dtstart=\"planned_date\">\n      <field name=\"code\"/>\n      <field name=\"product\"/>\n      <field name=\"reference\"/>\n  </calendar>\n\nThe RNG that describes the XML for a calendar view is stored in\n``trytond/ir/ui/calendar.rng``.\nThere is also a RNC in ``trytond/ir/ui/calendar.rnc``.\n\ncalendar\n--------\n\nEach calendar view must start with this tag with those attributes:\n\n``dtstart``\n   The name of the field that contains the start date.\n\n``dtend``\n   The name of the field that contains the end date.\n\n``mode``\n   An optional name for the mode that is used first.\n   Available views are: ``day``, ``week`` and ``month``.\n   The default value is ``month``.\n\n``editable``\n   A boolean to specify if the calendar is editable.\n   The default value is ``True``.\n\n``color``\n   An optional field name that contains the text color for the event.\n   The default value is ``black``.\n\n``background_color``\n   An optional field name that contains the background color for the event.\n   The default value is ``lightblue``.\n\n``width``\n   The minimum width the calendar should request, use -1 to unset.\n\n``height``\n   The minimum height the calendar should request, use -1 to unset.\n\nfield\n-----\n\n``name``\n   The name of the field.\n"
  },
  {
    "path": "doc/topics/wizard.rst",
    "content": ".. _topics-wizard:\n\n======\nWizard\n======\n\nA wizard describes a series of steps defined as :class:`~trytond.wizard.State`.\nThe wizard stores data in ``ir.session.wizard`` between states.\n\nThe basics:\n\n   * Each wizard is a Python class that subclasses\n     :class:`~trytond.wizard.Wizard`.\n\n   * The states of the wizard are attributes that are instances of\n     :class:`~trytond.wizard.State`.\n\nThis example defines a wizard which export translations:\n\n.. highlight:: python\n\n::\n\n    from trytond.wizard import Wizard, StateView, StateTransition, Button\n    from trytond.pool import Pool\n\n    class TranslationExport(Wizard):\n        \"Export translation\"\n        __name__ = 'ir.translation.export'\n\n        start = StateView(\n            'ir.translation.export.start',\n            'ir.translation_export_start_view_form', [\n                Button(\"Cancel\", 'end', 'tryton-cancel'),\n                Button(\"Export\", 'export', 'tryton-ok', default=True),\n                ])\n        export = StateTransition()\n        result = StateView(\n            'ir.translation.export.result',\n            'ir.translation_export_result_view_form', [\n                Button(\"Close\", 'end', 'tryton-close'),\n                ])\n\n        def transition_export(self):\n            pool = Pool()\n            Translation = pool.get('ir.translation')\n            self.result.file = Translation.translation_export(\n                self.start.language.code, self.start.module.name)\n            return 'result'\n\n        def default_result(self, fields):\n            return {\n                'file': self.result.file,\n                }\n\nThe class must be registered in the :ref:`Pool <ref-pool>`.\n"
  },
  {
    "path": "doc/tutorial/index.rst",
    "content": ".. _tutorial-index:\n\n=========\nTutorials\n=========\n\n.. toctree::\n   :maxdepth: 1\n\n   module/index\n"
  },
  {
    "path": "doc/tutorial/module/anatomy.rst",
    "content": ".. _tutorial-module-anatomy:\n\nAnatomy of a module\n===================\n\nA Tryton module is a `python module`_ thus it is a directory that contains a\n:ref:`__init__.py <topics-modules-init>` file.\n\nA Tryton module must also contain a :ref:`tryton.cfg\n<topics-modules-tryton-cfg>` file which is used to define the dependencies\nbetween modules and also lists the :ref:`XML files <topics-modules-xml-files>`\nthat must be loaded by Tryton.\n\nUsually a module will define views used in the user interface, those views are\ndescribed by XML files stored in the :file:`view` directory.\n\nTranslations are handled with `po files`_ that sit in the :file:`locale`\ndirectory, one file per language.\n\nLet's continue with :ref:`creating the models <tutorial-module-model>`\n\n.. _`python module`: https://docs.python.org/tutorial/modules.html\n.. _`po files`: https://www.gnu.org/software/gettext/manual/html_node/PO-Files.html\n"
  },
  {
    "path": "doc/tutorial/module/default_values.rst",
    "content": ".. _tutorial-module-default-values:\n\nSet default values\n==================\n\nDefault values are useful to save time for users when entering data.\nOn Tryton :ref:`default values <topics-fields_default_value>` are computed on\nserver side and they will be set by the client when creating a new record if\nthe field is shown on the view.\nIf the field is not shown on the view, the server will set this values when\nstoring the new records in the database.\n\nIn order to define a default value for a field you should define a class method\nnamed ``default_<field_name>`` that returns the default value.\nFor example to add today as the default date of our ``Opportunity`` model the\nfollowing class method is added in :file:`opportunity.py` file:\n\n.. code-block:: python\n\n    from trytond.pool import Pool\n    ...\n    class Opportunity(ModelSQL, ModelView):\n        ...\n        @classmethod\n        def default_start_date(cls):\n            pool = Pool()\n            Date = pool.get('ir.date')\n            return Date.today()\n\n.. _tutorial-module-calling-other-classes:\n\nCall other model methods\n------------------------\n\nIn the previous example we called the ``today`` method of the ``ir.date`` model\nfrom the :class:`~trytond.pool.Pool` instance.\nThe :attr:`~trytond.model.Model.__name__` value is used to get the class.\nIt is very important to get the class from the pool instead of using a normal\nPython import, because the pool ensures that all of the extensions are applied\ndepending on the activated modules.\nFor example, if we have the company module also activated the correct timezone\nfor the user company will be used for computing the today value.\n\nGreat, you have learned how to define default values, and how to call methods\ndefined on other classes in the pool.\nLet's continue with :ref:`reacting on user input <tutorial-module-on-change>`.\n"
  },
  {
    "path": "doc/tutorial/module/domains.rst",
    "content": ".. _tutorial-module-domains:\n\nAdd domain restriction to fields\n================================\n\nOne common requirement is to add restrictions to the possible value of a field.\nFor example we can define the following restrictions:\n\n* The value of a numeric field must be greater that zero.\n* The value of another field must be greater than the value of other.\n* Related record must have fields with specific values.\n  For example allow to select only products of kind *service*.\n\nThis is represented using a domain clause.\nThe domain clause syntax is explained on :ref:`domain reference\n<topics-domain>`.\n\nA very interesting thing of the domain, is that the client evaluates them, so:\n\n* If we set a value that invalidate the domain of some fields, they are marked.\n  A notification is displayed before saving.\n* When searching for a related record, only the records that satisfy the domain\n  are available.\n  So it is not possible to select invalid records.\n* When creating a new related record, the client automatically enforces only\n  valid values.\n  Fields that can have only one value are filled and set read only.\n\nFor example, it may be interesting to add the address of the party on our\n``Opportunity`` model.\nIn this case we are interested on selecting only the addresses related to the\nparty.\n\nLets see how to do it:\n\n.. code-block:: python\n\n    from trytond.pyson import Eval\n    ...\n    class Opportunity(ModelSQL, ModelView):\n        ...\n        address = fields.Many2One(\n            'party.address', \"Address\",\n            domain=[\n                ('party', '=', Eval('party', -1)),\n                ])\n\nThe domain uses the value of the party field with the\n:class:`~trytond.pyson.Eval` object.\nThis defines a relation between party and address field.\n\n.. note::\n   It is up to you to add the new field to the views and update the database.\n\nUsing conditional domains\n-------------------------\n\nSometimes it is interesting to apply a domain only if another field is set.\nFor example we want to ensure the start date is before the end date but both\nfields are optionals, so we don't want to apply any domain if they are empty.\nThis can be solved by using a conditional domain.\n\nLets see how we can achieve it:\n\n.. code-block:: python\n\n    from trytond.pyson import If, Bool, Eval\n    ...\n    class Opportunity(ModelSQL, ModelView):\n        ...\n        start_date = fields.Date(\n            \"Start Date\", required=True,\n            domain=[\n                If(Bool(Eval('end_date')),\n                    ('start_date', '<=', Eval('end_date')),\n                    ())])\n        end_date = fields.Date(\n            \"End Date\",\n            domain=[\n                If(Bool(Eval('end_date')),\n                    ('end_date', '>=', Eval('start_date')),\n                    ())])\n\nIn this case we used the following statements:\n\n* :class:`~trytond.pyson.If` which expects three values:\n  (condition, true-statement, false-statement)\n  In this case we use to return a domain on when the condition is ``True`` and\n  return an empty domain on ``False``.\n* :class:`~trytond.pyson.Bool` used to convert the field value into boolean.\n\nAll of the domains are :ref:`PSYON <ref-pyson>` statements.\n\nGreat, you have learned to add constraint on the fields value.\nLet's continue with :ref:`adding a workflow <tutorial-module-workflow>`.\n"
  },
  {
    "path": "doc/tutorial/module/extend.rst",
    "content": ".. _tutorial-module-extend:\n\nExtend model\n============\n\nSometimes we want to extend an existing :class:`~trytond.model.Model` to add\n:class:`~trytond.model.fields.Field` or methods.\nThis can be done using the extension mechanism of Tryton which can combine\nclasses with the same ``__name__`` that are registered in the\n:class:`~trytond.pool.Pool`.\n\nExtend the Party model\n----------------------\n\nLet's add an ``opportunities`` field on the ``party.party`` model.\nThe model in :file:`party.py` file of our module looks like this:\n\n.. code-block:: python\n\n    from trytond.model import fields\n    from trytond.pool import PoolMeta\n\n    class Party(metaclass=PoolMeta):\n        __name__ = 'party.party'\n        opportunities = fields.One2Many(\n            'training.opportunity', 'party', \"Opportunities\")\n\nThis new class must be register in the :class:`~trytond.pool.Pool`.\nSo in :file:`__init__.py` we add:\n\n.. code-block:: python\n\n    from . import party\n\n    def register():\n        Pool.register(\n            ...,\n            party.Party,\n            module='opportunity', type_='model')\n\nExtend the Party view\n---------------------\n\nNow that we added a new field to the ``party.party``\n:class:`~trytond.model.Model`, we can also add it the form view.\nThis is done by adding a ``ir.ui.view`` record that inherit the party form view\nof the ``party`` module.\nHere is the content of the :file:`party.xml` file:\n\n.. code-block:: xml\n\n   <tryton>\n      <data>\n         <record model=\"ir.ui.view\" id=\"party_view_form\">\n            <field name=\"model\">party.party</field>\n            <field name=\"inherit\" ref=\"party.party_view_form\"/>\n            <field name=\"name\">party_form</field>\n         </record>\n      </data>\n   </tryton>\n\nThe ``type`` is replaced by:\n\n``inherit``\n   A reference to the XML id of the view extended prefixed by the name of the\n   module where the view is declared.\n\nThe content of the inheriting view must contain an XPath_ expression to define\nthe position from which to include the partial view XML.\nHere is the content of the form view in :file:`view/party_form.xml`:\n\n.. code-block:: xml\n\n   <data>\n      <xpath expr=\"/form/notebook/page[@name='identifiers']\" position=\"after\">\n         <page name=\"opportunities\" col=\"1\">\n            <field name=\"opportunities\"/>\n         </page>\n      </xpath>\n   </data>\n\n.. _XPath: https://en.wikipedia.org/wiki/XPath\n\nAnd finally we must declare the new XML data in the :file:`tryton.cfg` file:\n\n.. code-block:: ini\n\n   [tryton]\n   ...\n   xml:\n      ...\n      party.xml\n\nUpdate database\n---------------\n\nAs we have defined new field and XML record, we need to update the database\nwith:\n\n.. code-block:: console\n\n   $ trytond-admin -d test --all\n\nAnd restart the server and reconnect with the client to see the new field on\nthe party:\n\n.. code-block:: console\n\n   $ trytond\n\nLet's use a :ref:`wizard to convert the opportunity <tutorial-module-wizard>`.\n"
  },
  {
    "path": "doc/tutorial/module/function_fields.rst",
    "content": ".. _tutorial-module-function-fields:\n\nAdd computed fields\n===================\n\nComputed fields can also be defined to avoid storing duplicated data in the\ndatabase.\nFor example, as we have the start date and the end date of our opportunity we\ncan always compute the duration the opportunity lasts.\nThis is done with a :class:`~trytond.model.fields.Function` field, which can be\nused to represent any kind of field.\n\nLets see how this can be done in :file:`opportunity.py` file:\n\n.. code-block:: python\n\n    class Opportunity(ModelSQL, ModelView):\n        ...\n        duration = fields.Function(\n            fields.TimeDelta(\"Duration\"), 'compute_duration')\n        ...\n        def compute_duration(self, name):\n            if self.start_date and self.end_date:\n                return self.end_date - self.start_date\n            return None\n\nThe first parameter of the Function field is another\n:class:`~trytond.model.fields.Field` instance which defined the type of the\nfield to mimic and on the second parameter, the\n:attr:`~trytond.model.fields.Function.getter`, we must specify the name of the\nmethod used to compute the value.\n\n:class:`~trytond.model.fields.Function` fields are read-only be default, but we\ncan make them writable by defining a\n:attr:`~trytond.model.fields.Function.setter` attribute, which is a method to\ncall to store the value.\nSimilarly we can also provide a method to search or order on them.\nAll the Function fields possibilities are explained on\n:class:`~trytond.model.fields.Function` fields reference.\n\n.. warning::\n   If you change the start date or the end date of the opportunity, you will\n   notice that the days value is not updated until the record is saved. That's\n   because function fields are computed only on server side.\n\n.. note::\n   We let you add the new field to the views.\n\n.. _tutorial-module-on-change-with:\n\nCombine Function fields and on_change_with\n------------------------------------------\n\nOn previous steps we learned how :ref:`on_change <tutorial-module-on-change>`\nand :class:`~trytond.model.fields.Function` fields work.\nOne interesting feature is to combine them to compute and update the value.\nSo we can have a computed field that changes every time the user modifies one\nof the values of the form.\n\nIt's a common pattern to use an ``on_change_with`` method as\n:attr:`~trytond.model.fields.Function.getter` of a\n:class:`~trytond.model.fields.Function` field, so the value is correctly\ncomputed on client side and then it reacts to the user input.\n\nIn order to achieve it the following changes must be done in\n:file:`opportunity.py` file:\n\n.. code-block:: python\n\n    class Opportunity(ModelSQL, ModelView):\n        ...\n        duration = fields.Function(\n            fields.TimeDelta(\"Duration\"), 'on_change_with_duration')\n        ...\n        @fields.depends('start_date', 'end_date')\n        def on_change_with_duration(self, name=None):\n            if self.start_date and self.end_date:\n                return self.end_date - self.start_date\n            return None\n\nThe important facts are the following:\n\n    * Add :meth:`~trytond.model.fields.depends` decorator to react on user input\n    * Change the name of the method to ``on_change_with_<field_name>``\n    * Add a default None value for the name argument as it won't be supplied\n      when the client updates the values reacting to user input.\n\nGreat, you designed a Function fields which reacts to the user input.\nLet's go to the next step to :ref:`add domain restrictions\n<tutorial-module-domains>`.\n"
  },
  {
    "path": "doc/tutorial/module/index.rst",
    "content": ".. _tutorial-module:\n\n===============\nModule Tutorial\n===============\n\nA step by step tutorial to create a first module.\nIn this tutorial we will create a simple Tryton module to manage business\nopportunities.\n\nWe will use Tryton and SQLite_ as database, so the installation should be pretty\nstraightforward.\n\n.. TODO: rename module into training\n\nWe will call our module ``opportunity``. This simple module will do the\nfollowing things:\n\n.. toctree::\n   :maxdepth: 1\n\n   setup\n   setup_database\n   anatomy\n   model\n   view\n   default_values\n   on_change\n   function_fields\n   domains\n   workflow\n   states\n   extend\n   wizard\n   report\n   table_query\n\nLet's start with :ref:`installing Tryton for developers <tutorial-module-setup>`.\n\n.. _SQLite: https://sqlite.org/\n"
  },
  {
    "path": "doc/tutorial/module/model.rst",
    "content": ".. _tutorial-module-model:\n\nDefine model\n============\n\nThe :ref:`models <ref-models>` are the base objects of a module to store and\ndisplay data.\nThe :class:`~trytond.model.ModelSQL` is the base class that implements the\npersistence in the SQL database.\nThe :class:`~trytond.model.ModelView` is the base class that implements the\nview layer.\nAnd of course, a model would be useless without its :ref:`fields\n<ref-models-fields>`.\n\nLet's start with a simple model to store the opportunities with a description,\na start and end date, a link to a party and an optional comment.\nOur model in :file:`opportunity.py` file currently looks like this:\n\n.. code-block:: python\n\n    from trytond.model import ModelSQL, fields\n\n    class Opportunity(ModelSQL):\n        \"Opportunity\"\n        __name__ = 'training.opportunity'\n        _rec_name = 'description'\n\n        description = fields.Char(\"Description\", required=True)\n        start_date = fields.Date(\"Start Date\", required=True)\n        end_date = fields.Date(\"End Date\")\n        party = fields.Many2One('party.party', \"Party\", required=True)\n        comment = fields.Text(\"Comment\")\n\nAs you can see a Model must have a :attr:`~trytond.model.Model.__name__`\nattribute.\nThis name is used to make reference to this object.\nIt is also used to build the name of the SQL table to store the opportunity\nrecords in the database.\n\nThe :attr:`~trytond.model.Model._rec_name` attribute defines the field that\nwill be used to compute the name of the record.\nThe name of the record is its textual representation.\n\nThe ``party`` field is a relation field (Many2One_) to another Model of Tryton\nnamed ``party.party``.\nThis model is defined by the ``party`` module.\n\n.. _Many2One: https://en.wikipedia.org/wiki/Many-to-one\n\nRegister the model in the Pool\n------------------------------\n\nOnce a Tryton model is defined, you need to register it in the\n:class:`~trytond.pool.Pool`.\nThis is done in the :file:`__init__.py` file of your module with the following\ncode:\n\n.. code-block:: python\n\n    from trytond.pool import Pool\n    from . import opportunity\n\n    def register():\n        Pool.register(\n            opportunity.Opportunity,\n            module='opportunity', type_='model')\n\nModels in the pool are inspected by Tryton when activating or updating a module\nin order to create or update the schema of the table in the database.\n\nActivate the opportunity module\n-------------------------------\n\nNow that we have a basic module, we will use it to create the related table\ninto the :ref:`database created <tutorial-module-setup-database>`.\n\nFirst we must edit the :file:`tryton.cfg` file to specify that this module\ndepends on the ``party`` and ``ir`` module.\nWe need to do this because the ``Opportunity`` model contains the ``party``\nfield which refers to the ``Party`` model.\nAnd we always need the ``ir`` module which is always included in Tryton server.\n\nHere is the content of our :file:`tryton.cfg` file:\n\n.. code-block:: ini\n\n   [tryton]\n   version=x.y.0\n   depends:\n      ir\n      party\n\nAs we defined a new dependency, we must refresh the installation with:\n\n.. code-block:: console\n\n   $ python -m pip install --editable opportunity\n\nNow we can activate the ``opportunity`` module and its dependencies:\n\n.. code-block:: console\n\n    $ trytond-admin -d test -u opportunity --activate-dependencies\n\nThis step has created the tables into your database.\nYou can check it with the :command:`sqlite3` command line:\n\n.. code-block:: console\n\n   $ sqlite3 ~/db/test.sqlite '.schema training_opportunity'\n   CREATE TABLE \"training_opportunity\" (\n      id INTEGER PRIMARY KEY AUTOINCREMENT,\n      \"comment\" TEXT,\n      \"create_uid\" INTEGER,\n      \"create_date\" TIMESTAMP,\n      \"description\" VARCHAR,\n      \"end_date\" DATE,\n      \"start_date\" DATE,\n      \"write_date\" TIMESTAMP,\n      \"party\" INTEGER,\n      \"write_uid\" INTEGER);\n\nThe next step will be :ref:`displaying record <tutorial-module-view>`.\n"
  },
  {
    "path": "doc/tutorial/module/on_change.rst",
    "content": ".. _tutorial-module-on-change:\n\nReact to user input\n===================\n\nTryton provides a way to :ref:`change the value of a field\n<topics-fields_on_change>` depending on other fields.\nThis computation is done on the server and the values are sent back to the\nclient.\nThe value is not stored on the server until the user saves the record.\nThis is a great way to react to user inputs.\n\nFor example, in order to set the end date of our opportunity depending on\nthe start date, we can add the following instance method to ``Opportunity``\nclass in :file:`opportunity.py` file:\n\n.. code-block:: python\n\n    import datetime as dt\n    ...\n    class Opportunity(ModelSQL, ModelView):\n        ...\n        @fields.depends('start_date')\n        def on_change_with_end_date(self):\n            if self.start_date:\n                return self.start_date + dt.timedelta(days=3)\n\nIn this case the :meth:`~trytond.model.fields.depends` decorator indicates the\nnames of the fields which will trigger the computation when their values are\nchanged.\nYou should take care to set all the fields used to make the computation because\nthe server will have only access to those fields.\nThis ensures that the client reacts to each field the computation depends on.\n\nWe can also compute the values of other fields when some field change.\nIn this case we use the ``on_change_<field_name>`` function instead of\n``on_change_with_<field_name>``.\nThe :meth:`~trytond.model.fields.depends` decorator indicates the fields that\nwill be available to compute the new values.\nIn order to set the other fields value, we must assign them to the instance and\nthe changes will be propagated to the client.\n\nSo for example we can compute the description and the comment of our\nopportunity model depending on the party by adding this method to the\n``Opportunity`` class in :file:`opportunity.py` file:\n\n.. code-block:: python\n\n    class Opportunity(ModelSQL, ModelView):\n        ...\n        @fields.depends('party', 'description', 'comment')\n        def on_change_party(self):\n            if self.party:\n                if not self.description:\n                    self.description = self.party.rec_name\n                if not self.comment:\n                    lines = []\n                    if self.party.phone:\n                        lines.append(\"Tel: %s\" % self.party.phone)\n                    if self.party.email:\n                        lines.append(\"Mail: %s\" % self.party.email)\n                    self.comment = '\\n'.join(lines)\n\nGreat, you have learned how to compute values depending on other fields values.\nLet's continue with :ref:`adding computed fields\n<tutorial-module-function-fields>`.\n"
  },
  {
    "path": "doc/tutorial/module/report.rst",
    "content": ".. _tutorial-module-report:\n\nCreate report\n=============\n\nA frequent requirement is to generate a printable document for a record.\nFor that we use ``trytond.report.Report`` which provides the tooling to\nrender OpenDocument_ based on relatorio_ template.\n\nFirst we create a ``trytond.report.Report`` class in :file:`opportunity.py`:\n\n.. code-block:: python\n\n    from trytond.report import Report\n    ...\n    class OpportunityReport(Report):\n        __name__ = 'training.opportunity.report'\n\nAnd we register it in the :class:`~trytond.pool.Pool` as type ``report`` in\n:file:`__init__.py`:\n\n.. code-block:: python\n\n    def register():\n        ...\n        Pool.register(\n            opportunity.OpportunityReport,\n            module='opportunity', type_='report')\n\n\nNow we have to create a ``ir.action.report`` and ``ir.action.keyword`` in\n:file:`opportunity.xml`:\n\n.. code-block:: xml\n\n   <tryton>\n      <data>\n         ...\n         <record model=\"ir.action.report\" id=\"report_opportunity\">\n            <field name=\"name\">Opportunity</field>\n            <field name=\"report_name\">training.opportunity.report</field>\n            <field name=\"model\">training.opportunity</field>\n            <field name=\"report\">opportunity/opportunity.fodt</field>\n            <field name=\"template_extension\">odt</field>\n         </record>\n         <record model=\"ir.action.keyword\" id=\"report_opportunity_keyword\">\n            <field name=\"keyword\">form_print</field>\n            <field name=\"model\">training.opportunity,-1</field>\n            <field name=\"action\" ref=\"report_opportunity\"/>\n         </record>\n      </data>\n   </tryton>\n\nThe ``ir.action.report`` links the ``trytond.report.Report`` with the\n:class:`~trytond.model.Model`.\n\n``name``\n   The string that is shown on the menu.\n``report_name``\n   The name of the ``trytond.report.Report``.\n``model``\n   The name of the :class:`~trytond.model.Model`.\n``report``\n   The path to the template file starting with the module directory.\n``template_extension``\n   The template format.\n\nAnd like for the :ref:`wizard <tutorial-module-wizard>`, the\n``ir.action.keyword`` makes the ``trytond.report.Report`` available as action\nto any ``training.opportunity``.\n\nFinally we create the OpenDocument_ template as :file:`opportunity.fodt` using\nLibreOffice_.\nWe use the `Genshi XML Template Language`_ implemented by relatorio_ using\n``Placeholder Text``.\nThe rendering context contains the variable ``records`` which is a list of\nselected record instances.\n\nHere is an example of the directives to insert in the document:\n\n.. code-block::\n\n   <for each=\"opportunity in records\">\n   Opportunity: <opportunity.rec_name>\n   Party: <opportunity.party.rec_name>\n   Start Date: <format_date(opportunity.start_date) if opportunity.start_date else ''>\n   End Date: <format_date(opportunity.end_date) if opportunity.end_date else ''>\n\n   Comment:\n   <for each=\"line in (opportunity.comment or '').splitlines()\">\n   <line>\n   </for>\n   </for>\n\n.. note::\n   We must render text field line by line because OpenDocument does not\n   consider simple breakline.\n\nUpdate database\n---------------\n\nAs we have registered new report and XML records, we need to update the\ndatabase with:\n\n.. code-block:: console\n\n   $ trytond-admin -d test --all\n\nAnd restart the server and reconnect with the client to test rendering the\nreport:\n\n.. code-block:: console\n\n   $ trytond\n\nNext we create a :ref:`a reporting model using SQL query\n<tutorial-module-table-query>`.\n\n.. _OpenDocument: https://en.wikipedia.org/wiki/OpenDocument\n.. _relatorio: https://relatorio.tryton.org/\n.. _LibreOffice: https://www.libreoffice.org/\n.. _Genshi XML Template Language: https://genshi.edgewall.org/wiki/Documentation/xml-templates.html\n"
  },
  {
    "path": "doc/tutorial/module/setup.rst",
    "content": ".. _tutorial-module-setup:\n\nSetup\n=====\n\nCreate virtual environment\n--------------------------\n\nThis step will cover the installation of tryton from a developer perspective.\nWe will assume that you are already fluent with venv_ and pip_.\n\nLet's create a virtual environment inside your working directory:\n\n.. code-block:: console\n\n   $ python -m venv .venv\n   $ source .venv/bin/activate\n\nInstall cookiecutter and mercurial\n----------------------------------\n\nTo bootstrap the module, we provide a cookiecutter_ template.\nFirst we install cookiecutter_ and mercurial_ with:\n\n.. code-block:: console\n\n   $ python -m pip install cookiecutter mercurial\n\nSetup module\n------------\n\nThe Tryton template can be rendered into a module with:\n\n.. code-block:: console\n\n   $ cookiecutter hg+https://hg.tryton.org/cookiecutter\n   module_name [my_module]: opportunity\n   prefix []: tuto\n   package_name [tuto_opportunity]:\n   version []: x.y.0\n   description []:\n   author [Tryton]: John Doe\n   author_email [bugs@tryton.org]: john@example.com\n   fullname []: John Doe\n   url [http://www.tryton.org/]: http://www.example.com/\n   keywords []:\n   test_with_scenario []:\n\n.. note::\n   The version number must use the same two first numbers as the Tryton series\n   wanted.\n\nInstall module\n--------------\n\nNow we can install the new module in editable mode:\n\n.. code-block:: console\n\n   $ python -m pip install --editable opportunity\n\nContinue with :ref:`initializing the database <tutorial-module-setup-database>`\n\n.. _pip: https://pip.pypa.io/\n.. _venv: https://docs.python.org/library/venv.html\n.. _cookiecutter: https://pypi.org/project/cookiecutter/\n.. _mercurial: https://www.mercurial-scm.org/\n"
  },
  {
    "path": "doc/tutorial/module/setup_database.rst",
    "content": ".. _tutorial-module-setup-database:\n\nInitialize the database\n=======================\n\nBy default Tryton, use an SQLite database stored in the folder :file:`db` of\nyour home directory.\nThis can be changed in the ``database`` section of the `configuration\n<topics-configuration>`.\n\nNow creating a Tryton database is only a matter of executing the following\ncommands:\n\n.. code-block:: console\n\n   $ mkdir ~/db\n   $ touch ~/db/test.sqlite\n   $ trytond-admin -d test --all\n\nYou will be prompted to set the administrator email and password.\n\nOnce the database is initialized you can run the Tryton server:\n\n.. code-block:: console\n\n    $ trytond\n\nConnecting to the database using a Tryton client you will be greeted by the\nmodule configuration wizard.\n\nWe will continue with :ref:`the anatomy of the module <tutorial-module-anatomy>`.\n"
  },
  {
    "path": "doc/tutorial/module/states.rst",
    "content": ".. _tutorial-module-states:\n\nAdd dynamic state to fields\n===========================\n\nSometimes you want to make fields read-only, invisible or required under\ncertain conditions.\nThis can be achieved using the :attr:`~trytond.model.fields.Field.states`\nattribute of the :class:`~trytond.model.fields.Field`.\nIt is a dictionary with the keys ``readonly``, ``invisible`` and ``required``.\nThe values are :class:`~trytond.pyson.PYSON` statements that are evaluated with\nthe values of the record.\n\nIn our example we make some fields read-only when the record is not in the\nstate ``opportunity``, the \"End Date\" required for the ``converted`` and\n``lost`` state and make the comment invisible if empty:\n\n.. code-block:: python\n\n    class Opportunity(...):\n        ...\n        description = fields.Char(\n            \"Description\", required=True,\n            states={\n                'readonly': Eval('state') != 'draft',\n                })\n        start_date = fields.Date(\n            \"Start Date\", required=True,\n            states={\n                'readonly': Eval('state') != 'draft',\n                })\n        end_date = fields.Date(\n            \"End Date\",\n            states={\n                'readonly': Eval('state') != 'draft',\n                'required': Eval('state').in_(['converted', 'lost']),\n                })\n        party = fields.Many2One(\n            'party.party', \"Party\", required=True,\n            states={\n                'readonly': Eval('state') != 'draft',\n                })\n        address = fields.Many2One(\n            'party.address', \"Address\",\n            domain=[\n                ('party', '=', Eval('party')),\n                ],\n            states={\n                'readonly': Eval('state') != 'draft',\n                })\n        comment = fields.Text(\n            \"Comment\",\n            states={\n                'readonly': Eval('state') != 'draft',\n                'invisible': (\n                    (Eval('state') != 'draft') & ~Eval('comment')),\n                })\n\nIt is also possible to set the ``readonly``, ``invisible`` and ``icon`` states\non the :attr:`~trytond.model.ModelView._buttons`.\nSo we can make invisible each button for the state in which the transition is\nnot available:\n\n.. code-block:: python\n\n    class Opportunity(ModelSQL, ModelView):\n        ...\n        @classmethod\n        def __setup__(cls):\n            ...\n            cls._buttons.update({\n                    'convert': {\n                        'invisible': Eval('state') != 'draft',\n                        'depends': ['state'],\n                        },\n                    'lost': {\n                        'invisible': Eval('state') != 'draft',\n                        'depends': ['state'],\n                        },\n                    })\n\n.. note::\n   The fields in :class:`~trytond.pyson.Eval` statement must be added to the\n   ``depends`` attribute to register the field on which the states depend.\n\nExercise\n--------\n\nAs exercise we let you define the state for the button that reset to ``draft``\nstate.\n\nLet's :ref:`extend the party model <tutorial-module-extend>`.\n"
  },
  {
    "path": "doc/tutorial/module/table_query.rst",
    "content": ".. _tutorial-module-table-query:\n\nDefine aggregated model\n=======================\n\nAggregated data are useful to analyze business.\nTryton can provide such data using :class:`~trytond.model.ModelSQL` class which\nare not based on an existing table in the database but using a SQL query.\nThis is done by defining a :meth:`~trytond.model.ModelSQL.table_query` method\nwhich returns a SQL ``FromItem``.\n\nLet's create a :class:`~trytond.model.ModelSQL` which aggregate the number of\nopportunity converted or lost per month.\n\nFirst we create a :class:`~trytond.model.ModelSQL` class which defines a\n:meth:`~trytond.model.ModelSQL.table_query` in :file:`opportunity.py`:\n\n.. code-block:: python\n\n    from sql import Literal\n    from sql.aggregate import Count, Min\n    from sql.functions import CurrentTimestamp, DateTrunc\n    ...\n    class OpportunityMonthly(ModelSQL, ModelView):\n        \"Opportunity Monthly\"\n        __name__ = 'training.opportunity.monthly'\n\n        month = fields.Date(\"Month\")\n        converted = fields.Integer(\"Converted\")\n        lost = fields.Integer(\"Lost\")\n\n        @classmethod\n        def table_query(cls):\n            pool = Pool()\n            Opportunity = pool.get('training.opportunity')\n            opportunity = Opportunity.__table__()\n\n            month = cls.month.sql_cast(\n                DateTrunc('month', opportunity.end_date))\n            query = opportunity.select(\n                Literal(0).as_('create_uid'),\n                CurrentTimestamp().as_('create_date'),\n                Literal(None).as_('write_uid'),\n                Literal(None).as_('write_date'),\n                Min(opportunity.id).as_('id'),\n                month.as_('month'),\n                Count(\n                    Literal('*'),\n                    filter_=opportunity.state == 'converted').as_('converted'),\n                Count(\n                    Literal('*'),\n                    filter_=opportunity.state == 'lost').as_('lost'),\n                where=opportunity.state.in_(['converted', 'lost']),\n                group_by=[month])\n            return query\n\n.. note::\n   The table query must return a value for all the fields of the model but also\n   a unique ``id`` and a value for the create and write fields.\n\n.. note::\n   We get the SQL table from the :meth:`~trytond.model.ModelSQL.__table__`\n   method.\n\n.. note::\n   We use :meth:`~trytond.model.fields.Field.sql_cast` to convert the timestamp\n   returned by ``date_trunc`` into a :py:class:`~datetime.date`.\n\nThen as usual we register the :class:`~trytond.model.ModelSQL` class in the in\nthe :class:`~trytond.pool.Pool` as type ``model`` in :file:`__init__.py`:\n\n.. code-block:: python\n\n    def register():\n        ...\n        Pool.register(\n            ...\n            opportunity.OpportunityMonthly,\n            module='opportunity', type_='model')\n\nAnd to display we create a list view and the menu entry in\n:file:`opportunity.xml`:\n\n.. code-block:: xml\n\n   <tryton>\n      <data>\n         ...\n         <record model=\"ir.ui.view\" id=\"opportunity_monthly_view_list\">\n            <field name=\"model\">training.opportunity.monthly</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">opportunity_monthly_list</field>\n         </record>\n\n         <record model=\"ir.action.act_window\" id=\"act_opportunity_monthly_form\">\n            <field name=\"name\">Monthly Opportunities</field>\n            <field name=\"res_model\">training.opportunity.monthly</field>\n         </record>\n         <record model=\"ir.action.act_window.view\" id=\"act_opportunity_monthly_form_view\">\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"view\" ref=\"opportunity_monthly_view_list\"/>\n            <field name=\"act_window\" ref=\"act_opportunity_monthly_form\"/>\n         </record>\n\n         <menuitem\n            parent=\"menu_opportunity\"\n            action=\"act_opportunity_monthly_form\"\n            sequence=\"50\"\n            id=\"menu_opportunity_monthly_form\"/>\n      </data>\n   </tryton>\n\nAnd now the view in :file:`view/opportunity_monthly_list.xml`:\n\n.. code-block:: xml\n\n   <tree>\n      <field name=\"month\"/>\n      <field name=\"converted\"/>\n      <field name=\"lost\"/>\n   </tree>\n\nUpdate database\n---------------\n\nAs we have registered new model and XML records, we need to update the database\nwith:\n\n.. code-block:: console\n\n   $ trytond-admin -d test --all\n\nAnd restart the server and reconnect with the client to test computing\naggregate:\n\n.. code-block:: console\n\n   $ trytond\n\n.. note::\n   As you can see the model behaves like the other models, except that you can\n   not create, delete nor write on them.\n\nThis is all for your first module.\nIf you want to learn more about Tryton, you can continue on :ref:`specific\ntopics <topics-index>`.\n"
  },
  {
    "path": "doc/tutorial/module/view.rst",
    "content": ".. _tutorial-module-view:\n\nDisplay records\n===============\n\nHaving records in the database is nice but we want the user to manage this\nrecords through the user interface.\n\nIn order to denote that a model can be displayed in the interface, you have to\ninherit from :class:`~trytond.model.ModelView`:\n\n.. code-block:: python\n\n    from trytond.model import ModelSQL, ModelView\n    ...\n\n    class Opportunity(ModelSQL, ModelView):\n        ...\n\nWhen you inherit from :class:`~trytond.model.ModelView`, your model gains the\nmethods required to display the data on Tryton clients.\nThose methods allow to retrieve the fields and the definition of the views used\nby a model, to apply attributes on view elements and they also provide all the\nmachinery for :ref:`on_change <tutorial-module-on-change>` and\n:ref:`on_change_with <tutorial-module-on-change-with>`.\n\nTryton Views\n------------\n\nIn Tryton data can be displayed using different kind of views.\nThe available view types and it's attributes are listed on the :ref:`Views\n<topics-views>` topic.\n\nTryton views are usual Tryton records that are persisted into the database.\nThis design choice means that views are extendable and that you can use the\ntraditional Tryton concepts when interacting with them.\n\n\nDefine views\n------------\n\nViews are defined in XML_ files and they contain one XML tag for each element\ndisplayed in the view.\nThe root tag of the view defines the view type.\nAn example view for our opportunity module will be as follows:\n\nHere is the content of the form view of opportunity in\n:file:`view/opportunity_form.xml`:\n\n.. code-block:: xml\n\n   <form>\n      <label name=\"party\"/>\n      <field name=\"party\"/>\n      <label name=\"description\"/>\n      <field name=\"description\"/>\n      <label name=\"start_date\"/>\n      <field name=\"start_date\"/>\n      <label name=\"end_date\"/>\n      <field name=\"end_date\"/>\n      <separator name=\"comment\" colspan=\"4\"/>\n      <field name=\"comment\" colspan=\"4\"/>\n   </form>\n\nAnd here is the content of the list view in :file:`view/opportunity_list.xml`:\n\n.. code-block:: xml\n\n   <tree>\n      <field name=\"party\"/>\n      <field name=\"description\"/>\n      <field name=\"start_date\"/>\n      <field name=\"end_date\"/>\n   </tree>\n\nThe value of the ``name`` attribute for ``field`` and ``label`` tags is the\nname of the field attribute of the model.\nEach XML tag can contain different attributes to customize how the widgets\nare displayed in the views.\nThe full reference can be found on the :ref:`Views <topics-views>` section.\n\nOnce a views is defined it must be registered on the Tryton database in order\nto make the server know about them.\nIn order to do so with should register it on a :ref:`XML file\n<topics-modules-xml-files>` specifying the following information:\n\n``model``\n   The name of the model of the view\n``type``\n   Possible values are: tree, form, calendar, graph, board\n``name``\n   The name of the XML file (without extension) in the :file:`view` folder\n   which contains the view definition\n\nHere is the content of the :file:`opportunity.xml` file:\n\n.. code-block:: xml\n\n   <tryton>\n      <data>\n         <record model=\"ir.ui.view\" id=\"opportunity_view_form\">\n            <field name=\"model\">training.opportunity</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">opportunity_form</field>\n         </record>\n\n         <record model=\"ir.ui.view\" id=\"opportunity_view_list\">\n            <field name=\"model\">training.opportunity</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">opportunity_list</field>\n         </record>\n      </data>\n   </tryton>\n\nNow we have to declare the XML data file in the :file:`tryton.cfg` file:\n\n.. code-block:: ini\n\n   [tryton]\n   ...\n   xml:\n      opportunity.xml\n\n.. _XML: https://en.wikipedia.org/wiki/XML\n\nCreate menu entry\n-----------------\n\nIn order to show our models on the user menu we need an\n``ir.action.act_window`` and a menu entry.\n\nAn action window is used to relate one or more views, usually a list and a form\nview.\n\nHere is the definition of the opportunities action to append into\n:file:`opportunity.xml`:\n\n.. code-block:: xml\n\n   <tryton>\n      <data>\n         ...\n         <record model=\"ir.action.act_window\" id=\"act_opportunity_form\">\n            <field name=\"name\">Opportunities</field>\n            <field name=\"res_model\">training.opportunity</field>\n         </record>\n         <record model=\"ir.action.act_window.view\" id=\"act_opportunity_form_view1\">\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"view\" ref=\"opportunity_view_list\"/>\n            <field name=\"act_window\" ref=\"act_opportunity_form\"/>\n         </record>\n         <record model=\"ir.action.act_window.view\" id=\"act_opportunity_form_view2\">\n            <field name=\"sequence\" eval=\"20\"/>\n            <field name=\"view\" ref=\"opportunity_view_form\"/>\n            <field name=\"act_window\" ref=\"act_opportunity_form\"/>\n         </record>\n      </data>\n   </tryton>\n\nA menu entry is created using the special ``menuitem`` XML tag which accepts\nthe following values:\n\n``id``\n   Required XML identifier to refer this menu_item from other records.\n``sequence``\n   Used to define the order of the menus.\n``action``\n   The action to execute when clicking the menu.\n``name``\n   The string that will be shown on the menu.\n   If no name is entered and an action is set, the action name will be used.\n``parent``\n   The parent menu when creating a sub-menu.\n\nLets add a menu entry to the :file:`opportunity.xml` file with:\n\n.. code-block:: xml\n\n   <tryton>\n      <data>\n         ...\n         <menuitem\n            name=\"Opportunities\"\n            sequence=\"50\"\n            id=\"menu_opportunity\"/>\n         <menuitem\n            parent=\"menu_opportunity\"\n            action=\"act_opportunity_form\"\n            sequence=\"10\"\n            id=\"menu_opportunity_form\"/>\n      </data>\n   </tryton>\n\n\nUpdate database\n---------------\n\nAs we have defined new XML records, we need to update the database with:\n\n.. code-block:: console\n\n   $ trytond-admin -d test --all\n\nAnd restart the server and reconnect with the client to see the new menu\nentries:\n\n.. code-block:: console\n\n   $ trytond\n\nLet's continue with :ref:`setting default values\n<tutorial-module-default-values>`.\n"
  },
  {
    "path": "doc/tutorial/module/wizard.rst",
    "content": ".. _tutorial-module-wizard:\n\nCreate wizard\n=============\n\nSometime you want to add functionalities to a model that do not suite the use\nof a button.\nFor this kind of use case the :ref:`wizard <topics-wizard>` is the preferred\nsolution.\nA wizard is a kind of `state machine`_ where states can be a form view, an\naction or transition.\n\n.. _state machine: https://en.wikipedia.org/wiki/Finite-state_machine\n\nLet's create a wizard that converts the opportunities by asking for the end date.\n\nFirst we define a :class:`~trytond.model.ModelView` class in\n:file:`opportunity.py`:\n\n.. code-block:: python\n\n    class ConvertStart(ModelView):\n        \"Convert Opportunities\"\n        __name__ = 'training.opportunity.convert.start'\n\n        end_date = fields.Date(\"End Date\", required=True)\n\nAnd we register it in the :class:`~trytond.pool.Pool` in :file:`__init__.py`:\n\n.. code-block:: python\n\n    def register():\n        Pool.register(\n            ...,\n            opportunity.ConvertStart,\n            module='opportunity', type_='model')\n\nThen the form view record in :file:`opportunity.xml`:\n\n.. code-block:: xml\n\n   <tryton>\n      <data>\n         ...\n\n         <record model=\"ir.ui.view\" id=\"opportunity_convert_start_view_form\">\n            <field name=\"model\">training.opportunity.convert.start</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">opportunity_convert_start_form</field>\n         </record>\n      </data>\n   </tryton>\n\nAnd the view in :file:`view/opportunity_convert_start_form.xml`:\n\n.. code-block:: xml\n\n   <form col=\"2\">\n      <label string=\"Convert Opportunities?\" id=\"convert_opportunities\" colspan=\"2\" xalign=\"0\"/>\n      <label name=\"end_date\"/>\n      <field name=\"end_date\"/>\n   </form>\n\nNow we can define the :class:`~trytond.wizard.Wizard` with a ``start``\n:class:`~trytond.wizard.StateView` for the form and a ``convert``\n:class:`~trytond.wizard.StateTransition` in :file:`opportunity.py`:\n\n.. code-block:: python\n\n    from trytond.wizard import Wizard, StateView, StateTransition, Button\n    ...\n    class Opportunity(...):\n        ...\n       @classmethod\n       @Workflow.transition('converted')\n       def convert(cls, opportunities, end_date=None):\n           pool = Pool()\n           Date = pool.get('ir.date')\n           cls.write(opportunities, {\n               'end_date': end_date or Date.today(),\n               })\n    ...\n    class Convert(Wizard):\n        \"Convert Opportunities\"\n        __name__ = 'training.opportunity.convert'\n\n        start = StateView(\n            'training.opportunity.convert.start',\n            'opportunity.opportunity_convert_start_view_form', [\n                Button(\"Cancel\", 'end', 'tryton-cancel'),\n                Button(\"Convert\", 'convert', 'tryton-ok', default=True),\n                ])\n        convert = StateTransition()\n\n        def transition_convert(self):\n            self.model.convert(self.records, self.start.end_date)\n            return 'end'\n\n.. note::\n   We added an optional ``end_date`` to the convert method.\n\nAnd we register it in the :class:`~trytond.pool.Pool` as type ``wizard`` in\n:file:`__init__.py`:\n\n.. code-block:: python\n\n    def register():\n        ...\n        Pool.register(\n            opportunity.Convert,\n            module='opportunity', type_='wizard')\n\nFinally we just need to create a ``ir.action.wizard`` and ``ir.action.keyword``\nin :file:`opportunity.xml`:\n\n.. code-block:: xml\n\n   <tryton>\n      <data>\n         ...\n         <record model=\"ir.action.wizard\" id=\"act_convert_opportunities\">\n            <field name=\"name\">Convert Opportunities</field>\n            <field name=\"wiz_name\">training.opportunity.convert</field>\n            <field name=\"model\">training.opportunity</field>\n         </record>\n         <record model=\"ir.action.keyword\" id=\"act_convert_opportunities_keyword\">\n            <field name=\"keyword\">form_action</field>\n            <field name=\"model\">training.opportunity,-1</field>\n            <field name=\"action\" ref=\"act_convert_opportunities\"/>\n         </record>\n      </data>\n   </tryton>\n\nThe ``ir.action.wizard`` links the :class:`~trytond.wizard.Wizard` with the\n:class:`~trytond.model.Model`.\n\n``name``\n   The string that is shown on the menu.\n``wiz_name``\n   The name of the :class:`~trytond.wizard.Wizard`.\n``model``\n   The name of the :class:`~trytond.model.Model`.\n\nAnd the ``ir.action.keyword`` makes the :class:`~trytond.wizard.Wizard`\navailable as action to any ``training.opportunity``.\n\n``keyword``\n   The type of `keyword <topics-actions>`.\n``model``\n   The model or record for which the action must be displayed.\n   Use ``-1`` as id for any record.\n``action``\n   The link to the action.\n\nUpdate database\n---------------\n\nAs we have defined new fields and XML records, we need to update the database\nwith:\n\n.. code-block:: console\n\n   $ trytond-admin -d test --all\n\nAnd restart the server and reconnect with the client to test the wizard:\n\n.. code-block:: console\n\n   $ trytond\n\nLet's create a :ref:`a report to print opportunities <tutorial-module-report>`.\n"
  },
  {
    "path": "doc/tutorial/module/workflow.rst",
    "content": ".. _tutorial-module-workflow:\n\nDefine workflow\n===============\n\nOften records follow a workflow to change their state.\nFor example the opportunity can be converted or lost.\nTryton has a :class:`~trytond.model.Workflow` class that provides the tooling\nto follow a workflow based on the field defined in\n:attr:`~trytond.model.Workflow._transition_state` which is by default\n``state``.\n\nFirst we need to inherit from :class:`~trytond.model.Workflow` and add a\n:class:`~trytond.model.fields.Selection` field to store the state of the\nrecord:\n\n.. code-block:: python\n\n    from trytond.model import Workflow\n    ...\n    class Opportunity(Workflow, ModelSQL, ModelView):\n       ...\n       state = fields.Selection([\n                 ('draft', \"Draft\"),\n                 ('converted', \"Converted\"),\n                 ('lost', \"Lost\"),\n                 ], \"State\",\n           required=True, readonly=True, sort=False)\n\n       @classmethod\n       def default_state(cls):\n           return 'draft'\n\nWe must define the allowed transitions between states by filling the\n:attr:`~trytond.model.Workflow._transitions` set with tuples using the\n:meth:`~trytond.model.Model.__setup__` method:\n\n.. code-block:: python\n\n    class Opportunity(Workflow, ModelSQL, ModelView):\n       ...\n       @classmethod\n       def __setup__(cls):\n          super().__setup__()\n          cls._transitions.update({\n                    ('draft', 'converted'),\n                    ('draft', 'lost'),\n                    })\n\nFor each target state, we must define a\n:meth:`~trytond.model.Workflow.transition` method.\nFor example when the opportunity is converted we fill the ``end_date`` field\nwith today:\n\n.. code-block:: python\n\n    class Opportunity(Workflow, ModelSQL, ModelView):\n       ...\n       @classmethod\n       @Workflow.transition('converted')\n       def convert(cls, opportunities):\n           pool = Pool()\n           Date = pool.get('ir.date')\n           cls.write(opportunities, {\n               'end_date': Date.today(),\n               })\n\n.. note::\n   We let you define the transition method for lost.\n\nNow we need to add a button for each transition so the user can trigger them.\n\nWe must declare the button in the :attr:`~trytond.model.ModelView._buttons`\ndictionary and decorate the transition method with the\n:meth:`~trytond.model.ModelView.button` to be callable from the client:\n\n.. code-block:: python\n\n    class Opportunity(Workflow, ModelSQL, ModelView):\n        ...\n        @classmethod\n        def __setup__(cls):\n            ...\n            cls._buttons.update({\n                    'convert': {},\n                    'lost': {},\n                    })\n\n        @classmethod\n        @ModelView.button\n        @Workflow.transition('converted')\n        def convert(cls, opportunities):\n            ...\n\n        @classmethod\n        @ModelView.button\n        @Workflow.transition('lost')\n        def lost(cls, opportunities):\n            ...\n\nEvery button must also be recorded in ``ir.model.button`` to define its label\n(and also the :ref:`access right <topics-access_rights>`).\nWe must add to the ``opportunity.xml`` file:\n\n.. code-block:: xml\n\n   <tryton>\n      <data>\n         ...\n         <record model=\"ir.model.button\" id=\"opportunity_convert_button\">\n            <field name=\"name\">convert</field>\n            <field name=\"string\">Convert</field>\n            <field name=\"model\" search=\"[('model', '=', 'training.opportunity')]\"/>\n         </record>\n\n         <record model=\"ir.model.button\" id=\"opportunity_lost_button\">\n            <field name=\"name\">lost</field>\n            <field name=\"string\">Lost</field>\n            <field name=\"model\" search=\"[('model', '=', 'training.opportunity')]\"/>\n         </record>\n      </data>\n   </tryton>\n\nNow we can add the ``state`` field and the buttons in the form view.\nThe buttons can be grouped under a ``group`` tag.\nThis is how the ``view/opportunity_form.xml`` must be adapted:\n\n.. code-block:: xml\n\n   <form>\n      ...\n      <label name=\"state\"/>\n      <field name=\"state\"/>\n      <group col=\"2\" colspan=\"2\" id=\"button\">\n         <button name=\"lost\" icon=\"tryton-cancel\"/>\n         <button name=\"convert\" icon=\"tryton-forward\"/>\n      </group>\n   </form>\n\n.. note::\n   We let you add the ``state`` field on the list view.\n\nUpdate database\n---------------\n\nAs we have defined new fields and XML records, we need to update the database\nwith:\n\n.. code-block:: shell\n\n   $ trytond-admin -d test --all\n\nAnd restart the server and reconnect with the client to test the workflow:\n\n.. code-block:: shell\n\n   $ trytond\n\nExercise\n---------\n\nAs exercise we let you add a transition between ``lost`` and ``draft`` which\nwill clear the ``end_date``.\n\nLet's continue with :ref:`adding more reaction with dynamic state\n<tutorial-module-states>`.\n"
  },
  {
    "path": "setup.py",
    "content": "#!/usr/bin/env python3\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport glob\nimport io\nimport os\nimport re\nimport subprocess\n\nfrom setuptools import Command, find_packages, setup\n\n\ndef read(fname):\n    return io.open(\n        os.path.join(os.path.dirname(__file__), fname),\n        'r', encoding='utf-8').read()\n\n\ndef get_version():\n    init = read(os.path.join('trytond', '__init__.py'))\n    return re.search('__version__ = \"([0-9.]*)\"', init).group(1)\n\n\nclass rnc2rng(Command):\n    description = \"Generate rng files from rnc\"\n    user_options = []\n\n    def initialize_options(self):\n        pass\n\n    def finalize_options(self):\n        pass\n\n    def run(self):\n        os.chdir(os.path.dirname(__file__) or '.')\n        for path in glob.glob('**/*.rnc', recursive=True):\n            root, ext = os.path.splitext(path)\n            cmd = ['rnc2rng', path, root + '.rng']\n            self.announce(' '.join(cmd))\n            subprocess.run(cmd)\n\n\nversion = get_version()\nmajor_version, minor_version, _ = version.split('.', 2)\nmajor_version = int(major_version)\nminor_version = int(minor_version)\nname = 'trytond'\n\ndownload_url = 'http://downloads.tryton.org/%s.%s/' % (\n    major_version, minor_version)\nif minor_version % 2:\n    version = '%s.%s.dev0' % (major_version, minor_version)\n    download_url = 'hg+http://hg.tryton.org/%s#egg=%s-%s' % (\n        name, name, version)\nlocal_version = []\nif os.environ.get('CI_JOB_ID'):\n    local_version.append(os.environ['CI_JOB_ID'])\nelse:\n    for build in ['CI_BUILD_NUMBER', 'CI_JOB_NUMBER']:\n        if os.environ.get(build):\n            local_version.append(os.environ[build])\n        else:\n            local_version = []\n            break\nif local_version:\n    version += '+' + '.'.join(local_version)\n\ndependency_links = []\nif minor_version % 2:\n    dependency_links.append(\n        'https://trydevpi.tryton.org/?local_version='\n        + '.'.join(local_version))\n\ntests_require = ['pillow']\n\nsetup(name=name,\n    version=version,\n    description='Tryton server',\n    long_description=read('README.rst'),\n    author='Tryton',\n    author_email='bugs@tryton.org',\n    url='http://www.tryton.org/',\n    download_url=download_url,\n    project_urls={\n        \"Bug Tracker\": 'https://bugs.tryton.org/',\n        \"Documentation\": 'https://docs.tryton.org/',\n        \"Forum\": 'https://www.tryton.org/forum',\n        \"Source Code\": 'https://hg.tryton.org/trytond',\n        },\n    keywords='business application platform ERP',\n    packages=find_packages(exclude=['*.modules.*', 'modules.*', 'modules',\n            '*.proteus.*', 'proteus.*', 'proteus']),\n    package_data={\n        'trytond': ['ir/ui/icons/*.svg', '*.rnc', '*.rng', 'ir/fonts/*.ttf'],\n        'trytond.backend.postgresql': ['init.sql'],\n        'trytond.backend.sqlite': ['init.sql'],\n        'trytond.ir': ['tryton.cfg', '*.xml', 'view/*.xml', 'locale/*.po'],\n        'trytond.ir.module': ['*.xml'],\n        'trytond.ir.ui': ['*.xml', '*.rng', '*.rnc'],\n        'trytond.res': [\n            'tryton.cfg', '*.xml', '*.html', 'view/*.xml', 'locale/*.po'],\n        'trytond.tests': ['tryton.cfg', '*.xml', 'forbidden.txt'],\n        },\n    scripts=[\n        'bin/trytond',\n        'bin/trytond-admin',\n        'bin/trytond-console',\n        'bin/trytond-cron',\n        'bin/trytond-worker',\n        'bin/trytond-stat',\n        ],\n    classifiers=[\n        'Development Status :: 5 - Production/Stable',\n        'Environment :: Console',\n        'Environment :: No Input/Output (Daemon)',\n        'Framework :: Tryton',\n        'Intended Audience :: Developers',\n        'License :: OSI Approved :: '\n        'GNU General Public License v3 or later (GPLv3+)',\n        'Natural Language :: Bulgarian',\n        'Natural Language :: Catalan',\n        'Natural Language :: Chinese (Simplified)',\n        'Natural Language :: Czech',\n        'Natural Language :: Dutch',\n        'Natural Language :: English',\n        'Natural Language :: Finnish',\n        'Natural Language :: French',\n        'Natural Language :: German',\n        'Natural Language :: Hungarian',\n        'Natural Language :: Indonesian',\n        'Natural Language :: Italian',\n        'Natural Language :: Persian',\n        'Natural Language :: Polish',\n        'Natural Language :: Portuguese (Brazilian)',\n        'Natural Language :: Romanian',\n        'Natural Language :: Russian',\n        'Natural Language :: Slovenian',\n        'Natural Language :: Spanish',\n        'Natural Language :: Turkish',\n        'Natural Language :: Ukrainian',\n        'Operating System :: OS Independent',\n        'Programming Language :: Python :: 3',\n        'Programming Language :: Python :: 3.7',\n        'Programming Language :: Python :: 3.8',\n        'Programming Language :: Python :: 3.9',\n        'Programming Language :: Python :: 3.10',\n        'Programming Language :: Python :: Implementation :: CPython',\n        'Topic :: Software Development :: Libraries :: Application Frameworks',\n        ],\n    platforms='any',\n    license='GPL-3',\n    python_requires='>=3.7',\n    install_requires=[\n        'defusedxml',\n        'lxml >= 2.0',\n        'relatorio[fodt] >= 0.7.0',\n        'Genshi',\n        'python-dateutil',\n        'polib',\n        'python-sql >= 1.3',\n        'werkzeug',\n        'wrapt',\n        'passlib >= 1.7.0',\n        'pytz;python_version<\"3.9\"',\n        ],\n    extras_require={\n        'test': tests_require,\n        'PostgreSQL': ['psycopg2 >= 2.7.0'],\n        'graphviz': ['pydot'],\n        'Levenshtein': ['python-Levenshtein'],\n        'BCrypt': ['passlib[bcrypt]'],\n        'Argon2': ['passlib[argon2]'],\n        'html2text': ['html2text'],\n        'weasyprint': ['weasyprint'],\n        'coroutine': ['gevent>=1.1'],\n        'image': ['pillow'],\n        'completion': ['argcomplete'],\n        },\n    dependency_links=dependency_links,\n    zip_safe=False,\n    cmdclass={\n        'update_rng': rnc2rng,\n        },\n    )\n"
  },
  {
    "path": "tox.ini",
    "content": "[tox]\nenvlist = {py37,py38,py39,py310}-{sqlite,postgresql}\n\n[testenv]\nextras = test\ncommands =\n    coverage run -m unittest discover -s trytond.tests\n    coverage report --include=./trytond/* --omit=*/tests/*\ndeps =\n    coverage\n    postgresql: psycopg2 >= 2.7.0\nsetenv =\n    sqlite: TRYTOND_DATABASE_URI={env:SQLITE_URI:sqlite://}\n    postgresql: TRYTOND_DATABASE_URI={env:POSTGRESQL_URI:postgresql://}\n    sqlite: DB_NAME={env:SQLITE_NAME::memory:}\n    postgresql: DB_NAME={env:POSTGRESQL_NAME:test}\ninstall_command = pip install --pre --find-links https://trydevpi.tryton.org/?local_version={env:CI_JOB_ID:{env:CI_BUILD_NUMBER:}.{env:CI_JOB_NUMBER:}} {opts} {packages}\n"
  },
  {
    "path": "trytond/__init__.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport os\nimport time\nimport warnings\nfrom email import charset\n\nfrom lxml import etree, objectify\n\n__version__ = \"6.7.0\"\n\nos.environ.setdefault('TRYTOND_TZ', os.environ.get('TZ', 'UTC'))\nos.environ['TZ'] = 'UTC'\nif hasattr(time, 'tzset'):\n    time.tzset()\n\nif time.tzname[0] != 'UTC':\n    warnings.warn('Timezone must be set to UTC instead of %s' % time.tzname[0])\n\n# set email encoding for utf-8 to 'quoted-printable'\ncharset.add_charset('utf-8', charset.QP, charset.QP)\n\n# prevent XML vulnerabilities by default\netree.set_default_parser(etree.XMLParser(resolve_entities=False))\nobjectify.set_default_parser(objectify.makeparser(resolve_entities=False))\n"
  },
  {
    "path": "trytond/admin.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport logging\nimport os\nimport random\nimport sys\nfrom getpass import getpass\n\nfrom sql import Literal, Table\n\nfrom trytond import backend\nfrom trytond.config import config\nfrom trytond.pool import Pool\nfrom trytond.sendmail import send_test_email\nfrom trytond.transaction import Transaction\n\n__all__ = ['run']\nlogger = logging.getLogger(__name__)\n\n\ndef run(options):\n    main_lang = config.get('database', 'language')\n    init = {}\n\n    if options.test_email:\n        send_test_email(options.test_email)\n\n    for db_name in options.database_names:\n        init[db_name] = False\n        database = backend.Database(db_name)\n        database.connect()\n        if options.update:\n            if not database.test():\n                logger.info(\"init db\")\n                database.init()\n                init[db_name] = True\n        elif not database.test():\n            raise Exception('\"%s\" is not a Tryton database.' % db_name)\n\n    for db_name in options.database_names:\n        if options.update:\n            with Transaction().start(db_name, 0) as transaction,\\\n                    transaction.connection.cursor() as cursor:\n                database = backend.Database(db_name)\n                database.connect()\n                if not database.test():\n                    raise Exception('\"%s\" is not a Tryton database.' % db_name)\n                lang = Table('ir_lang')\n                cursor.execute(*lang.select(lang.code,\n                        where=lang.translatable == Literal(True)))\n                lang = set([x[0] for x in cursor])\n            lang.add(main_lang)\n        else:\n            lang = set()\n        lang |= set(options.languages)\n        pool = Pool(db_name)\n        pool.init(update=options.update, lang=list(lang),\n            activatedeps=options.activatedeps)\n\n        if options.update_modules_list:\n            with Transaction().start(db_name, 0) as transaction:\n                Module = pool.get('ir.module')\n                Module.update_list()\n\n        if lang:\n            with Transaction().start(db_name, 0) as transaction:\n                pool = Pool()\n                Lang = pool.get('ir.lang')\n                languages = Lang.search([\n                        ('code', 'in', lang),\n                        ])\n                Lang.write(languages, {\n                        'translatable': True,\n                        })\n\n    for db_name in options.database_names:\n        with Transaction().start(db_name, 0) as transaction:\n            pool = Pool()\n            User = pool.get('res.user')\n            Configuration = pool.get('ir.configuration')\n            configuration = Configuration(1)\n            with transaction.set_context(active_test=False):\n                admin, = User.search([('login', '=', 'admin')])\n\n            if options.email is not None:\n                admin.email = options.email\n            elif init[db_name]:\n                admin.email = input(\n                    '\"admin\" email for \"%s\": ' % db_name)\n            if init[db_name] or options.password:\n                configuration.language = main_lang\n                # try to read password from environment variable\n                # TRYTONPASSFILE, empty TRYTONPASSFILE ignored\n                passpath = os.getenv('TRYTONPASSFILE')\n                password = ''\n                if passpath:\n                    try:\n                        with open(passpath) as passfile:\n                            password, = passfile.read().splitlines()\n                    except Exception as err:\n                        sys.stderr.write('Can not read password '\n                            'from \"%s\": \"%s\"\\n' % (passpath, err))\n\n                if not password and not options.reset_password:\n                    while True:\n                        password = getpass(\n                            '\"admin\" password for \"%s\": ' % db_name)\n                        password2 = getpass('\"admin\" password confirmation: ')\n                        if password != password2:\n                            sys.stderr.write('\"admin\" password confirmation '\n                                'doesn\\'t match \"admin\" password.\\n')\n                            continue\n                        if not password:\n                            sys.stderr.write('\"admin\" password is required.\\n')\n                            continue\n                        break\n                if not options.reset_password:\n                    admin.password = password\n            admin.save()\n            if options.reset_password:\n                User.reset_password([admin])\n            if options.hostname is not None:\n                configuration.hostname = options.hostname or None\n            configuration.save()\n        with Transaction().start(db_name, 0, readonly=True):\n            if options.validate is not None:\n                validate(options.validate, options.validate_percentage)\n\n\ndef validate(models, percentage=100):\n    from trytond.model import ModelSingleton, ModelStorage\n    from trytond.model.exceptions import ValidationError\n    logger = logging.getLogger('validate')\n    pool = Pool()\n    if not models:\n        models = sorted([n for n, _ in pool.iterobject()])\n    ratio = min(100, percentage) / 100\n    in_max = Transaction().database.IN_MAX\n    for name in models:\n        logger.info(\"validate: %s\", name)\n        Model = pool.get(name)\n        if not issubclass(Model, ModelStorage):\n            continue\n        offset = 0\n        limit = in_max\n        while True:\n            records = Model.search(\n                [], order=[('id', 'ASC')], offset=offset, limit=limit)\n            if not records:\n                break\n            records = Model.browse(\n                random.sample(records, int(len(records) * ratio)))\n            for record in records:\n                try:\n                    Model._validate([record])\n                except ValidationError as exception:\n                    logger.error(\"%s: KO '%s'\", record, exception)\n                else:\n                    logger.info(\"%s: OK\", record)\n            if issubclass(Model, ModelSingleton):\n                break\n            offset += limit\n"
  },
  {
    "path": "trytond/application.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport csv\nimport logging.config\nimport os\nimport threading\nfrom io import StringIO\n\n__all__ = ['app']\n\n# Logging must be set before importing\nlogging_config = os.environ.get('TRYTOND_LOGGING_CONFIG')\nlogging_level = int(os.environ.get(\n        'TRYTOND_LOGGING_LEVEL', default=logging.ERROR))\nif logging_config:\n    logging.config.fileConfig(logging_config)\nelse:\n    logformat = ('%(process)s %(thread)s [%(asctime)s] '\n        '%(levelname)s %(name)s %(message)s')\n    level = max(logging_level, logging.NOTSET)\n    logging.basicConfig(level=level, format=logformat)\nlogging.captureWarnings(True)\n\nif os.environ.get('TRYTOND_COROUTINE'):\n    from gevent import monkey\n    monkey.patch_all()\n\nfrom trytond.pool import Pool  # noqa: E402\nfrom trytond.wsgi import app  # noqa: E402\n\nPool.start()\n# TRYTOND_CONFIG it's managed by importing config\ndb_names = os.environ.get('TRYTOND_DATABASE_NAMES')\nif db_names:\n    # Read with csv so database name can include special chars\n    reader = csv.reader(StringIO(db_names))\n    threads = []\n    for name in next(reader):\n        thread = threading.Thread(target=Pool(name).init)\n        thread.start()\n        threads.append(thread)\n    for thread in threads:\n        thread.join()\n"
  },
  {
    "path": "trytond/backend/__init__.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport importlib\nimport urllib.parse\n\ntry:\n    import pkg_resources\nexcept ImportError:\n    pkg_resources = None\n\nfrom trytond.config import config\n\n__all__ = [\n    'name', 'Database', 'TableHandler',\n    'DatabaseIntegrityError', 'DatabaseDataError', 'DatabaseOperationalError']\n\n\nname = urllib.parse.urlparse(config.get('database', 'uri', default='')).scheme\n\n_modname = 'trytond.backend.%s' % name\ntry:\n    _module = importlib.import_module(_modname)\nexcept ImportError:\n    if not pkg_resources:\n        raise\n    for ep in pkg_resources.iter_entry_points('trytond.backend', name):\n        try:\n            _module = ep.load()\n            break\n        except ImportError:\n            continue\n    else:\n        raise\n\nDatabase = _module.Database\nDatabaseIntegrityError = _module.DatabaseIntegrityError\nDatabaseDataError = _module.DatabaseDataError\nDatabaseOperationalError = _module.DatabaseOperationalError\nTableHandler = _module.TableHandler\n"
  },
  {
    "path": "trytond/backend/database.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom collections import namedtuple\n\nfrom sql import For\n\nDatabaseIntegrityError = None\nDatabaseOperationalError = None\n\nSQLType = namedtuple('SQLType', 'base type')\n\n\nclass DatabaseInterface(object):\n    '''\n    Define generic interface for database connection\n    '''\n    flavor = None\n    IN_MAX = 1000\n\n    def __new__(cls, name=''):\n        return object.__new__(cls)\n\n    def __init__(self, name=''):\n        self.name = name\n\n    def connect(self):\n        raise NotImplementedError\n\n    def get_connection(self, autocommit=False, readonly=False):\n        raise NotImplementedError\n\n    def put_connection(self, connection, close=False):\n        raise NotImplementedError\n\n    def close(self):\n        raise NotImplementedError\n\n    @classmethod\n    def create(cls, connection, database_name):\n        raise NotImplementedError\n\n    @classmethod\n    def drop(cls, connection, database_name):\n        raise NotImplementedError\n\n    def list(self, hostname=None):\n        raise NotImplementedError\n\n    def init(self):\n        raise NotImplementedError\n\n    def test(self, hostname=None):\n        '''\n        Test if it is a Tryton database.\n        '''\n        raise NotImplementedError\n\n    def nextid(self, connection, table):\n        pass\n\n    def setnextid(self, connection, table, value):\n        pass\n\n    def currid(self, connection, table):\n        pass\n\n    @classmethod\n    def lock(cls, connection, table):\n        raise NotImplementedError\n\n    def lock_id(self, id, timeout=None):\n        raise NotImplementedError\n\n    def has_constraint(self, constraint):\n        raise NotImplementedError\n\n    def has_returning(self):\n        return False\n\n    def has_multirow_insert(self):\n        return False\n\n    def has_select_for(self):\n        return False\n\n    def get_select_for_skip_locked(self):\n        return For\n\n    def has_window_functions(self):\n        return False\n\n    def has_unaccent(self):\n        return False\n\n    def has_unaccent_indexable(self):\n        return False\n\n    def unaccent(self, value):\n        return value\n\n    def has_similarity(self):\n        return False\n\n    def similarity(self, column, value):\n        raise NotImplementedError\n\n    def has_search_full_text(self):\n        return False\n\n    def format_full_text(self, *documents, language=None):\n        return '\\n'.join(documents)\n\n    def format_full_text_query(self, query, language=None):\n        raise NotImplementedError\n\n    def search_full_text(self, document, query):\n        raise NotImplementedError\n\n    def rank_full_text(self, document, query, normalize=None):\n        \"Return the expression that ranks query on document\"\n        raise NotImplementedError\n\n    @classmethod\n    def has_sequence(cls):\n        return False\n\n    def sequence_exist(self, connection, name):\n        if not self.has_sequence():\n            return\n        raise NotImplementedError\n\n    def sequence_create(\n            self, connection, name, number_increment=1, start_value=1):\n        if not self.has_sequence():\n            return\n        raise NotImplementedError\n\n    def sequence_update(\n            self, connection, name, number_increment=1, start_value=1):\n        if not self.has_sequence():\n            return\n        raise NotImplementedError\n\n    def sequence_rename(self, connection, old_name, new_name):\n        if not self.has_sequence():\n            return\n        raise NotImplementedError\n\n    def sequence_delete(self, connection, name):\n        if not self.has_sequence():\n            return\n        raise NotImplementedError\n\n    def sequence_next_number(self, connection, name):\n        if not self.has_sequence():\n            return\n        raise NotImplementedError\n\n    def has_channel(self):\n        return False\n\n    def sql_type(self, type_):\n        pass\n\n    def sql_format(self, type_, value):\n        pass\n\n    def json_get(self, column, key=None):\n        raise NotImplementedError\n\n    def json_key_exists(self, column, key):\n        raise NotImplementedError\n\n    def json_any_keys_exist(self, column, keys):\n        raise NotImplementedError\n\n    def json_all_keys_exist(self, column, keys):\n        raise NotImplementedError\n\n    def json_contains(self, column, json):\n        raise NotImplementedError\n"
  },
  {
    "path": "trytond/backend/postgresql/__init__.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom .database import (\n    Database, DatabaseDataError, DatabaseIntegrityError,\n    DatabaseOperationalError)\nfrom .table import TableHandler\n\n__all__ = [\n    Database, TableHandler,\n    DatabaseIntegrityError, DatabaseDataError, DatabaseOperationalError]\n"
  },
  {
    "path": "trytond/backend/postgresql/database.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport json\nimport logging\nimport os\nimport time\nimport warnings\nfrom collections import defaultdict\nfrom datetime import datetime\nfrom decimal import Decimal\nfrom itertools import chain, repeat\nfrom threading import RLock\n\nfrom psycopg2 import Binary, connect\nfrom psycopg2.extensions import (\n    ISOLATION_LEVEL_REPEATABLE_READ, UNICODE, AsIs, cursor, register_adapter,\n    register_type)\nfrom psycopg2.pool import PoolError, ThreadedConnectionPool\nfrom psycopg2.sql import SQL, Identifier\n\ntry:\n    from psycopg2.extensions import PYDATE, PYDATETIME, PYINTERVAL, PYTIME\nexcept ImportError:\n    PYDATE, PYDATETIME, PYTIME, PYINTERVAL = None, None, None, None\nfrom psycopg2 import DataError as DatabaseDataError\nfrom psycopg2 import IntegrityError as DatabaseIntegrityError\nfrom psycopg2 import OperationalError as DatabaseOperationalError\nfrom psycopg2 import ProgrammingError\nfrom psycopg2.extras import register_default_json, register_default_jsonb\nfrom sql import Cast, Flavor, For, Table\nfrom sql.conditionals import Coalesce\nfrom sql.functions import Function\nfrom sql.operators import BinaryOperator, Concat\n\nfrom trytond.backend.database import DatabaseInterface, SQLType\nfrom trytond.config import config, parse_uri\nfrom trytond.tools.gevent import is_gevent_monkey_patched\n\n__all__ = [\n    'Database',\n    'DatabaseIntegrityError', 'DatabaseDataError', 'DatabaseOperationalError']\n\nlogger = logging.getLogger(__name__)\n\nos.environ['PGTZ'] = os.environ.get('TZ', '')\n_timeout = config.getint('database', 'timeout')\n_minconn = config.getint('database', 'minconn', default=1)\n_maxconn = config.getint('database', 'maxconn', default=64)\n_default_name = config.get('database', 'default_name', default='template1')\n\n\ndef unescape_quote(s):\n    if s.startswith('\"') and s.endswith('\"'):\n        return s.strip('\"').replace('\"\"', '\"')\n    return s\n\n\ndef replace_special_values(s, **mapping):\n    for name, value in mapping.items():\n        s = s.replace('$' + name, value)\n    return s\n\n\nclass LoggingCursor(cursor):\n    def execute(self, sql, args=None):\n        if logger.isEnabledFor(logging.DEBUG):\n            logger.debug(self.mogrify(sql, args))\n        cursor.execute(self, sql, args)\n\n\nclass ForSkipLocked(For):\n    def __str__(self):\n        assert not self.nowait, \"Can not use both NO WAIT and SKIP LOCKED\"\n        return super().__str__() + (' SKIP LOCKED' if not self.nowait else '')\n\n\nclass Unaccent(Function):\n    __slots__ = ()\n    _function = config.get('database', 'unaccent_function', default='unaccent')\n\n\nclass Similarity(Function):\n    __slots__ = ()\n    _function = config.get(\n        'database', 'similarity_function', default='similarity')\n\n\nclass Match(BinaryOperator):\n    __slots__ = ()\n    _operator = '@@'\n\n\nclass ToTsvector(Function):\n    __slots__ = ()\n    _function = 'to_tsvector'\n\n\nclass Setweight(Function):\n    __slots__ = ()\n    _function = 'setweight'\n\n\nclass TsQuery(Function):\n    __slots__ = ()\n\n\nclass ToTsQuery(TsQuery):\n    __slots__ = ()\n    _function = 'to_tsquery'\n\n\nclass PlainToTsQuery(TsQuery):\n    __slots__ = ()\n    _function = 'plainto_tsquery'\n\n\nclass PhraseToTsQuery(TsQuery):\n    __slots__ = ()\n    _function = 'phraseto_tsquery'\n\n\nclass WebsearchToTsQuery(TsQuery):\n    __slots__ = ()\n    _function = 'websearch_to_tsquery'\n\n\nclass TsRank(Function):\n    __slots__ = ()\n    _function = 'ts_rank'\n\n\nclass AdvisoryLock(Function):\n    _function = 'pg_advisory_xact_lock'\n\n\nclass TryAdvisoryLock(Function):\n    _function = 'pg_try_advisory_xact_lock'\n\n\nclass JSONBExtractPath(Function):\n    __slots__ = ()\n    _function = 'jsonb_extract_path'\n\n\nclass JSONKeyExists(BinaryOperator):\n    __slots__ = ()\n    _operator = '?'\n\n\nclass _BinaryOperatorArray(BinaryOperator):\n    \"Binary Operator that convert list into Array\"\n\n    @property\n    def _operands(self):\n        if isinstance(self.right, list):\n            return (self.left, None)\n        return super()._operands\n\n    @property\n    def params(self):\n        params = super().params\n        if isinstance(self.right, list):\n            params = params[:-1] + (self.right,)\n        return params\n\n\nclass JSONAnyKeyExist(_BinaryOperatorArray):\n    __slots__ = ()\n    _operator = '?|'\n\n\nclass JSONAllKeyExist(_BinaryOperatorArray):\n    __slots__ = ()\n    _operator = '?&'\n\n\nclass JSONContains(BinaryOperator):\n    __slots__ = ()\n    _operator = '@>'\n\n\nclass Database(DatabaseInterface):\n\n    index_translators = []\n    _lock = RLock()\n    _databases = defaultdict(dict)\n    _connpool = None\n    _list_cache = {}\n    _list_cache_timestamp = {}\n    _search_path = None\n    _current_user = None\n    _has_returning = None\n    _has_select_for_skip_locked = None\n    _has_proc = defaultdict(lambda: defaultdict(dict))\n    _extensions = defaultdict(dict)\n    _search_full_text_languages = defaultdict(dict)\n    flavor = Flavor(ilike=True)\n\n    TYPES_MAPPING = {\n        'BIGINT': SQLType('INT8', 'INT8'),\n        'BLOB': SQLType('BYTEA', 'BYTEA'),\n        'DATETIME': SQLType('TIMESTAMP', 'TIMESTAMP(0)'),\n        'FLOAT': SQLType('FLOAT8', 'FLOAT8'),\n        'FULLTEXT': SQLType('TSVECTOR', 'TSVECTOR'),\n        'INTEGER': SQLType('INT4', 'INT4'),\n        'JSON': SQLType('JSONB', 'JSONB'),\n        'TIMESTAMP': SQLType('TIMESTAMP', 'TIMESTAMP(6)'),\n        }\n\n    def __new__(cls, name=_default_name):\n        with cls._lock:\n            now = datetime.now()\n            databases = cls._databases[os.getpid()]\n            for database in list(databases.values()):\n                if ((now - database._last_use).total_seconds() > _timeout\n                        and database.name != name\n                        and not database._connpool._used):\n                    database.close()\n            if name in databases:\n                inst = databases[name]\n            else:\n                if name == _default_name:\n                    minconn = 0\n                else:\n                    minconn = _minconn\n                inst = DatabaseInterface.__new__(cls, name=name)\n                try:\n                    inst._connpool = ThreadedConnectionPool(\n                        minconn, _maxconn, **cls._connection_params(name),\n                        cursor_factory=LoggingCursor)\n                except Exception:\n                    logger.error(\n                        'connection to \"%s\" failed', name, exc_info=True)\n                    raise\n                else:\n                    logger.info('connection to \"%s\" succeeded', name)\n                databases[name] = inst\n            inst._last_use = datetime.now()\n            return inst\n\n    def __init__(self, name=_default_name):\n        super(Database, self).__init__(name)\n\n    @classmethod\n    def _connection_params(cls, name):\n        uri = parse_uri(config.get('database', 'uri'))\n        if uri.path and uri.path != '/':\n            warnings.warn(\"The path specified in the URI will be overridden\")\n        params = {\n            'dsn': uri._replace(path=name).geturl(),\n            }\n        return params\n\n    def connect(self):\n        return self\n\n    def get_connection(self, autocommit=False, readonly=False):\n        for count in range(config.getint('database', 'retry'), -1, -1):\n            try:\n                conn = self._connpool.getconn()\n                break\n            except PoolError:\n                if count and not self._connpool.closed:\n                    logger.info('waiting a connection')\n                    time.sleep(1)\n                    continue\n                raise\n            except Exception:\n                logger.error(\n                    'connection to \"%s\" failed', self.name, exc_info=True)\n                raise\n        conn.set_session(\n            isolation_level=ISOLATION_LEVEL_REPEATABLE_READ,\n            readonly=readonly,\n            autocommit=autocommit)\n        return conn\n\n    def put_connection(self, connection, close=False):\n        self._connpool.putconn(connection, close=close)\n\n    def close(self):\n        with self._lock:\n            logger.info('disconnection from \"%s\"', self.name)\n            self._connpool.closeall()\n            self._databases[os.getpid()].pop(self.name)\n\n    @classmethod\n    def create(cls, connection, database_name, template='template0'):\n        cursor = connection.cursor()\n        cursor.execute(\n            SQL(\n                \"CREATE DATABASE {} TEMPLATE {} ENCODING 'unicode'\")\n            .format(\n                Identifier(database_name),\n                Identifier(template)))\n        connection.commit()\n        cls._list_cache.clear()\n\n    @classmethod\n    def drop(cls, connection, database_name):\n        cursor = connection.cursor()\n        cursor.execute(SQL(\"DROP DATABASE {}\")\n            .format(Identifier(database_name)))\n        cls._list_cache.clear()\n        cls._has_proc.pop(database_name, None)\n        cls._search_full_text_languages.pop(database_name, None)\n\n    def get_version(self, connection):\n        version = connection.server_version\n        major, rest = divmod(int(version), 10000)\n        minor, patch = divmod(rest, 100)\n        return (major, minor, patch)\n\n    def list(self, hostname=None):\n        now = time.time()\n        timeout = config.getint('session', 'timeout')\n        res = self.__class__._list_cache.get(hostname)\n        timestamp = self.__class__._list_cache_timestamp.get(hostname, now)\n        if res and abs(timestamp - now) < timeout:\n            return res\n\n        connection = self.get_connection()\n        try:\n            cursor = connection.cursor()\n            cursor.execute('SELECT datname FROM pg_database '\n                'WHERE datistemplate = false ORDER BY datname')\n            res = []\n            for db_name, in cursor:\n                try:\n                    conn = connect(**self._connection_params(db_name))\n                    try:\n                        with conn:\n                            if self._test(conn, hostname=hostname):\n                                res.append(db_name)\n                    finally:\n                        conn.close()\n                except Exception:\n                    logger.debug(\n                        'Test failed for \"%s\"', db_name, exc_info=True)\n                    continue\n        finally:\n            self.put_connection(connection)\n\n        self.__class__._list_cache[hostname] = res\n        self.__class__._list_cache_timestamp[hostname] = now\n        return res\n\n    def init(self):\n        from trytond.modules import get_module_info\n\n        connection = self.get_connection()\n        try:\n            cursor = connection.cursor()\n            sql_file = os.path.join(os.path.dirname(__file__), 'init.sql')\n            with open(sql_file) as fp:\n                for line in fp.read().split(';'):\n                    if (len(line) > 0) and (not line.isspace()):\n                        cursor.execute(line)\n\n            for module in ('ir', 'res'):\n                state = 'not activated'\n                if module in ('ir', 'res'):\n                    state = 'to activate'\n                info = get_module_info(module)\n                cursor.execute('SELECT NEXTVAL(\\'ir_module_id_seq\\')')\n                module_id = cursor.fetchone()[0]\n                cursor.execute('INSERT INTO ir_module '\n                    '(id, create_uid, create_date, name, state) '\n                    'VALUES (%s, %s, now(), %s, %s)',\n                    (module_id, 0, module, state))\n                for dependency in info.get('depends', []):\n                    cursor.execute('INSERT INTO ir_module_dependency '\n                        '(create_uid, create_date, module, name) '\n                        'VALUES (%s, now(), %s, %s)',\n                        (0, module_id, dependency))\n\n            connection.commit()\n        finally:\n            self.put_connection(connection)\n\n    def test(self, hostname=None):\n        try:\n            connection = self.get_connection()\n        except Exception:\n            logger.debug('Test failed for \"%s\"', self.name, exc_info=True)\n            return False\n        try:\n            return self._test(connection, hostname=hostname)\n        finally:\n            self.put_connection(connection)\n\n    @classmethod\n    def _test(cls, connection, hostname=None):\n        cursor = connection.cursor()\n        tables = ('ir_model', 'ir_model_field', 'ir_ui_view', 'ir_ui_menu',\n            'res_user', 'res_group', 'ir_module', 'ir_module_dependency',\n            'ir_translation', 'ir_lang', 'ir_configuration')\n        cursor.execute('SELECT table_name FROM information_schema.tables '\n            'WHERE table_name IN %s', (tables,))\n        if len(cursor.fetchall()) != len(tables):\n            return False\n        if hostname:\n            try:\n                cursor.execute(\n                    'SELECT hostname FROM ir_configuration')\n                hostnames = {h for h, in cursor if h}\n                if hostnames and hostname not in hostnames:\n                    return False\n            except ProgrammingError:\n                pass\n        return True\n\n    def nextid(self, connection, table):\n        cursor = connection.cursor()\n        cursor.execute(\"SELECT NEXTVAL(%s)\", (table + '_id_seq',))\n        return cursor.fetchone()[0]\n\n    def setnextid(self, connection, table, value):\n        cursor = connection.cursor()\n        cursor.execute(\"SELECT SETVAL(%s, %s)\", (table + '_id_seq', value))\n\n    def currid(self, connection, table):\n        cursor = connection.cursor()\n        cursor.execute(SQL(\"SELECT last_value FROM {}\").format(\n                Identifier(table + '_id_seq')))\n        return cursor.fetchone()[0]\n\n    def lock(self, connection, table):\n        cursor = connection.cursor()\n        cursor.execute(SQL('LOCK {} IN EXCLUSIVE MODE NOWAIT').format(\n                Identifier(table)))\n\n    def lock_id(self, id, timeout=None):\n        if not timeout:\n            return TryAdvisoryLock(id)\n        else:\n            return AdvisoryLock(id)\n\n    def has_constraint(self, constraint):\n        return True\n\n    def has_multirow_insert(self):\n        return True\n\n    def get_table_schema(self, connection, table_name):\n        cursor = connection.cursor()\n        for schema in self.search_path:\n            cursor.execute('SELECT 1 '\n                'FROM information_schema.tables '\n                'WHERE table_name = %s AND table_schema = %s',\n                (table_name, schema))\n            if cursor.rowcount:\n                return schema\n\n    @property\n    def current_user(self):\n        if self._current_user is None:\n            connection = self.get_connection()\n            try:\n                cursor = connection.cursor()\n                cursor.execute('SELECT current_user')\n                self._current_user = cursor.fetchone()[0]\n            finally:\n                self.put_connection(connection)\n        return self._current_user\n\n    @property\n    def search_path(self):\n        if self._search_path is None:\n            connection = self.get_connection()\n            try:\n                cursor = connection.cursor()\n                cursor.execute('SHOW search_path')\n                path, = cursor.fetchone()\n                special_values = {\n                    'user': self.current_user,\n                }\n                self._search_path = [\n                    unescape_quote(replace_special_values(\n                            p.strip(), **special_values))\n                    for p in path.split(',')]\n            finally:\n                self.put_connection(connection)\n        return self._search_path\n\n    def has_returning(self):\n        if self._has_returning is None:\n            connection = self.get_connection()\n            try:\n                # RETURNING clause is available since PostgreSQL 8.2\n                self._has_returning = self.get_version(connection) >= (8, 2)\n            finally:\n                self.put_connection(connection)\n        return self._has_returning\n\n    def has_select_for(self):\n        return True\n\n    def get_select_for_skip_locked(self):\n        if self._has_select_for_skip_locked is None:\n            connection = self.get_connection()\n            try:\n                # SKIP LOCKED clause is available since PostgreSQL 9.5\n                self._has_select_for_skip_locked = (\n                    self.get_version(connection) >= (9, 5))\n            finally:\n                self.put_connection(connection)\n        if self._has_select_for_skip_locked:\n            return ForSkipLocked\n        else:\n            return For\n\n    def has_window_functions(self):\n        return True\n\n    @classmethod\n    def has_sequence(cls):\n        return True\n\n    def has_proc(self, name, property='oid'):\n        if (name in self._has_proc[self.name]\n                and property in self._has_proc[self.name][name]):\n            return self._has_proc[self.name][name][property]\n        connection = self.get_connection()\n        result = False\n        try:\n            cursor = connection.cursor()\n            cursor.execute(\n                SQL('SELECT {} FROM pg_proc WHERE proname=%s').format(\n                    Identifier(property)), (name,))\n            result = cursor.fetchone()\n            if result:\n                result, = result\n        finally:\n            self.put_connection(connection)\n        self._has_proc[self.name][name][property] = result\n        return result\n\n    def has_unaccent(self):\n        return self.has_proc(Unaccent._function)\n\n    def has_unaccent_indexable(self):\n        return self.has_proc(Unaccent._function, 'provolatile') == 'i'\n\n    def has_similarity(self):\n        return self.has_proc(Similarity._function)\n\n    def similarity(self, column, value):\n        return Similarity(column, value)\n\n    def has_search_full_text(self):\n        return True\n\n    def _search_full_text_language(self, language):\n        languages = self._search_full_text_languages[self.name]\n        if language not in languages:\n            lang = Table('ir_lang')\n            connection = self.get_connection()\n            try:\n                cursor = connection.cursor()\n                cursor.execute(*lang.select(\n                        Coalesce(lang.pg_text_search, 'simple'),\n                        where=lang.code == language,\n                        limit=1))\n                config_name, = cursor.fetchone()\n            finally:\n                self.put_connection(connection)\n            languages[language] = config_name\n        else:\n            config_name = languages[language]\n        return config_name\n\n    def format_full_text(self, *documents, language=None):\n        size = max(len(documents) // 4, 1)\n        if len(documents) > 1:\n            weights = chain(\n                ['A'] * size, ['B'] * size, ['C'] * size, repeat('D'))\n        else:\n            weights = [None]\n        expression = None\n        if language:\n            config_name = self._search_full_text_language(language)\n        else:\n            config_name = None\n        for document, weight in zip(documents, weights):\n            if not document:\n                continue\n            if config_name:\n                ts_vector = ToTsvector(config_name, document)\n            else:\n                ts_vector = ToTsvector('simple', document)\n            if weight:\n                ts_vector = Setweight(ts_vector, weight)\n            if expression is None:\n                expression = ts_vector\n            else:\n                expression = Concat(expression, ts_vector)\n        return expression\n\n    def format_full_text_query(self, query, language=None):\n        connection = self.get_connection()\n        try:\n            version = self.get_version(connection)\n        finally:\n            self.put_connection(connection)\n        if not isinstance(query, TsQuery):\n            if version >= (11, 0):\n                ToTsQuery = WebsearchToTsQuery\n            else:\n                ToTsQuery = PlainToTsQuery\n            if language:\n                config_name = self._search_full_text_language(language)\n            else:\n                config_name = 'simple'\n            query = ToTsQuery(config_name, query)\n        return query\n\n    def search_full_text(self, document, query):\n        return Match(document, query)\n\n    def rank_full_text(self, document, query, normalize=None):\n        # TODO: weights and cover density\n        norm_int = 0\n        if normalize:\n            values = {\n                'document log': 1,\n                'document': 2,\n                'mean': 4,\n                'word': 8,\n                'word log': 16,\n                'rank': 32,\n                }\n            for norm in normalize:\n                norm_int |= values.get(norm, 0)\n        return TsRank(document, query, norm_int)\n\n    def sql_type(self, type_):\n        if type_ in self.TYPES_MAPPING:\n            return self.TYPES_MAPPING[type_]\n        if type_.startswith('VARCHAR'):\n            return SQLType('VARCHAR', type_)\n        return SQLType(type_, type_)\n\n    def sql_format(self, type_, value):\n        if type_ == 'BLOB':\n            if value is not None:\n                return Binary(value)\n        return value\n\n    def unaccent(self, value):\n        if self.has_unaccent():\n            return Unaccent(value)\n        return value\n\n    def sequence_exist(self, connection, name):\n        cursor = connection.cursor()\n        for schema in self.search_path:\n            cursor.execute('SELECT 1 '\n                'FROM information_schema.sequences '\n                'WHERE sequence_name = %s AND sequence_schema = %s',\n                (name, schema))\n            if cursor.rowcount:\n                return True\n        return False\n\n    def sequence_create(\n            self, connection, name, number_increment=1, start_value=1):\n        cursor = connection.cursor()\n\n        cursor.execute(\n            SQL(\"CREATE SEQUENCE {} INCREMENT BY %s START WITH %s\").format(\n                Identifier(name)),\n            (number_increment, start_value))\n\n    def sequence_update(\n            self, connection, name, number_increment=1, start_value=1):\n        cursor = connection.cursor()\n        cursor.execute(\n            SQL(\"ALTER SEQUENCE {} INCREMENT BY %s RESTART WITH %s\").format(\n                Identifier(name)),\n            (number_increment, start_value))\n\n    def sequence_rename(self, connection, old_name, new_name):\n        cursor = connection.cursor()\n        if (self.sequence_exist(connection, old_name)\n                and not self.sequence_exist(connection, new_name)):\n            cursor.execute(\n                SQL(\"ALTER TABLE {} RENAME TO {}\").format(\n                    Identifier(old_name),\n                    Identifier(new_name)))\n\n    def sequence_delete(self, connection, name):\n        cursor = connection.cursor()\n        cursor.execute(SQL(\"DROP SEQUENCE {}\").format(\n                Identifier(name)))\n\n    def sequence_next_number(self, connection, name):\n        cursor = connection.cursor()\n        version = self.get_version(connection)\n        if version >= (10, 0):\n            cursor.execute(\n                'SELECT increment_by '\n                'FROM pg_sequences '\n                'WHERE sequencename=%s',\n                (name,))\n            increment, = cursor.fetchone()\n            cursor.execute(\n                SQL(\n                    'SELECT CASE WHEN NOT is_called THEN last_value '\n                    'ELSE last_value + %s '\n                    'END '\n                    'FROM {}').format(Identifier(name)),\n                (increment,))\n        else:\n            cursor.execute(\n                SQL(\n                    'SELECT CASE WHEN NOT is_called THEN last_value '\n                    'ELSE last_value + increment_by '\n                    'END '\n                    'FROM {}').format(Identifier(name)))\n        return cursor.fetchone()[0]\n\n    def has_channel(self):\n        return True\n\n    def has_extension(self, extension_name):\n        if extension_name in self._extensions[self.name]:\n            return self._extensions[self.name][extension_name]\n\n        connection = self.get_connection()\n        result = False\n        try:\n            cursor = connection.cursor()\n            cursor.execute(\n                \"SELECT 1 FROM pg_extension WHERE extname=%s\",\n                (extension_name,))\n            result = bool(cursor.rowcount)\n        finally:\n            self.put_connection(connection)\n        self._extensions[self.name][extension_name] = result\n        return result\n\n    def json_get(self, column, key=None):\n        column = Cast(column, 'jsonb')\n        if key:\n            column = JSONBExtractPath(column, key)\n        return column\n\n    def json_key_exists(self, column, key):\n        return JSONKeyExists(Cast(column, 'jsonb'), key)\n\n    def json_any_keys_exist(self, column, keys):\n        return JSONAnyKeyExist(Cast(column, 'jsonb'), keys)\n\n    def json_all_keys_exist(self, column, keys):\n        return JSONAllKeyExist(Cast(column, 'jsonb'), keys)\n\n    def json_contains(self, column, json):\n        return JSONContains(Cast(column, 'jsonb'), Cast(json, 'jsonb'))\n\n\nregister_type(UNICODE)\nif PYDATE:\n    register_type(PYDATE)\nif PYDATETIME:\n    register_type(PYDATETIME)\nif PYTIME:\n    register_type(PYTIME)\nif PYINTERVAL:\n    register_type(PYINTERVAL)\nregister_adapter(float, lambda value: AsIs(repr(value)))\nregister_adapter(Decimal, lambda value: AsIs(str(value)))\n\n\ndef convert_json(value):\n    from trytond.protocols.jsonrpc import JSONDecoder\n    return json.loads(value, object_hook=JSONDecoder())\n\n\nregister_default_json(loads=convert_json)\nregister_default_jsonb(loads=convert_json)\n\nif is_gevent_monkey_patched():\n    from psycopg2.extensions import set_wait_callback\n    from psycopg2.extras import wait_select\n    set_wait_callback(wait_select)\n"
  },
  {
    "path": "trytond/backend/postgresql/init.sql",
    "content": "CREATE SEQUENCE ir_configuration_id_seq;\n\nCREATE TABLE ir_configuration (\n    id INTEGER DEFAULT NEXTVAL('ir_configuration_id_seq') NOT NULL,\n    language VARCHAR,\n    hostname VARCHAR,\n    PRIMARY KEY(id)\n);\n\nCREATE SEQUENCE ir_model_id_seq;\n\nCREATE TABLE ir_model (\n    id INTEGER DEFAULT NEXTVAL('ir_model_id_seq') NOT NULL,\n    model VARCHAR NOT NULL,\n    name VARCHAR,\n    info TEXT,\n    module VARCHAR,\n    PRIMARY KEY(id)\n);\n\nCREATE SEQUENCE ir_model_field_id_seq;\n\nCREATE TABLE ir_model_field (\n    id INTEGER DEFAULT NEXTVAL('ir_model_field_id_seq') NOT NULL,\n    model INTEGER,\n    name VARCHAR NOT NULL,\n    relation VARCHAR,\n    field_description VARCHAR,\n    ttype VARCHAR,\n    help TEXT,\n    module VARCHAR,\n    \"access\" BOOL,\n    PRIMARY KEY(id),\n    FOREIGN KEY (model) REFERENCES ir_model(id) ON DELETE CASCADE\n);\n\nCREATE SEQUENCE ir_ui_view_id_seq;\n\nCREATE TABLE ir_ui_view (\n    id INTEGER DEFAULT NEXTVAL('ir_ui_view_id_seq') NOT NULL,\n    model VARCHAR NOT NULL,\n    \"type\" VARCHAR,\n    data TEXT NOT NULL,\n    field_childs VARCHAR,\n    priority INTEGER NOT NULL,\n    PRIMARY KEY(id)\n);\n\nCREATE SEQUENCE ir_ui_menu_id_seq;\n\nCREATE TABLE ir_ui_menu (\n    id INTEGER DEFAULT NEXTVAL('ir_ui_menu_id_seq') NOT NULL,\n    parent INTEGER,\n    name VARCHAR NOT NULL,\n    icon VARCHAR,\n    PRIMARY KEY (id),\n    FOREIGN KEY (parent) REFERENCES ir_ui_menu (id) ON DELETE SET NULL\n);\n\nCREATE SEQUENCE ir_translation_id_seq;\n\nCREATE TABLE ir_translation (\n    id INTEGER DEFAULT NEXTVAL('ir_translation_id_seq') NOT NULL,\n    lang VARCHAR,\n    src TEXT,\n    name VARCHAR NOT NULL,\n    res_id INTEGER,\n    value TEXT,\n    \"type\" VARCHAR,\n    module VARCHAR,\n    fuzzy BOOLEAN NOT NULL,\n    PRIMARY KEY(id)\n);\n\nCREATE SEQUENCE ir_lang_id_seq;\n\nCREATE TABLE ir_lang (\n    id INTEGER DEFAULT NEXTVAL('ir_lang_id_seq') NOT NULL,\n    name VARCHAR NOT NULL,\n    code VARCHAR NOT NULL,\n    translatable BOOLEAN NOT NULL,\n    parent VARCHAR,\n    active BOOLEAN NOT NULL,\n    direction VARCHAR NOT NULL,\n    PRIMARY KEY(id)\n);\n\nCREATE SEQUENCE res_user_id_seq;\n\nCREATE TABLE res_user (\n    id INTEGER DEFAULT NEXTVAL('res_user_id_seq') NOT NULL,\n    name VARCHAR NOT NULL,\n    active BOOLEAN NOT NULL,\n    login VARCHAR NOT NULL,\n    password VARCHAR,\n    PRIMARY KEY(id)\n);\n\nALTER TABLE res_user ADD CONSTRAINT res_user_login_key UNIQUE (login);\n\nINSERT INTO res_user (id, login, password, name, active) VALUES (0, 'root', NULL, 'Root', False);\n\nCREATE SEQUENCE res_group_id_seq;\n\nCREATE TABLE res_group (\n    id INTEGER DEFAULT NEXTVAL('res_group_id_seq') NOT NULL,\n    name VARCHAR NOT NULL,\n    PRIMARY KEY(id)\n);\n\nCREATE SEQUENCE \"res_user-res_group_id_seq\";\n\nCREATE TABLE \"res_user-res_group\" (\n    id INTEGER DEFAULT NEXTVAL('res_user-res_group_id_seq') NOT NULL,\n    \"user\" INTEGER NOT NULL,\n    \"group\" INTEGER NOT NULL,\n    FOREIGN KEY (\"user\") REFERENCES res_user (id) ON DELETE CASCADE,\n    FOREIGN KEY (\"group\") REFERENCES res_group (id) ON DELETE CASCADE,\n    PRIMARY KEY(id)\n);\n\nCREATE SEQUENCE ir_module_id_seq;\n\nCREATE TABLE ir_module (\n    id INTEGER DEFAULT NEXTVAL('ir_module_id_seq') NOT NULL,\n    create_uid INTEGER NOT NULL,\n    create_date TIMESTAMP WITHOUT TIME ZONE NOT NULL,\n    write_date TIMESTAMP WITHOUT TIME ZONE,\n    write_uid INTEGER,\n    name VARCHAR NOT NULL,\n    state VARCHAR,\n    PRIMARY KEY(id),\n    FOREIGN KEY (create_uid) REFERENCES res_user ON DELETE SET NULL,\n    FOREIGN KEY (write_uid) REFERENCES res_user ON DELETE SET NULL\n);\n\nALTER TABLE ir_module ADD CONSTRAINT ir_module_name_uniq UNIQUE (name);\n\nCREATE SEQUENCE ir_module_dependency_id_seq;\n\nCREATE TABLE ir_module_dependency (\n    id INTEGER DEFAULT NEXTVAL('ir_module_dependency_id_seq') NOT NULL,\n    create_uid INTEGER NOT NULL,\n    create_date TIMESTAMP WITHOUT TIME ZONE NOT NULL,\n    write_date TIMESTAMP WITHOUT TIME ZONE,\n    write_uid INTEGER,\n    name VARCHAR,\n    module INTEGER,\n    PRIMARY KEY(id),\n    FOREIGN KEY (create_uid) REFERENCES res_user ON DELETE SET NULL,\n    FOREIGN KEY (write_uid) REFERENCES res_user ON DELETE SET NULL,\n    FOREIGN KEY (module) REFERENCES ir_module ON DELETE CASCADE\n);\n\nCREATE SEQUENCE ir_cache_id_seq;\n\nCREATE TABLE ir_cache (\n    id INTEGER DEFAULT NEXTVAL('ir_cache_id_seq') NOT NULL,\n    name VARCHAR NOT NULL,\n    \"timestamp\" TIMESTAMP WITHOUT TIME ZONE\n);\n"
  },
  {
    "path": "trytond/backend/postgresql/table.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport logging\nimport re\n\nfrom psycopg2.sql import SQL, Identifier\n\nfrom trytond.backend.table import (\n    IndexTranslatorInterface, TableHandlerInterface)\nfrom trytond.transaction import Transaction\n\n__all__ = ['TableHandler']\n\nlogger = logging.getLogger(__name__)\nVARCHAR_SIZE_RE = re.compile(r'VARCHAR\\(([0-9]+)\\)')\n\n\nclass TableHandler(TableHandlerInterface):\n    namedatalen = 64\n    index_translators = []\n\n    def _init(self, model, history=False):\n        super()._init(model, history=history)\n        self.__columns = None\n        self.__constraints = None\n        self.__fk_deltypes = None\n        self.__indexes = None\n\n        transaction = Transaction()\n        cursor = transaction.connection.cursor()\n        # Create sequence if necessary\n        if not transaction.database.sequence_exist(\n                transaction.connection, self.sequence_name):\n            transaction.database.sequence_create(\n                transaction.connection, self.sequence_name)\n\n        # Create new table if necessary\n        if not self.table_exist(self.table_name):\n            cursor.execute(SQL('CREATE TABLE {} ()').format(\n                    Identifier(self.table_name)))\n        self.table_schema = transaction.database.get_table_schema(\n            transaction.connection, self.table_name)\n\n        cursor.execute('SELECT tableowner = current_user FROM pg_tables '\n            'WHERE tablename = %s AND schemaname = %s',\n            (self.table_name, self.table_schema))\n        self.is_owner, = cursor.fetchone()\n\n        if model.__doc__ and self.is_owner:\n            cursor.execute(SQL('COMMENT ON TABLE {} IS %s').format(\n                        Identifier(self.table_name)),\n                (model.__doc__,))\n\n        if 'id' not in self._columns:\n            if not self.history:\n                cursor.execute(\n                    SQL(\n                        \"ALTER TABLE {} ADD COLUMN id INTEGER \"\n                        \"DEFAULT nextval(%s) NOT NULL\").format(\n                        Identifier(self.table_name)),\n                    (self.sequence_name,))\n                cursor.execute(\n                    SQL('ALTER TABLE {} ADD PRIMARY KEY(id)')\n                    .format(Identifier(self.table_name)))\n            else:\n                cursor.execute(\n                    SQL('ALTER TABLE {} ADD COLUMN id INTEGER')\n                    .format(Identifier(self.table_name)))\n            self._update_definitions(columns=True)\n        if self.history and '__id' not in self._columns:\n            cursor.execute(\n                SQL(\n                    \"ALTER TABLE {} ADD COLUMN __id INTEGER \"\n                    \"DEFAULT nextval(%s) NOT NULL\").format(\n                        Identifier(self.table_name)),\n                (self.sequence_name,))\n            cursor.execute(\n                SQL('ALTER TABLE {} ADD PRIMARY KEY(__id)')\n                .format(Identifier(self.table_name)))\n            self._update_definitions(columns=True)\n        else:\n            default = \"nextval('%s'::regclass)\" % self.sequence_name\n            if self.history:\n                if self._columns['__id']['default'] != default:\n                    cursor.execute(\n                        SQL(\"ALTER TABLE {} \"\n                            \"ALTER __id SET DEFAULT nextval(%s::regclass)\")\n                        .format(Identifier(self.table_name)),\n                        (self.sequence_name,))\n                    self._update_definitions(columns=True)\n            if self._columns['id']['default'] != default:\n                cursor.execute(\n                    SQL(\"ALTER TABLE {} \"\n                        \"ALTER id SET DEFAULT nextval(%s::regclass)\")\n                    .format(Identifier(self.table_name)),\n                    (self.sequence_name,))\n                self._update_definitions(columns=True)\n\n    @classmethod\n    def table_exist(cls, table_name):\n        transaction = Transaction()\n        return bool(transaction.database.get_table_schema(\n                transaction.connection, table_name))\n\n    @classmethod\n    def table_rename(cls, old_name, new_name):\n        transaction = Transaction()\n        cursor = transaction.connection.cursor()\n        # Rename table\n        if (cls.table_exist(old_name)\n                and not cls.table_exist(new_name)):\n            cursor.execute(SQL('ALTER TABLE {} RENAME TO {}').format(\n                    Identifier(old_name), Identifier(new_name)))\n        # Rename sequence\n        old_sequence = old_name + '_id_seq'\n        new_sequence = new_name + '_id_seq'\n        transaction.database.sequence_rename(\n            transaction.connection, old_sequence, new_sequence)\n        # Rename history table\n        old_history = old_name + \"__history\"\n        new_history = new_name + \"__history\"\n        if (cls.table_exist(old_history)\n                and not cls.table_exist(new_history)):\n            cursor.execute('ALTER TABLE \"%s\" RENAME TO \"%s\"'\n                % (old_history, new_history))\n\n    def column_exist(self, column_name):\n        return column_name in self._columns\n\n    def column_rename(self, old_name, new_name):\n        cursor = Transaction().connection.cursor()\n        if self.column_exist(old_name):\n            if not self.column_exist(new_name):\n                cursor.execute(SQL(\n                        'ALTER TABLE {} RENAME COLUMN {} TO {}').format(\n                        Identifier(self.table_name),\n                        Identifier(old_name),\n                        Identifier(new_name)))\n                self._update_definitions(columns=True)\n            else:\n                logger.warning(\n                    'Unable to rename column %s on table %s to %s.',\n                    old_name, self.table_name, new_name)\n\n    @property\n    def _columns(self):\n        if self.__columns is None:\n            cursor = Transaction().connection.cursor()\n            self.__columns = {}\n            # Fetch columns definitions from the table\n            cursor.execute('SELECT '\n                'column_name, udt_name, is_nullable, '\n                'character_maximum_length, '\n                'column_default '\n                'FROM information_schema.columns '\n                'WHERE table_name = %s AND table_schema = %s',\n                (self.table_name, self.table_schema))\n            for column, typname, nullable, size, default in cursor:\n                self.__columns[column] = {\n                    'typname': typname,\n                    'notnull': True if nullable == 'NO' else False,\n                    'size': size,\n                    'default': default,\n                    }\n        return self.__columns\n\n    @property\n    def _constraints(self):\n        if self.__constraints is None:\n            cursor = Transaction().connection.cursor()\n            # fetch constraints for the table\n            cursor.execute('SELECT constraint_name '\n                'FROM information_schema.table_constraints '\n                'WHERE table_name = %s AND table_schema = %s',\n                (self.table_name, self.table_schema))\n            self.__constraints = [c for c, in cursor]\n\n            # add nonstandard exclude constraint\n            cursor.execute('SELECT c.conname '\n                'FROM pg_namespace nc, '\n                    'pg_namespace nr, '\n                    'pg_constraint c, '\n                    'pg_class r '\n                'WHERE nc.oid = c.connamespace AND nr.oid = r.relnamespace '\n                    'AND c.conrelid = r.oid '\n                    \"AND c.contype = 'x' \"  # exclude type\n                    \"AND r.relkind IN ('r', 'p') \"\n                    'AND r.relname = %s AND nr.nspname = %s',\n                    (self.table_name, self.table_schema))\n            self.__constraints.extend((c for c, in cursor))\n        return self.__constraints\n\n    @property\n    def _fk_deltypes(self):\n        if self.__fk_deltypes is None:\n            cursor = Transaction().connection.cursor()\n            cursor.execute('SELECT k.column_name, r.delete_rule '\n                'FROM information_schema.key_column_usage AS k '\n                'JOIN information_schema.referential_constraints AS r '\n                'ON r.constraint_schema = k.constraint_schema '\n                'AND r.constraint_name = k.constraint_name '\n                'WHERE k.table_name = %s AND k.table_schema = %s',\n                (self.table_name, self.table_schema))\n            self.__fk_deltypes = dict(cursor)\n        return self.__fk_deltypes\n\n    @property\n    def _indexes(self):\n        if self.__indexes is None:\n            cursor = Transaction().connection.cursor()\n            # Fetch indexes defined for the table\n            cursor.execute(\"SELECT cl2.relname \"\n                \"FROM pg_index ind \"\n                    \"JOIN pg_class cl on (cl.oid = ind.indrelid) \"\n                    \"JOIN pg_namespace n ON (cl.relnamespace = n.oid) \"\n                    \"JOIN pg_class cl2 on (cl2.oid = ind.indexrelid) \"\n                \"WHERE cl.relname = %s AND n.nspname = %s \"\n                \"AND NOT ind.indisprimary AND NOT ind.indisunique\",\n                (self.table_name, self.table_schema))\n            self.__indexes = [l[0] for l in cursor]\n        return self.__indexes\n\n    def _update_definitions(self, columns=True, constraints=True):\n        if columns:\n            self.__columns = None\n        if constraints:\n            self.__constraints = None\n            self.__fk_deltypes = None\n\n    def alter_size(self, column_name, column_type):\n        cursor = Transaction().connection.cursor()\n        cursor.execute(\n            SQL(\"ALTER TABLE {} ALTER COLUMN {} TYPE {}\").format(\n                Identifier(self.table_name),\n                Identifier(column_name),\n                SQL(column_type)))\n        self._update_definitions(columns=True)\n\n    def alter_type(self, column_name, column_type):\n        cursor = Transaction().connection.cursor()\n        cursor.execute(SQL('ALTER TABLE {} ALTER {} TYPE {}').format(\n                Identifier(self.table_name),\n                Identifier(column_name),\n                SQL(column_type)))\n        self._update_definitions(columns=True)\n\n    def column_is_type(self, column_name, type_, *, size=-1):\n        db_type = self._columns[column_name]['typname'].upper()\n\n        database = Transaction().database\n        base_type = database.sql_type(type_).base.upper()\n        if base_type == 'VARCHAR' and (size is None or size >= 0):\n            same_size = self._columns[column_name]['size'] == size\n        else:\n            same_size = True\n\n        return base_type == db_type and same_size\n\n    def db_default(self, column_name, value):\n        if value in [True, False]:\n            test = str(value).lower()\n        else:\n            test = value\n        if self._columns[column_name]['default'] != test:\n            cursor = Transaction().connection.cursor()\n            cursor.execute(\n                SQL(\n                    'ALTER TABLE {} ALTER COLUMN {} SET DEFAULT %s').format(\n                    Identifier(self.table_name),\n                    Identifier(column_name)),\n                (value,))\n\n    def add_column(self, column_name, sql_type, default=None, comment=''):\n        cursor = Transaction().connection.cursor()\n        database = Transaction().database\n\n        column_type = database.sql_type(sql_type)\n        match = VARCHAR_SIZE_RE.match(sql_type)\n        field_size = int(match.group(1)) if match else None\n\n        def add_comment():\n            if comment and self.is_owner:\n                cursor.execute(\n                    SQL('COMMENT ON COLUMN {}.{} IS %s').format(\n                        Identifier(self.table_name),\n                        Identifier(column_name)),\n                    (comment,))\n        if self.column_exist(column_name):\n            if (column_name in ('create_date', 'write_date')\n                    and column_type[1].lower() != 'timestamp(6)'):\n                # Migrate dates from timestamp(0) to timestamp\n                cursor.execute(\n                    SQL(\n                        'ALTER TABLE {} ALTER COLUMN {} TYPE timestamp')\n                    .format(\n                        Identifier(self.table_name),\n                        Identifier(column_name)))\n\n            add_comment()\n            base_type = column_type[0].lower()\n            if base_type != self._columns[column_name]['typname']:\n                if (self._columns[column_name]['typname'], base_type) in [\n                        ('varchar', 'text'),\n                        ('text', 'varchar'),\n                        ('date', 'timestamp'),\n                        ('int4', 'int8'),\n                        ('int4', 'float8'),\n                        ('int4', 'numeric'),\n                        ('int8', 'float8'),\n                        ('int8', 'numeric'),\n                        ('float8', 'numeric'),\n                        ]:\n                    self.alter_type(column_name, base_type)\n                else:\n                    logger.warning(\n                        'Unable to migrate column %s on table %s '\n                        'from %s to %s.',\n                        column_name, self.table_name,\n                        self._columns[column_name]['typname'], base_type)\n\n            if (base_type == 'varchar'\n                    and self._columns[column_name]['typname'] == 'varchar'):\n                # Migrate size\n                from_size = self._columns[column_name]['size']\n                if field_size is None:\n                    if from_size:\n                        self.alter_size(column_name, base_type)\n                elif from_size == field_size:\n                    pass\n                elif from_size and from_size < field_size:\n                    self.alter_size(column_name, column_type[1])\n                else:\n                    logger.warning(\n                        'Unable to migrate column %s on table %s '\n                        'from varchar(%s) to varchar(%s).',\n                        column_name, self.table_name,\n                        from_size if from_size and from_size > 0 else \"\",\n                        field_size)\n            return\n\n        column_type = column_type[1]\n        cursor.execute(\n            SQL('ALTER TABLE {} ADD COLUMN {} {}').format(\n                Identifier(self.table_name),\n                Identifier(column_name),\n                SQL(column_type)))\n        add_comment()\n\n        if default:\n            # check if table is non-empty:\n            cursor.execute('SELECT 1 FROM \"%s\" limit 1' % self.table_name)\n            if cursor.rowcount:\n                # Populate column with default values:\n                cursor.execute(\n                    SQL('UPDATE {} SET {} = %s').format(\n                        Identifier(self.table_name),\n                        Identifier(column_name)),\n                    (default(),))\n\n        self._update_definitions(columns=True)\n\n    def add_fk(self, column_name, reference, on_delete=None):\n        if on_delete is not None:\n            on_delete = on_delete.upper()\n        else:\n            on_delete = 'SET NULL'\n\n        cursor = Transaction().connection.cursor()\n        name = self.convert_name(self.table_name + '_' + column_name + '_fkey')\n        if name in self._constraints:\n            if self._fk_deltypes.get(column_name) != on_delete:\n                self.drop_fk(column_name)\n                add = True\n            else:\n                add = False\n        else:\n            add = True\n        if add:\n            cursor.execute(\n                SQL(\n                    \"ALTER TABLE {table} \"\n                    \"ADD CONSTRAINT {constraint} \"\n                    \"FOREIGN KEY ({column}) REFERENCES {reference} \"\n                    \"ON DELETE {action}\"\n                    )\n                .format(\n                    table=Identifier(self.table_name),\n                    constraint=Identifier(name),\n                    column=Identifier(column_name),\n                    reference=Identifier(reference),\n                    action=SQL(on_delete)))\n        self._update_definitions(constraints=True)\n\n    def drop_fk(self, column_name, table=None):\n        self.drop_constraint(column_name + '_fkey', table=table)\n\n    def not_null_action(self, column_name, action='add'):\n        if not self.column_exist(column_name):\n            return\n\n        with Transaction().connection.cursor() as cursor:\n            if action == 'add':\n                if self._columns[column_name]['notnull']:\n                    return\n                cursor.execute(SQL(\n                        'SELECT id FROM {} WHERE {} IS NULL').format(\n                        Identifier(self.table_name),\n                        Identifier(column_name)))\n                if not cursor.rowcount:\n                    cursor.execute(\n                        SQL(\n                            'ALTER TABLE {} ALTER COLUMN {} SET NOT NULL')\n                        .format(\n                            Identifier(self.table_name),\n                            Identifier(column_name)))\n                    self._update_definitions(columns=True)\n                else:\n                    logger.warning(\n                        \"Unable to set not null on column %s of table %s.\\n\"\n                        \"Try restarting one more time.\\n\"\n                        \"If that doesn't work update the records and restart \"\n                        \"again.\",\n                        column_name, self.table_name)\n            elif action == 'remove':\n                if not self._columns[column_name]['notnull']:\n                    return\n                cursor.execute(\n                    SQL('ALTER TABLE {} ALTER COLUMN {} DROP NOT NULL')\n                    .format(\n                        Identifier(self.table_name),\n                        Identifier(column_name)))\n                self._update_definitions(columns=True)\n            else:\n                raise Exception('Not null action not supported!')\n\n    def add_constraint(self, ident, constraint):\n        ident = self.convert_name(self.table_name + \"_\" + ident)\n        if ident in self._constraints:\n            # This constrain already exist\n            return\n        cursor = Transaction().connection.cursor()\n        cursor.execute(\n            SQL('ALTER TABLE {} ADD CONSTRAINT {} {}').format(\n                Identifier(self.table_name),\n                Identifier(ident),\n                SQL(str(constraint))),\n            constraint.params)\n        self._update_definitions(constraints=True)\n\n    def drop_constraint(self, ident, table=None):\n        ident = self.convert_name((table or self.table_name) + \"_\" + ident)\n        if ident not in self._constraints:\n            return\n        cursor = Transaction().connection.cursor()\n        cursor.execute(\n            SQL('ALTER TABLE {} DROP CONSTRAINT {}').format(\n                Identifier(self.table_name), Identifier(ident)))\n        self._update_definitions(constraints=True)\n\n    def set_indexes(self, indexes):\n        cursor = Transaction().connection.cursor()\n        old = set(self._indexes)\n        for index in indexes:\n            translator = self.index_translator_for(index)\n            if translator:\n                name, query, params = translator.definition(index)\n                name = '_'.join([self.table_name, name])\n                name = 'idx_' + self.convert_name(name, reserved=len('idx_'))\n                cursor.execute(\n                    SQL('CREATE INDEX IF NOT EXISTS {} ON {} USING {}').format(\n                        Identifier(name),\n                        Identifier(self.table_name),\n                        query),\n                    params)\n                old.discard(name)\n        for name in old:\n            if name.startswith('idx_') or name.endswith('_index'):\n                cursor.execute(SQL('DROP INDEX {}').format(Identifier(name)))\n        self.__indexes = None\n\n    def drop_column(self, column_name):\n        if not self.column_exist(column_name):\n            return\n        cursor = Transaction().connection.cursor()\n        cursor.execute(SQL('ALTER TABLE {} DROP COLUMN {}').format(\n                Identifier(self.table_name),\n                Identifier(column_name)))\n        self._update_definitions(columns=True)\n\n    @classmethod\n    def drop_table(cls, model, table, cascade=False):\n        cursor = Transaction().connection.cursor()\n        cursor.execute('DELETE FROM ir_model_data WHERE model = %s', (model,))\n\n        query = 'DROP TABLE {}'\n        if cascade:\n            query = query + ' CASCADE'\n        cursor.execute(SQL(query).format(Identifier(table)))\n\n\nclass IndexMixin:\n\n    _type = None\n\n    def __init_subclass__(cls):\n        TableHandler.index_translators.append(cls)\n\n    @classmethod\n    def definition(cls, index):\n        expr_template = SQL('{expression} {collate} {opclass} {order}')\n        indexed_expressions = cls._get_indexed_expressions(index)\n        expressions = []\n        params = []\n        for expression, usage in indexed_expressions:\n            expressions.append(expr_template.format(\n                    **cls._get_expression_variables(expression, usage)))\n            params.extend(expression.params)\n\n        include = SQL('')\n        if index.options.get('include'):\n            include = SQL('INCLUDE ({columns})').format(\n                columns=SQL(',').join(map(\n                        lambda c: SQL(str(c)),\n                        index.options.get('include'))))\n\n        where = SQL('')\n        if index.options.get('where'):\n            where = SQL('WHERE {where}').format(\n                where=SQL(str(index.options['where'])))\n            params.extend(index.options['where'].params)\n\n        query = SQL('{type} ({expressions}) {include} {where}').format(\n            type=SQL(cls._type),\n            expressions=SQL(',').join(expressions),\n            include=include,\n            where=where)\n        name = cls._get_name(query, params)\n        return name, query, params\n\n    @classmethod\n    def _get_indexed_expressions(cls, index):\n        return index.expressions\n\n    @classmethod\n    def _get_expression_variables(cls, expression, usage):\n        variables = {\n            'expression': SQL(str(expression)),\n            'collate': SQL(''),\n            'opclass': SQL(''),\n            'order': SQL(''),\n            }\n        if usage.options.get('collation'):\n            variables['collate'] = SQL('COLLATE {}').format(\n                usage.options['collation'])\n        if usage.options.get('order'):\n            order = usage.options['order'].upper()\n            variables['order'] = SQL(order)\n        return variables\n\n\nclass HashTranslator(IndexMixin, IndexTranslatorInterface):\n    _type = 'HASH'\n\n    @classmethod\n    def score(cls, index):\n        if (len(index.expressions) > 1\n                or index.expressions[0][1].__class__.__name__ != 'Equality'):\n            return 0\n        return 100\n\n    @classmethod\n    def _get_indexed_expressions(cls, index):\n        return [\n            (e, u) for e, u in index.expressions\n            if u.__class__.__name__ == 'Equality'][:1]\n\n\nclass BTreeTranslator(IndexMixin, IndexTranslatorInterface):\n    _type = 'BTREE'\n\n    @classmethod\n    def score(cls, index):\n        score = 0\n        for _, usage in index.expressions:\n            if usage.__class__.__name__ == 'Range':\n                score += 100\n            elif usage.__class__.__name__ == 'Equality':\n                score += 50\n            elif usage.__class__.__name__ == 'Similarity':\n                score += 20\n                if usage.options.get('begin'):\n                    score += 100\n        return score\n\n    @classmethod\n    def _get_expressions(cls, index):\n        return [\n            (e, u) for e, u in index.expressions\n            if u.__class__.__name__ in {'Equality', 'Range'}]\n\n    @classmethod\n    def _get_expression_variables(cls, expression, usage):\n        params = super()._get_expression_variables(expression, usage)\n        if (usage.__class__.__name__ == 'Similarity'\n                and not usage.options.get('collation')):\n            # text_pattern_ops and varchar_pattern_ops are the same\n            params['opclass'] = SQL('varchar_pattern_ops')\n        return params\n\n\nclass TrigramTranslator(IndexMixin, IndexTranslatorInterface):\n    _type = 'GIN'\n\n    @classmethod\n    def score(cls, index):\n        has_trigram = Transaction().database.has_extension('pg_trgm')\n        if not has_trigram:\n            return 0\n\n        score = 0\n        for _, usage in index.expressions:\n            if usage.__class__.__name__ == 'Similarity':\n                score += 100\n            else:\n                return 0\n        return score\n\n    @classmethod\n    def _get_expressions(cls, index):\n        return [\n            (e, u) for e, u in index.expressions\n            if u.__class__.__name__ == 'Similarity']\n\n    @classmethod\n    def _get_expression_variables(cls, expression, usage):\n        params = super()._get_expression_variables(expression, usage)\n        if usage.__class__.__name__ == 'Similarity':\n            params['opclass'] = SQL('gin_trgm_ops')\n        return params\n"
  },
  {
    "path": "trytond/backend/sqlite/__init__.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom .database import (\n    Database, DatabaseDataError, DatabaseIntegrityError,\n    DatabaseOperationalError)\nfrom .table import TableHandler\n\n__all__ = [\n    Database, TableHandler,\n    DatabaseIntegrityError, DatabaseDataError, DatabaseOperationalError]\n"
  },
  {
    "path": "trytond/backend/sqlite/database.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport logging\nimport math\nimport os\nimport random\nimport sqlite3 as sqlite\nimport threading\nimport time\nimport urllib.parse\nimport warnings\nfrom decimal import Decimal\nfrom sqlite3 import DatabaseError\nfrom sqlite3 import IntegrityError as DatabaseIntegrityError\nfrom sqlite3 import OperationalError as DatabaseOperationalError\nfrom weakref import WeakKeyDictionary\n\nfrom sql import Expression, Flavor, Literal, Null, Query, Table\nfrom sql.conditionals import NullIf\nfrom sql.functions import (\n    CharLength, CurrentTimestamp, Extract, Function, Overlay, Position,\n    Substring, Trim)\nfrom werkzeug.security import safe_join\n\nfrom trytond.backend.database import DatabaseInterface, SQLType\nfrom trytond.config import config, parse_uri\nfrom trytond.transaction import Transaction\n\n__all__ = [\n    'Database',\n    'DatabaseIntegrityError', 'DatabaseDataError', 'DatabaseOperationalError']\nlogger = logging.getLogger(__name__)\n\n_default_name = config.get('database', 'default_name', default=':memory:')\n\n\nclass DatabaseDataError(DatabaseError):\n    pass\n\n\nclass SQLiteExtract(Function):\n    __slots__ = ()\n    _function = 'EXTRACT'\n\n    @staticmethod\n    def extract(lookup_type, date):\n        if date is None:\n            return None\n        if len(date) == 10:\n            year, month, day = map(int, date.split('-'))\n            date = datetime.date(year, month, day)\n        else:\n            datepart, timepart = date.split(\" \")\n            year, month, day = map(int, datepart.split(\"-\"))\n            timepart_full = timepart.split(\".\")\n            hours, minutes, seconds = map(int, timepart_full[0].split(\":\"))\n            if len(timepart_full) == 2:\n                microseconds = int(timepart_full[1])\n            else:\n                microseconds = 0\n            date = datetime.datetime(year, month, day, hours, minutes, seconds,\n                microseconds)\n        if lookup_type.lower() == 'century':\n            return date.year / 100 + (date.year % 100 and 1 or 0)\n        elif lookup_type.lower() == 'decade':\n            return date.year / 10\n        elif lookup_type.lower() == 'dow':\n            return (date.weekday() + 1) % 7\n        elif lookup_type.lower() == 'doy':\n            return date.timetuple().tm_yday\n        elif lookup_type.lower() == 'epoch':\n            return int(time.mktime(date.timetuple()))\n        elif lookup_type.lower() == 'microseconds':\n            return date.microsecond\n        elif lookup_type.lower() == 'millennium':\n            return date.year / 1000 + (date.year % 1000 and 1 or 0)\n        elif lookup_type.lower() == 'milliseconds':\n            return date.microsecond / 1000\n        elif lookup_type.lower() == 'quarter':\n            return date.month / 4 + 1\n        elif lookup_type.lower() == 'week':\n            return date.isocalendar()[1]\n        return getattr(date, lookup_type.lower())\n\n\ndef date_trunc(_type, date):\n    if not _type:\n        return date\n    for format_ in [\n            '%Y-%m-%d %H:%M:%S.%f',\n            '%Y-%m-%d %H:%M:%S',\n            '%Y-%m-%d',\n            '%H:%M:%S',\n            ]:\n        try:\n            value = datetime.datetime.strptime(date, format_)\n        except ValueError:\n            continue\n        else:\n            break\n    else:\n        return None\n    for attribute, replace in [\n            ('microsecond', 0),\n            ('second', 0),\n            ('minute', 0),\n            ('hour', 0),\n            ('day', 1),\n            ('month', 1)]:\n        if _type.lower().startswith(attribute):\n            break\n        value = value.replace(**{attribute: replace})\n    return str(value)\n\n\ndef split_part(text, delimiter, count):\n    if text is None:\n        return None\n    return (text.split(delimiter) + [''] * (count - 1))[count - 1]\n\n\nclass SQLitePosition(Function):\n    __slots__ = ()\n    _function = 'POSITION'\n\n    @staticmethod\n    def position(substring, string):\n        if string is None:\n            return\n        try:\n            return string.index(substring) + 1\n        except ValueError:\n            return 0\n\n\ndef replace(text, pattern, replacement):\n    return str(text).replace(pattern, replacement)\n\n\ndef now():\n    transaction = Transaction()\n    return _nows.setdefault(transaction, {}).setdefault(\n        transaction.started_at, datetime.datetime.now().isoformat(' '))\n\n\n_nows = WeakKeyDictionary()\n\n\ndef to_char(value, format):\n    try:\n        value = datetime.datetime.strptime(value, '%Y-%m-%d %H:%M:%S.%f')\n    except ValueError:\n        try:\n            value = datetime.datetime.strptime(value, '%Y-%m-%d').date()\n        except ValueError:\n            pass\n    if isinstance(value, datetime.date):\n        # Convert SQL pattern into compatible Python\n        return value.strftime(format\n            .replace('%', '%%')\n            .replace('HH12', '%I')\n            .replace('HH24', '%H')\n            .replace('HH', '%I')\n            .replace('MI', '%M')\n            .replace('SS', '%S')\n            .replace('US', '%f')\n            .replace('AM', '%p')\n            .replace('A.M.', '%p')\n            .replace('PM', '%p')\n            .replace('P.M.', '%p')\n            .replace('am', '%p')\n            .replace('a.m.', '%p')\n            .replace('pm', '%p')\n            .replace('p.m.', '%p')\n            .replace('YYYY', '%Y')\n            .replace('YY', '%y')\n            .replace('Month', '%B')\n            .replace('Mon', '%b')\n            .replace('MM', '%m')\n            .replace('Day', '%A')\n            .replace('Dy', '%a')\n            .replace('DDD', '%j')\n            .replace('DD', '%d')\n            .replace('D', '%w')\n            .replace('TZ', '%Z')\n            )\n    elif isinstance(value, datetime.timedelta):\n        raise NotImplementedError\n    else:\n        raise NotImplementedError\n\n\nclass SQLiteSubstring(Function):\n    __slots__ = ()\n    _function = 'SUBSTR'\n\n\nclass SQLiteOverlay(Function):\n    __slots__ = ()\n    _function = 'OVERLAY'\n\n    @staticmethod\n    def overlay(string, placing_string, from_, for_=None):\n        if for_ is None:\n            for_ = len(placing_string)\n        return string[:from_ - 1] + placing_string + string[from_ - 1 + for_:]\n\n\nclass SQLiteCharLength(Function):\n    __slots__ = ()\n    _function = 'LENGTH'\n\n\nclass SQLiteCurrentTimestamp(Function):\n    __slots__ = ()\n    _function = 'NOW'  # More precise\n\n\nclass SQLiteTrim(Trim):\n\n    def __str__(self):\n        flavor = Flavor.get()\n        param = flavor.param\n\n        function = {\n            'BOTH': 'TRIM',\n            'LEADING': 'LTRIM',\n            'TRAILING': 'RTRIM',\n            }[self.position]\n\n        def format(arg):\n            if isinstance(arg, str):\n                return param\n            else:\n                return str(arg)\n        return function + '(%s, %s)' % (\n            format(self.string), format(self.characters))\n\n    @property\n    def params(self):\n        if isinstance(self.string, str):\n            params = [self.string]\n        else:\n            params = list(self.string.params)\n        params.append(self.characters)\n        return params\n\n\ndef sign(value):\n    if value > 0:\n        return 1\n    elif value < 0:\n        return -1\n    else:\n        return value\n\n\ndef greatest(*args):\n    args = [a for a in args if a is not None]\n    if args:\n        return max(args)\n    else:\n        return None\n\n\ndef least(*args):\n    args = [a for a in args if a is not None]\n    if args:\n        return min(args)\n    else:\n        return None\n\n\ndef bool_and(*args):\n    return all(args)\n\n\ndef bool_or(*args):\n    return any(args)\n\n\ndef cbrt(value):\n    return math.pow(value, 1 / 3)\n\n\ndef div(a, b):\n    return a // b\n\n\ndef trunc(value, digits):\n    return math.trunc(value * 10 ** digits) / 10 ** digits\n\n\nMAPPING = {\n    Extract: SQLiteExtract,\n    Position: SQLitePosition,\n    Substring: SQLiteSubstring,\n    Overlay: SQLiteOverlay,\n    CharLength: SQLiteCharLength,\n    CurrentTimestamp: SQLiteCurrentTimestamp,\n    Trim: SQLiteTrim,\n    }\n\n\nclass JSONExtract(Function):\n    __slots__ = ()\n    _function = 'JSON_EXTRACT'\n\n\nclass JSONQuote(Function):\n    __slots__ = ()\n    _function = 'JSON_QUOTE'\n\n\nclass SQLiteCursor(sqlite.Cursor):\n\n    def __enter__(self):\n        return self\n\n    def __exit__(self, type, value, traceback):\n        pass\n\n\nclass SQLiteConnection(sqlite.Connection):\n\n    def cursor(self):\n        return super(SQLiteConnection, self).cursor(SQLiteCursor)\n\n\nclass Database(DatabaseInterface):\n\n    _local = threading.local()\n    _conn = None\n    flavor = Flavor(\n        paramstyle='qmark', function_mapping=MAPPING, null_ordering=False,\n        max_limit=-1)\n    IN_MAX = 200\n\n    TYPES_MAPPING = {\n        'BIGINT': SQLType('INTEGER', 'INTEGER'),\n        'BOOL': SQLType('BOOLEAN', 'BOOLEAN'),\n        'DATETIME': SQLType('TIMESTAMP', 'TIMESTAMP'),\n        'FULLTEXT': SQLType('TEXT', 'TEXT'),\n        'JSON': SQLType('TEXT', 'TEXT'),\n        }\n\n    def __new__(cls, name=_default_name):\n        if (name == ':memory:'\n                and getattr(cls._local, 'memory_database', None)):\n            return cls._local.memory_database\n        return DatabaseInterface.__new__(cls, name=name)\n\n    def __init__(self, name=_default_name):\n        super(Database, self).__init__(name=name)\n        if name == ':memory:':\n            Database._local.memory_database = self\n\n    def connect(self):\n        if self._conn is not None:\n            return self\n        self._conn = sqlite.connect(\n            self._make_uri(), uri=True,\n            detect_types=sqlite.PARSE_DECLTYPES | sqlite.PARSE_COLNAMES,\n            factory=SQLiteConnection)\n        self._conn.create_function('extract', 2, SQLiteExtract.extract)\n        self._conn.create_function('date_trunc', 2, date_trunc)\n        self._conn.create_function('split_part', 3, split_part)\n        self._conn.create_function('to_char', 2, to_char)\n        if sqlite.sqlite_version_info < (3, 3, 14):\n            self._conn.create_function('replace', 3, replace)\n        self._conn.create_function('now', 0, now)\n        self._conn.create_function('greatest', -1, greatest)\n        self._conn.create_function('least', -1, least)\n        self._conn.create_function('bool_and', -1, bool_and)\n        self._conn.create_function('bool_or', -1, bool_or)\n\n        # Mathematical functions\n        self._conn.create_function('cbrt', 1, cbrt)\n        self._conn.create_function('ceil', 1, math.ceil)\n        self._conn.create_function('degrees', 1, math.degrees)\n        self._conn.create_function('div', 2, div)\n        self._conn.create_function('exp', 1, math.exp)\n        self._conn.create_function('floor', 1, math.floor)\n        self._conn.create_function('ln', 1, math.log)\n        self._conn.create_function('log', 1, math.log10)\n        self._conn.create_function('mod', 2, math.fmod)\n        self._conn.create_function('pi', 0, lambda: math.pi)\n        self._conn.create_function('power', 2, math.pow)\n        self._conn.create_function('radians', 1, math.radians)\n        self._conn.create_function('sign', 1, sign)\n        self._conn.create_function('sqrt', 1, math.sqrt)\n        self._conn.create_function('trunc', 1, math.trunc)\n        self._conn.create_function('trunc', 2, trunc)\n\n        # Trigonomentric functions\n        self._conn.create_function('acos', 1, math.acos)\n        self._conn.create_function('asin', 1, math.asin)\n        self._conn.create_function('atan', 1, math.atan)\n        self._conn.create_function('atan2', 2, math.atan2)\n        self._conn.create_function('cos', 1, math.cos)\n        self._conn.create_function(\n            'cot', 1, lambda x: 1 / math.tan(x) if x else math.inf)\n        self._conn.create_function('sin', 1, math.sin)\n        self._conn.create_function('tan', 1, math.tan)\n\n        # Random functions\n        self._conn.create_function('random', 0, random.random)\n        self._conn.create_function('setseed', 1, random.seed)\n\n        # String functions\n        self._conn.create_function('overlay', 3, SQLiteOverlay.overlay)\n        self._conn.create_function('overlay', 4, SQLiteOverlay.overlay)\n        self._conn.create_function('position', 2, SQLitePosition.position)\n\n        if (hasattr(self._conn, 'set_trace_callback')\n                and logger.isEnabledFor(logging.DEBUG)):\n            self._conn.set_trace_callback(logger.debug)\n        self._conn.execute('PRAGMA foreign_keys = ON')\n        return self\n\n    def _make_uri(self):\n        uri = config.get('database', 'uri')\n        base_uri = parse_uri(uri)\n        if base_uri.path and base_uri.path != '/':\n            warnings.warn(\"The path specified in the URI will be overridden\")\n\n        if self.name == ':memory:':\n            query_string = urllib.parse.parse_qs(base_uri.query)\n            query_string['mode'] = 'memory'\n            query = urllib.parse.urlencode(query_string, doseq=True)\n            db_uri = base_uri._replace(netloc='', path='/', query=query)\n        else:\n            db_path = safe_join(\n                config.get('database', 'path'), self.name + '.sqlite')\n            if not os.path.isfile(db_path):\n                raise IOError(\"Database '%s' doesn't exist!\" % db_path)\n            db_uri = base_uri._replace(path=db_path)\n\n        # Use unparse before replacing sqlite with file because SQLite accepts\n        # a relative path URI like file:db/test.sqlite which doesn't conform to\n        # RFC8089 which urllib follows and enforces when the scheme is 'file'\n        db_uri = urllib.parse.urlunparse(db_uri)\n        return db_uri.replace('sqlite', 'file', 1)\n\n    def get_connection(self, autocommit=False, readonly=False):\n        if self._conn is None:\n            self.connect()\n        if autocommit:\n            self._conn.isolation_level = None\n        else:\n            self._conn.isolation_level = 'IMMEDIATE'\n        return self._conn\n\n    def put_connection(self, connection=None, close=False):\n        pass\n\n    def close(self):\n        if self.name == ':memory:':\n            return\n        if self._conn is None:\n            return\n        self._conn = None\n\n    @classmethod\n    def create(cls, connection, database_name):\n        if database_name == ':memory:':\n            path = ':memory:'\n        else:\n            if os.sep in database_name:\n                return\n            path = os.path.join(config.get('database', 'path'),\n                    database_name + '.sqlite')\n        with sqlite.connect(path) as conn:\n            cursor = conn.cursor()\n            cursor.close()\n\n    @classmethod\n    def drop(cls, connection, database_name):\n        if database_name == ':memory:':\n            cls._local.memory_database._conn = None\n            return\n        if os.sep in database_name:\n            return\n        os.remove(os.path.join(config.get('database', 'path'),\n            database_name + '.sqlite'))\n\n    def list(self, hostname=None):\n        res = []\n        listdir = [':memory:']\n        try:\n            listdir += os.listdir(config.get('database', 'path'))\n        except OSError:\n            pass\n        for db_file in listdir:\n            if db_file.endswith('.sqlite') or db_file == ':memory:':\n                if db_file == ':memory:':\n                    db_name = ':memory:'\n                else:\n                    db_name = db_file[:-7]\n                try:\n                    database = Database(db_name).connect()\n                except Exception:\n                    logger.debug(\n                        'Test failed for \"%s\"', db_name, exc_info=True)\n                    continue\n                if database.test(hostname=hostname):\n                    res.append(db_name)\n                database.close()\n        return res\n\n    def init(self):\n        from trytond.modules import get_module_info\n        Flavor.set(self.flavor)\n        with self.get_connection() as conn:\n            cursor = conn.cursor()\n            sql_file = os.path.join(os.path.dirname(__file__), 'init.sql')\n            with open(sql_file) as fp:\n                for line in fp.read().split(';'):\n                    if (len(line) > 0) and (not line.isspace()):\n                        cursor.execute(line)\n\n            ir_module = Table('ir_module')\n            ir_module_dependency = Table('ir_module_dependency')\n            for module in ('ir', 'res'):\n                state = 'not activated'\n                if module in ('ir', 'res'):\n                    state = 'to activate'\n                info = get_module_info(module)\n                insert = ir_module.insert(\n                    [ir_module.create_uid, ir_module.create_date,\n                        ir_module.name, ir_module.state],\n                    [[0, CurrentTimestamp(), module, state]])\n                cursor.execute(*insert)\n                cursor.execute('SELECT last_insert_rowid()')\n                module_id, = cursor.fetchone()\n                for dependency in info.get('depends', []):\n                    insert = ir_module_dependency.insert(\n                        [ir_module_dependency.create_uid,\n                            ir_module_dependency.create_date,\n                            ir_module_dependency.module,\n                            ir_module_dependency.name,\n                            ],\n                        [[0, CurrentTimestamp(), module_id, dependency]])\n                    cursor.execute(*insert)\n            conn.commit()\n\n    def test(self, hostname=None):\n        Flavor.set(self.flavor)\n        tables = ['ir_model', 'ir_model_field', 'ir_ui_view', 'ir_ui_menu',\n            'res_user', 'res_group', 'ir_module', 'ir_module_dependency',\n            'ir_translation', 'ir_lang', 'ir_configuration']\n        sqlite_master = Table('sqlite_master')\n        select = sqlite_master.select(sqlite_master.name)\n        select.where = sqlite_master.type == 'table'\n        select.where &= sqlite_master.name.in_(tables)\n        with self._conn as conn:\n            cursor = conn.cursor()\n            try:\n                cursor.execute(*select)\n            except Exception:\n                return False\n            if len(cursor.fetchall()) != len(tables):\n                return False\n            if hostname:\n                configuration = Table('ir_configuration')\n                try:\n                    cursor.execute(*configuration.select(\n                            configuration.hostname))\n                except Exception:\n                    return False\n                hostnames = {h for h, in cursor if h}\n                if hostnames and hostname not in hostnames:\n                    return False\n        return True\n\n    def lastid(self, cursor):\n        # This call is not thread safe\n        return cursor.lastrowid\n\n    def lock(self, connection, table):\n        pass\n\n    def lock_id(self, id, timeout=None):\n        return Literal(True)\n\n    def has_constraint(self, constraint):\n        return False\n\n    def has_multirow_insert(self):\n        return True\n\n    def has_window_functions(self):\n        return sqlite.sqlite_version_info >= (3, 25, 0)\n\n    def sql_type(self, type_):\n        if type_ in self.TYPES_MAPPING:\n            return self.TYPES_MAPPING[type_]\n        if type_.startswith('VARCHAR'):\n            return SQLType('VARCHAR', 'VARCHAR')\n        return SQLType(type_, type_)\n\n    def sql_format(self, type_, value):\n        if type_ in ('INTEGER', 'BIGINT'):\n            if (value is not None\n                    and not isinstance(value, (Query, Expression))):\n                value = int(value)\n        return value\n\n    def json_get(self, column, key=None):\n        if key:\n            column = JSONExtract(column, '$.%s' % key)\n        return NullIf(JSONQuote(column), JSONQuote(Null))\n\n\nsqlite.register_converter('NUMERIC', lambda val: Decimal(val.decode('utf-8')))\nsqlite.register_adapter(Decimal, lambda val: str(val).encode('utf-8'))\n\n\ndef adapt_datetime(val):\n    return val.replace(tzinfo=None).isoformat(\" \")\n\n\nsqlite.register_adapter(datetime.datetime, adapt_datetime)\nsqlite.register_adapter(datetime.time, lambda val: val.isoformat())\nsqlite.register_converter('TIME',\n    lambda val: datetime.time(*map(int, val.decode('utf-8').split(':'))))\nsqlite.register_adapter(datetime.timedelta, lambda val: val.total_seconds())\n\n\ndef convert_interval(value):\n    value = float(value)\n    # It is not allowed to instatiate timedelta with the min/max total seconds\n    if value >= _interval_max:\n        return datetime.timedelta.max\n    elif value <= _interval_min:\n        return datetime.timedelta.min\n    return datetime.timedelta(seconds=value)\n\n\n_interval_max = datetime.timedelta.max.total_seconds()\n_interval_min = datetime.timedelta.min.total_seconds()\nsqlite.register_converter('INTERVAL', convert_interval)\n"
  },
  {
    "path": "trytond/backend/sqlite/init.sql",
    "content": "CREATE TABLE ir_configuration (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    language VARCHAR,\n    hostname VARCHAR\n);\n\nCREATE TABLE ir_model (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    model VARCHAR,\n    name VARCHAR,\n    info TEXT,\n    module VARCHAR\n);\n\nCREATE TABLE ir_model_field (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    model INTEGER,\n    name VARCHAR,\n    relation VARCHAR,\n    field_description VARCHAR,\n    ttype VARCHAR,\n    help TEXT,\n    module VARCHAR,\n    \"access\" BOOLEAN\n);\n\n\nCREATE TABLE ir_ui_view (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    model VARCHAR,\n    \"type\" VARCHAR,\n    data TEXT,\n    field_childs VARCHAR,\n    priority INTEGER\n);\n\nCREATE TABLE ir_ui_menu (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    parent INTEGER,\n    name VARCHAR,\n    icon VARCHAR\n);\n\nCREATE TABLE ir_translation (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    lang VARCHAR,\n    src TEXT,\n    name VARCHAR,\n    res_id INTEGER,\n    value TEXT,\n    \"type\" VARCHAR,\n    module VARCHAR,\n    fuzzy BOOLEAN\n);\n\nCREATE TABLE ir_lang (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    name VARCHAR,\n    code VARCHAR,\n    translatable BOOLEAN,\n    parent VARCHAR,\n    active BOOLEAN,\n    direction VARCHAR\n);\n\nCREATE TABLE res_user (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    name VARCHAR,\n    active BOOLEAN,\n    login VARCHAR,\n    password VARCHAR\n);\n\nINSERT INTO res_user (id, login, password, name, active) VALUES (0, 'root', NULL, 'Root', 0);\n\nCREATE TABLE res_group (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    name VARCHAR\n);\n\nCREATE TABLE \"res_user-res_group\" (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    \"user\" INTEGER,\n    \"group\" INTEGER\n);\n\nCREATE TABLE ir_module (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    create_uid INTEGER,\n    create_date TIMESTAMP,\n    write_date TIMESTAMP,\n    write_uid INTEGER,\n    name VARCHAR,\n    state VARCHAR\n);\n\nCREATE TABLE ir_module_dependency (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    create_uid INTEGER,\n    create_date TIMESTAMP,\n    write_date TIMESTAMP,\n    write_uid INTEGER,\n    name VARCHAR,\n    module INTEGER\n);\n\nCREATE TABLE ir_cache (\n    id INTEGER PRIMARY KEY AUTOINCREMENT,\n    name VARCHAR,\n    \"timestamp\" TIMESTAMP\n);\n"
  },
  {
    "path": "trytond/backend/sqlite/table.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport logging\nimport re\nimport warnings\nfrom weakref import WeakKeyDictionary\n\nfrom trytond.backend.table import (\n    IndexTranslatorInterface, TableHandlerInterface)\nfrom trytond.transaction import Transaction\n\nfrom .database import sqlite\n\n__all__ = ['TableHandler']\n\nlogger = logging.getLogger(__name__)\nVARCHAR_SIZE_RE = re.compile(r'VARCHAR\\(([0-9]+)\\)')\n\n\ndef _escape_identifier(name):\n    return '\"%s\"' % name.replace('\"', '\"\"')\n\n\nclass TableHandler(TableHandlerInterface):\n    __handlers = WeakKeyDictionary()\n    index_translators = []\n\n    def _init(self, model, history=False):\n        super()._init(model, history=history)\n        self.__columns = None\n        self.__indexes = None\n        self._model = model\n\n        cursor = Transaction().connection.cursor()\n        # Create new table if necessary\n        if not self.table_exist(self.table_name):\n            if not self.history:\n                cursor.execute('CREATE TABLE %s '\n                    '(id INTEGER PRIMARY KEY AUTOINCREMENT)'\n                    % _escape_identifier(self.table_name))\n            else:\n                cursor.execute('CREATE TABLE %s '\n                    '(__id INTEGER PRIMARY KEY AUTOINCREMENT, '\n                    'id INTEGER)' % _escape_identifier(self.table_name))\n\n        self._update_definitions()\n\n    @classmethod\n    def table_exist(cls, table_name):\n        cursor = Transaction().connection.cursor()\n        cursor.execute(\"SELECT sql FROM sqlite_master \"\n            \"WHERE type = 'table' AND name = ?\",\n            (table_name,))\n        res = cursor.fetchone()\n        if not res:\n            return False\n        sql, = res\n\n        # Migration from 1.6 add autoincrement\n\n        if 'AUTOINCREMENT' not in sql.upper():\n            temp_sql = sql.replace(table_name, '_temp_%s' % table_name)\n            cursor.execute(temp_sql)\n            cursor.execute('PRAGMA table_info(\"' + table_name + '\")')\n            columns = [_escape_identifier(column)\n                for _, column, _, _, _, _ in cursor]\n            cursor.execute(('INSERT INTO %s '\n                    '(' + ','.join(columns) + ') '\n                    'SELECT ' + ','.join(columns)\n                    + ' FROM %s') % (\n                    _escape_identifier('_temp_' + table_name),\n                    _escape_identifier(table_name)))\n            cursor.execute('DROP TABLE %s' % _escape_identifier(table_name))\n            new_sql = sql.replace('PRIMARY KEY',\n                    'PRIMARY KEY AUTOINCREMENT')\n            cursor.execute(new_sql)\n            cursor.execute(('INSERT INTO \"%s\" '\n                    '(' + ','.join(columns) + ') '\n                    'SELECT ' + ','.join(columns)\n                    + ' FROM \"_temp_%s\"') % (table_name, table_name))\n            cursor.execute('DROP TABLE \"_temp_%s\"' % table_name)\n        return True\n\n    @classmethod\n    def table_rename(cls, old_name, new_name):\n        cursor = Transaction().connection.cursor()\n        if (cls.table_exist(old_name)\n                and not cls.table_exist(new_name)):\n            cursor.execute('ALTER TABLE %s RENAME TO %s'\n                % (_escape_identifier(old_name), _escape_identifier(new_name)))\n        # Rename history table\n        old_history = old_name + \"__history\"\n        new_history = new_name + \"__history\"\n        if (cls.table_exist(old_history)\n                and not cls.table_exist(new_history)):\n            cursor.execute('ALTER TABLE %s RENAME TO %s'\n                % (_escape_identifier(old_history),\n                    _escape_identifier(new_history)))\n\n    def column_exist(self, column_name):\n        return column_name in self._columns\n\n    def _recreate_table(self, update_columns=None, drop_columns=None):\n        if update_columns is None:\n            update_columns = {}\n        if drop_columns is None:\n            drop_columns = []\n        transaction = Transaction()\n        database = transaction.database\n        cursor = transaction.connection.cursor()\n        temp_table = '__temp_%s' % self.table_name\n        temp_columns = dict(self._columns)\n        self.table_rename(self.table_name, temp_table)\n        self._init(self._model, history=self.history)\n        columns, old_columns = [], []\n        for name, values in temp_columns.items():\n            if name in drop_columns:\n                continue\n            typname = update_columns.get(name, {}).get(\n                'typname', values['typname'])\n            size = update_columns.get(name, {}).get('size', values['size'])\n            name = update_columns.get(name, {}).get('name', name)\n            self._add_raw_column(\n                name, database.sql_type(typname), field_size=size)\n            columns.append(name)\n            old_columns.append(name)\n        cursor.execute(('INSERT INTO %s ('\n                + ','.join(_escape_identifier(x) for x in columns)\n                + ') SELECT '\n                + ','.join(_escape_identifier(x) for x in old_columns)\n                + ' FROM %s') % (\n                _escape_identifier(self.table_name),\n                _escape_identifier(temp_table)))\n        cursor.execute('DROP TABLE %s' % _escape_identifier(temp_table))\n        self._update_definitions()\n\n    def column_rename(self, old_name, new_name):\n        cursor = Transaction().connection.cursor()\n        if self.column_exist(old_name):\n            if not self.column_exist(new_name):\n                if sqlite.sqlite_version_info >= (3, 25, 0):\n                    cursor.execute('ALTER TABLE %s RENAME COLUMN %s TO %s' % (\n                            _escape_identifier(self.table_name),\n                            _escape_identifier(old_name),\n                            _escape_identifier(new_name)))\n                    self._update_definitions(columns=True)\n                else:\n                    self._recreate_table({old_name: {'name': new_name}})\n            else:\n                logger.warning(\n                    'Unable to rename column %s on table %s to %s.',\n                    old_name, self.table_name, new_name)\n\n    @property\n    def _columns(self):\n        if self.__columns is None:\n            cursor = Transaction().connection.cursor()\n            cursor.execute('PRAGMA table_info(\"' + self.table_name + '\")')\n            self.__columns = {}\n            for _, column, type_, notnull, hasdef, _ in cursor:\n                column = re.sub(r'^\\\"|\\\"$', '', column)\n                match = re.match(r'(\\w+)(\\((.*?)\\))?', type_)\n                if match:\n                    typname = match.group(1).upper()\n                    size = match.group(3) and int(match.group(3)) or 0\n                else:\n                    typname = type_.upper()\n                    size = None\n                self.__columns[column] = {\n                    'notnull': notnull,\n                    'hasdef': hasdef,\n                    'size': size,\n                    'typname': typname,\n                }\n        return self.__columns\n\n    @property\n    def _indexes(self):\n        if self.__indexes is None:\n            cursor = Transaction().connection.cursor()\n            try:\n                cursor.execute('PRAGMA index_list(\"' + self.table_name + '\")')\n            except IndexError:  # There is sometimes IndexError\n                cursor.execute('PRAGMA index_list(\"' + self.table_name + '\")')\n            self.__indexes = [l[1] for l in cursor]\n        return self.__indexes\n\n    def _update_definitions(self, columns=True):\n        if columns:\n            self.__columns = None\n\n    def alter_size(self, column_name, column_type):\n        self._recreate_table({column_name: {'size': column_type}})\n\n    def alter_type(self, column_name, column_type):\n        self._recreate_table({column_name: {'typname': column_type}})\n\n    def column_is_type(self, column_name, type_, *, size=-1):\n        db_type = self._columns[column_name]['typname'].upper()\n\n        database = Transaction().database\n        base_type = database.sql_type(type_).base.upper()\n        if base_type == 'VARCHAR' and (size is None or size >= 0):\n            same_size = self._columns[column_name]['size'] == size\n        else:\n            same_size = True\n\n        return base_type == db_type and same_size\n\n    def db_default(self, column_name, value):\n        warnings.warn('Unable to set default on column with SQLite backend')\n\n    def add_column(self, column_name, sql_type, default=None, comment=''):\n        database = Transaction().database\n        column_type = database.sql_type(sql_type)\n        match = VARCHAR_SIZE_RE.match(sql_type)\n        field_size = int(match.group(1)) if match else None\n\n        self._add_raw_column(column_name, column_type, default, field_size,\n            comment)\n\n    def _add_raw_column(self, column_name, column_type, default=None,\n            field_size=None, string=''):\n        if self.column_exist(column_name):\n            base_type = column_type[0].upper()\n            if base_type != self._columns[column_name]['typname']:\n                if (self._columns[column_name]['typname'], base_type) in [\n                        ('VARCHAR', 'TEXT'),\n                        ('TEXT', 'VARCHAR'),\n                        ('DATE', 'TIMESTAMP'),\n                        ('INTEGER', 'FLOAT'),\n                        ('INTEGER', 'NUMERIC'),\n                        ('FLOAT', 'NUMERIC'),\n                        ]:\n                    self.alter_type(column_name, base_type)\n                else:\n                    logger.warning(\n                        'Unable to migrate column %s on table %s '\n                        'from %s to %s.',\n                        column_name, self.table_name,\n                        self._columns[column_name]['typname'], base_type)\n\n            if (base_type == 'VARCHAR'\n                    and self._columns[column_name]['typname'] == 'VARCHAR'):\n                # Migrate size\n                from_size = self._columns[column_name]['size']\n                if field_size is None:\n                    if from_size > 0:\n                        self.alter_size(column_name, base_type)\n                elif from_size == field_size:\n                    pass\n                elif from_size and from_size < field_size:\n                    self.alter_size(column_name, column_type[1])\n                else:\n                    logger.warning(\n                        'Unable to migrate column %s on table %s '\n                        'from varchar(%s) to varchar(%s).',\n                        column_name, self.table_name,\n                        from_size if from_size and from_size > 0 else \"\",\n                        field_size)\n            return\n\n        cursor = Transaction().connection.cursor()\n        column_type = column_type[1]\n        cursor.execute(('ALTER TABLE %s ADD COLUMN %s %s') % (\n                _escape_identifier(self.table_name),\n                _escape_identifier(column_name),\n                column_type))\n\n        if default:\n            # check if table is non-empty:\n            cursor.execute('SELECT 1 FROM %s limit 1'\n                % _escape_identifier(self.table_name))\n            if cursor.fetchone():\n                # Populate column with default values:\n                cursor.execute('UPDATE ' + _escape_identifier(self.table_name)\n                    + ' SET ' + _escape_identifier(column_name) + ' = ?',\n                    (default(),))\n\n        self._update_definitions(columns=True)\n\n    def add_fk(self, column_name, reference, on_delete=None):\n        warnings.warn('Unable to add foreign key with SQLite backend')\n\n    def drop_fk(self, column_name, table=None):\n        warnings.warn('Unable to drop foreign key with SQLite backend')\n\n    def not_null_action(self, column_name, action='add'):\n        if not self.column_exist(column_name):\n            return\n\n        if action == 'add':\n            warnings.warn('Unable to set not null with SQLite backend')\n        elif action == 'remove':\n            warnings.warn('Unable to remove not null with SQLite backend')\n        else:\n            raise Exception('Not null action not supported!')\n\n    def add_constraint(self, ident, constraint):\n        warnings.warn('Unable to add constraint with SQLite backend')\n\n    def drop_constraint(self, ident, table=None):\n        warnings.warn('Unable to drop constraint with SQLite backend')\n\n    def set_indexes(self, indexes):\n        cursor = Transaction().connection.cursor()\n        old = set(self._indexes)\n        for index in indexes:\n            translator = self.index_translator_for(index)\n            if translator:\n                name, query, params = translator.definition(index)\n                name = '_'.join([self.table_name, name])\n                name = 'idx_' + self.convert_name(name, reserved=len('idx_'))\n                # SQLite does not support parameters for index creation\n                if not params:\n                    cursor.execute(\n                        'CREATE INDEX IF NOT EXISTS %s ON %s %s' % (\n                            _escape_identifier(name),\n                            _escape_identifier(self.table_name),\n                            query),\n                        params)\n                else:\n                    warnings.warn(\"Can not create index with parameters\")\n                old.discard(name)\n        for name in old:\n            if name.startswith('idx_') or name.endswith('_index'):\n                cursor.execute('DROP INDEX %s' % _escape_identifier(name))\n        self.__indexes = None\n\n    def drop_column(self, column_name):\n        if not self.column_exist(column_name):\n            return\n        transaction = Transaction()\n        cursor = transaction.connection.cursor()\n        if sqlite.sqlite_version_info >= (3, 35, 0):\n            cursor.execute('ALTER TABLE %s DROP COLUMN %s' % (\n                    _escape_identifier(self.table_name),\n                    _escape_identifier(column_name)))\n            self._update_definitions(columns=True)\n        else:\n            self._recreate_table(drop_columns=[column_name])\n\n    @classmethod\n    def drop_table(cls, model, table, cascade=False):\n        cursor = Transaction().connection.cursor()\n        cursor.execute('DELETE from ir_model_data where model = ?',\n            (model,))\n\n        query = 'DROP TABLE %s' % _escape_identifier(table)\n        if cascade:\n            query = query + ' CASCADE'\n        cursor.execute(query)\n\n\nclass IndexMixin:\n\n    def __init_subclass__(cls):\n        TableHandler.index_translators.append(cls)\n\n    @classmethod\n    def definition(cls, index):\n        expr_template = '%(expression)s %(collate)s %(order)s'\n        params = []\n        expressions = []\n        for expression, usage in index.expressions:\n            expressions.append(expr_template %\n                cls._get_expression_variables(expression, usage))\n            params.extend(expression.params)\n\n        where = ''\n        if index.options.get('where'):\n            where = 'WHERE %s' % index.options['where']\n            params.extend(index.options['where'].params)\n\n        query = '(%(expressions)s) %(where)s' % {\n            'expressions': ','.join(expressions),\n            'where': where,\n            }\n        name = cls._get_name(query, params)\n        return name, query, params\n\n    @classmethod\n    def _get_expression_variables(cls, expression, usage):\n        variables = {\n            'expression': str(expression),\n            'collate': '',\n            'order': '',\n            }\n        if usage.options.get('collation'):\n            variables['collate'] = 'COLLATE %s' % usage.options['collation']\n        if usage.options.get('order'):\n            order = usage.options['order'].upper()\n            for predicate in ['NULLS FIRST', 'NULLS LAST']:\n                if order.endswith(predicate):\n                    order = order[:-len(predicate)]\n            variables['order'] = order\n        return variables\n\n\nclass IndexTranslator(IndexMixin, IndexTranslatorInterface):\n\n    @classmethod\n    def score(cls, index):\n        supported_indexes_count = sum(\n            int(u.__class__.__name__ in {'Equality', 'Range'})\n            for _, u in index.expressions)\n        return supported_indexes_count * 100\n"
  },
  {
    "path": "trytond/backend/table.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport hashlib\nfrom weakref import WeakKeyDictionary\n\nfrom trytond.transaction import Transaction\n\n\nclass TableHandlerInterface(object):\n    '''\n    Define generic interface to handle database table\n    '''\n    namedatalen = None\n    index_translators = None\n    __handlers = WeakKeyDictionary()\n\n    def __new__(cls, model, history=False):\n        transaction = Transaction()\n        handlers = cls.__handlers.setdefault(transaction, {})\n        key = (model.__name__, history)\n        if key not in handlers:\n            instance = handlers[key] = super().__new__(cls)\n            instance._init(model, history=history)\n        return handlers[key]\n\n    def _init(self, model, history=False):\n        '''\n        :param model: the Model linked to the table\n        :param module_name: the module name\n        :param history: a boolean to define if it is a history table\n        '''\n        super(TableHandlerInterface, self).__init__()\n        if history:\n            self.table_name = model._table + '__history'\n        else:\n            self.table_name = model._table\n        self.object_name = model.__name__\n        if history:\n            self.sequence_name = self.table_name + '___id_seq'\n        else:\n            self.sequence_name = self.table_name + '_id_seq'\n        self.history = history\n\n    @classmethod\n    def table_exist(cls, table_name):\n        raise NotImplementedError\n\n    @classmethod\n    def table_rename(cls, old_name, new_name):\n        raise NotImplementedError\n\n    def column_exist(self, column_name):\n        raise NotImplementedError\n\n    def column_rename(self, old_name, new_name):\n        raise NotImplementedError\n\n    def alter_size(self, column_name, column_type):\n        raise NotImplementedError\n\n    def alter_type(self, column_name, column_type):\n        raise NotImplementedError\n\n    def column_is_type(self, column_name, type_, *, size=-1):\n        raise NotImplementedError\n\n    def db_default(self, column_name, value):\n        raise NotImplementedError\n\n    def add_column(self, column_name, abstract_type, default=None, comment=''):\n        raise NotImplementedError\n\n    def add_fk(self, column_name, reference, on_delete=None):\n        raise NotImplementedError\n\n    def drop_fk(self, column_name, table=None):\n        raise NotImplementedError\n\n    def not_null_action(self, column_name, action='add'):\n        raise NotImplementedError\n\n    def add_constraint(self, ident, constraint):\n        raise NotImplementedError\n\n    def drop_constraint(self, ident, table=None):\n        raise NotImplementedError\n\n    def create_index(self, index):\n        raise NotImplementedError\n\n    def drop_column(self, column_name):\n        raise NotImplementedError\n\n    @classmethod\n    def drop_table(cls, model, table, cascade=False):\n        raise NotImplementedError\n\n    @classmethod\n    def convert_name(cls, name, reserved=0):\n        if cls.namedatalen:\n            length = cls.namedatalen - reserved\n            if length <= 0:\n                raise ValueError\n            if len(name) >= length:\n                if isinstance(name, str):\n                    name = name.encode('utf-8')\n                name = hashlib.sha256(name).hexdigest()[:length - 1]\n        return name\n\n    def index_translator_for(self, index):\n        return next(\n            filter(\n                lambda t: t.score(index) > 0,\n                sorted(\n                    self.index_translators, key=lambda t: t.score(index),\n                    reverse=True)),\n            None)\n\n\nclass IndexTranslatorInterface:\n\n    @classmethod\n    def _get_name(cls, query, params):\n        def hash_(s):\n            return hashlib.shake_128(s.encode('utf-8')).hexdigest(16)\n        names = [str(query)]\n        if params:\n            names.append(str(params))\n        return '_'.join(map(hash_, names))\n\n    @classmethod\n    def definition(cls, index):\n        raise NotImplementedError\n\n    @classmethod\n    def score(cls, index):\n        raise NotImplementedError\n"
  },
  {
    "path": "trytond/bus.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport collections\nimport json\nimport logging\nimport os\nimport selectors\nimport threading\nimport time\nimport uuid\n\ntry:\n    from http import HTTPStatus\nexcept ImportError:\n    from http import client as HTTPStatus\n\nfrom urllib.parse import urljoin\n\nfrom werkzeug.exceptions import BadRequest\nfrom werkzeug.exceptions import NotImplemented as NotImplementedException\nfrom werkzeug.utils import redirect\nfrom werkzeug.wrappers import Response\n\nfrom trytond import backend\nfrom trytond.config import config\nfrom trytond.protocols.jsonrpc import JSONDecoder, JSONEncoder\nfrom trytond.tools import resolve\nfrom trytond.transaction import Transaction\nfrom trytond.wsgi import app\n\nlogger = logging.getLogger(__name__)\n\n_db_timeout = config.getint('database', 'timeout')\n_cache_timeout = config.getint('bus', 'cache_timeout')\n_select_timeout = config.getint('bus', 'select_timeout')\n_long_polling_timeout = config.getint('bus', 'long_polling_timeout')\n_allow_subscribe = config.getboolean('bus', 'allow_subscribe')\n_url_host = config.get('bus', 'url_host')\n_web_cache_timeout = config.getint('web', 'cache_timeout')\n\n\nclass _MessageQueue:\n\n    Message = collections.namedtuple('Message', 'channel content timestamp')\n\n    def __init__(self, timeout):\n        super().__init__()\n        self._lock = collections.defaultdict(threading.Lock)\n        self._timeout = timeout\n        self._messages = []\n\n    def append(self, channel, element):\n        self._messages.append(\n            self.Message(channel, element, time.time()))\n\n    def get_next(self, channels, from_id=None):\n        oldest = time.time() - self._timeout\n        to_delete_index = 0\n        found = False\n        first_message = None\n        message = self.Message(None, None, None)\n        for idx, item in enumerate(self._messages):\n            if item.timestamp < oldest:\n                to_delete_index = idx\n                continue\n            if item.channel not in channels:\n                continue\n            if not first_message:\n                first_message = item\n            if from_id is None or found:\n                message = item\n                break\n            found = item.content['message_id'] == from_id\n        else:\n            if first_message and not found:\n                message = first_message\n\n        with self._lock[os.getpid()]:\n            del self._messages[:to_delete_index]\n\n        return message.channel, message.content\n\n\nclass LongPollingBus:\n\n    _channel = 'bus'\n    _queues_lock = collections.defaultdict(threading.Lock)\n    _queues = collections.defaultdict(\n        lambda: {'timeout': None, 'events': collections.defaultdict(list)})\n    _messages = {}\n\n    @classmethod\n    def subscribe(cls, database, channels, last_message=None):\n        pid = os.getpid()\n        with cls._queues_lock[pid]:\n            start_listener = (pid, database) not in cls._queues\n            cls._queues[pid, database]['timeout'] = time.time() + _db_timeout\n            if start_listener:\n                listener = threading.Thread(\n                    target=cls._listen, args=(database,), daemon=True)\n                cls._queues[pid, database]['listener'] = listener\n                listener.start()\n\n        messages = cls._messages.get(database)\n        if messages:\n            channel, content = messages.get_next(channels, last_message)\n            if content:\n                return cls.create_response(channel, content)\n\n        event = threading.Event()\n        for channel in channels:\n            if channel in cls._queues[pid, database]['events']:\n                event_channel = cls._queues[pid, database]['events'][channel]\n            else:\n                with cls._queues_lock[pid]:\n                    event_channel = cls._queues[pid, database][\n                        'events'][channel]\n            event_channel.append(event)\n\n        triggered = event.wait(_long_polling_timeout)\n        if not triggered:\n            response = cls.create_response(None, None)\n        else:\n            response = cls.create_response(\n                *cls._messages[database].get_next(channels, last_message))\n\n        with cls._queues_lock[pid]:\n            for channel in channels:\n                events = cls._queues[pid, database]['events'][channel]\n                for e in events[:]:\n                    if e.is_set():\n                        events.remove(e)\n\n        return response\n\n    @classmethod\n    def create_response(cls, channel, message):\n        response_data = {\n            'message': message,\n            'channel': channel,\n            }\n        logger.debug('Bus: %s', response_data)\n        return response_data\n\n    @classmethod\n    def _listen(cls, database):\n        db = backend.Database(database)\n        if not db.has_channel():\n            raise NotImplementedException\n\n        logger.info(\"listening on channel '%s'\", cls._channel)\n        conn = db.get_connection(autocommit=True)\n        pid = os.getpid()\n        selector = selectors.DefaultSelector()\n        try:\n            cursor = conn.cursor()\n            cursor.execute('LISTEN \"%s\"' % cls._channel)\n\n            cls._messages[database] = messages = _MessageQueue(_cache_timeout)\n\n            now = time.time()\n            selector.register(conn, selectors.EVENT_READ)\n            while cls._queues[pid, database]['timeout'] > now:\n                selector.select(timeout=_select_timeout)\n                conn.poll()\n                while conn.notifies:\n                    notification = conn.notifies.pop()\n                    payload = json.loads(\n                        notification.payload,\n                        object_hook=JSONDecoder())\n                    channel = payload['channel']\n                    message = payload['message']\n                    messages.append(channel, message)\n\n                    with cls._queues_lock[pid]:\n                        events = cls._queues[pid, database][\n                            'events'][channel].copy()\n                        cls._queues[pid, database]['events'][channel].clear()\n                    for event in events:\n                        event.set()\n                now = time.time()\n        except Exception:\n            logger.error('bus listener on \"%s\" crashed', database,\n                exc_info=True)\n\n            with cls._queues_lock[pid]:\n                del cls._queues[pid, database]\n            raise\n        finally:\n            selector.close()\n            db.put_connection(conn)\n\n        with cls._queues_lock[pid]:\n            if cls._queues[pid, database]['timeout'] <= now:\n                del cls._queues[pid, database]\n            else:\n                # A query arrived between the end of the while and here\n                listener = threading.Thread(\n                    target=cls._listen, args=(database,), daemon=True)\n                cls._queues[pid, database]['listener'] = listener\n                listener.start()\n\n    @classmethod\n    def publish(cls, channel, message):\n        transaction = Transaction()\n        if not transaction.database.has_channel():\n            logger.debug('Database backend do not support channels')\n            return\n\n        cursor = transaction.connection.cursor()\n        message['message_id'] = str(uuid.uuid4())\n        payload = json.dumps({\n                'channel': channel,\n                'message': message,\n                }, cls=JSONEncoder, separators=(',', ':'))\n        cursor.execute('NOTIFY \"%s\", %%s' % cls._channel, (payload,))\n\n\nif config.get('bus', 'class'):\n    Bus = resolve(config.get('bus', 'class'))\nelse:\n    Bus = LongPollingBus\n\n\n@app.route('/<string:database_name>/bus', methods=['POST'])\n@app.auth_required\ndef subscribe(request, database_name):\n    if not _allow_subscribe:\n        raise NotImplementedException\n    if _url_host and _url_host != request.host_url:\n        response = redirect(\n            urljoin(_url_host, request.path), HTTPStatus.PERMANENT_REDIRECT)\n        # Allow to change the redirection after some time\n        response.headers['Cache-Control'] = (\n            'private, max-age=%s' % _web_cache_timeout)\n        return response\n    user = request.authorization.get('userid')\n    channels = request.parsed_data.get('channels', [])\n    if user is None:\n        raise BadRequest\n\n    channels = set(filter(lambda c: not c.startswith('user:'), channels))\n    channels.add('user:%s' % user)\n\n    last_message = request.parsed_data.get('last_message')\n\n    logger.debug(\n        \"getting bus messages from %s@%s%s for %s since %s\",\n        request.authorization.username, request.remote_addr, request.path,\n        channels, last_message)\n    bus_response = Bus.subscribe(database_name, channels, last_message)\n    return Response(\n        json.dumps(bus_response, cls=JSONEncoder, separators=(',', ':')),\n        content_type='application/json')\n\n\ndef notify(title, body=None, priority=1, user=None, client=None):\n    if user is None:\n        if client is None:\n            context_client = Transaction().context.get('client')\n            if context_client:\n                channel = 'client:%s' % context_client\n            else:\n                return\n        else:\n            channel = 'client:%s' % client\n    elif client is None:\n        channel = 'user:%s' % user\n    else:\n        channel = 'client:%s' % client\n\n    return Bus.publish(channel, {\n            'type': 'notification',\n            'title': title,\n            'body': body,\n            'priority': priority,\n            })\n"
  },
  {
    "path": "trytond/cache.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime as dt\nimport json\nimport logging\nimport os\nimport selectors\nimport threading\nimport time\nfrom collections import OrderedDict, defaultdict\nfrom weakref import WeakKeyDictionary\n\nfrom sql import Table\nfrom sql.aggregate import Max\nfrom sql.functions import CurrentTimestamp, Function\n\nfrom trytond import backend\nfrom trytond.config import config\nfrom trytond.pool import Pool\nfrom trytond.tools import grouped_slice, resolve\nfrom trytond.transaction import Transaction\n\n__all__ = ['BaseCache', 'Cache', 'LRUDict', 'LRUDictTransaction']\n_clear_timeout = config.getint('cache', 'clean_timeout', default=5 * 60)\nlogger = logging.getLogger(__name__)\n\n\ndef _cast(column):\n    class SQLite_DateTime(Function):\n        __slots__ = ()\n        _function = 'DATETIME'\n\n    if backend.name == 'sqlite':\n        column = SQLite_DateTime(column)\n    return column\n\n\ndef freeze(o):\n    if isinstance(o, (set, tuple, list)):\n        return tuple(freeze(x) for x in o)\n    elif isinstance(o, dict):\n        return frozenset((x, freeze(y)) for x, y in o.items())\n    else:\n        return o\n\n\ndef unfreeze(o):\n    if isinstance(o, tuple):\n        return [unfreeze(x) for x in o]\n    elif isinstance(o, frozenset):\n        return dict((x, unfreeze(y)) for x, y in o)\n    else:\n        return o\n\n\ndef _get_modules(cursor):\n    ir_module = Table('ir_module')\n    cursor.execute(*ir_module.select(\n            ir_module.name,\n            where=ir_module.state.in_(\n                ['activated', 'to upgrade', 'to remove'])))\n    return {m for m, in cursor}\n\n\nclass BaseCache(object):\n    _instances = {}\n\n    def __init__(self, name, size_limit=1024, duration=None, context=True):\n        self._name = name\n        self.size_limit = size_limit\n        self.context = context\n        self.hit = self.miss = 0\n        if isinstance(duration, dt.timedelta):\n            self.duration = duration\n        elif isinstance(duration, (int, float)):\n            self.duration = dt.timedelta(seconds=duration)\n        elif duration:\n            self.duration = dt.timedelta(**duration)\n        else:\n            self.duration = None\n        assert self._name not in self._instances\n        self._instances[self._name] = self\n\n    @classmethod\n    def stats(cls):\n        for name, inst in cls._instances.items():\n            yield {\n                'name': name,\n                'hit': inst.hit,\n                'miss': inst.miss,\n                }\n\n    def _key(self, key):\n        if self.context:\n            context = Transaction().context.copy()\n            context.pop('client', None)\n            context.pop('_request', None)\n            context.pop('_check_access', None)\n            context.pop('_skip_warnings', None)\n            return (key, Transaction().user, freeze(context))\n        return key\n\n    def get(self, key, default=None):\n        raise NotImplementedError\n\n    def set(self, key, value):\n        raise NotImplementedError\n\n    def clear(self):\n        raise NotImplementedError\n\n    @classmethod\n    def clear_all(cls):\n        for inst in cls._instances.values():\n            inst.clear()\n\n    @classmethod\n    def sync(cls, transaction):\n        raise NotImplementedError\n\n    def sync_since(self, value):\n        raise NotImplementedError\n\n    @classmethod\n    def commit(cls, transaction):\n        raise NotImplementedError\n\n    @classmethod\n    def rollback(cls, transaction):\n        raise NotImplementedError\n\n    @classmethod\n    def drop(cls, dbname):\n        raise NotImplementedError\n\n\nclass MemoryCache(BaseCache):\n    \"\"\"\n    A key value LRU cache with size limit.\n    \"\"\"\n    _reset = WeakKeyDictionary()\n    _clean_last = dt.datetime.now()\n    _default_lower = Transaction.monotonic_time()\n    _listener = {}\n    _listener_lock = defaultdict(threading.Lock)\n    _table = 'ir_cache'\n    _channel = _table\n\n    def __init__(self, *args, **kwargs):\n        super(MemoryCache, self).__init__(*args, **kwargs)\n        self._database_cache = defaultdict(lambda: LRUDict(self.size_limit))\n        self._transaction_cache = WeakKeyDictionary()\n        self._transaction_lower = {}\n        self._timestamp = {}\n\n    def _get_cache(self):\n        transaction = Transaction()\n        dbname = transaction.database.name\n        lower = self._transaction_lower.get(dbname, self._default_lower)\n        if (transaction in self._reset\n                or transaction.started_at < lower):\n            try:\n                return self._transaction_cache[transaction]\n            except KeyError:\n                cache = self._database_cache.default_factory()\n                self._transaction_cache[transaction] = cache\n                return cache\n        else:\n            return self._database_cache[dbname]\n\n    def get(self, key, default=None):\n        key = self._key(key)\n        cache = self._get_cache()\n        try:\n            (expire, result) = cache.pop(key)\n            if expire and expire < dt.datetime.now():\n                self.miss += 1\n                return default\n            cache[key] = (expire, result)\n            self.hit += 1\n            return result\n        except (KeyError, TypeError):\n            self.miss += 1\n            return default\n\n    def set(self, key, value):\n        key = self._key(key)\n        cache = self._get_cache()\n        if self.duration:\n            expire = dt.datetime.now() + self.duration\n        else:\n            expire = None\n        try:\n            cache[key] = (expire, value)\n        except TypeError:\n            pass\n        return value\n\n    def clear(self):\n        transaction = Transaction()\n        self._reset.setdefault(transaction, set()).add(self._name)\n        self._transaction_cache.pop(transaction, None)\n\n    def _clear(self, dbname, timestamp=None):\n        logger.debug(\"clearing cache '%s' of '%s'\", self._name, dbname)\n        self._timestamp[dbname] = timestamp\n        self._database_cache[dbname] = self._database_cache.default_factory()\n        self._transaction_lower[dbname] = max(\n            Transaction.monotonic_time(),\n            self._transaction_lower.get(dbname, self._default_lower))\n\n    @classmethod\n    def _clear_all(cls, dbname):\n        for inst in cls._instances.values():\n            inst._clear(dbname)\n\n    @classmethod\n    def sync(cls, transaction):\n        database = transaction.database\n        dbname = database.name\n        if not _clear_timeout and database.has_channel():\n            pid = os.getpid()\n            with cls._listener_lock[pid]:\n                if (pid, dbname) not in cls._listener:\n                    cls._listener[pid, dbname] = listener = threading.Thread(\n                        target=cls._listen, args=(dbname,), daemon=True)\n                    listener.start()\n                    while (not getattr(listener, 'listening', False)\n                            and listener.is_alive()):\n                        time.sleep(.01)\n            return\n        last_clean = (dt.datetime.now() - cls._clean_last).total_seconds()\n        if last_clean < _clear_timeout:\n            return\n        connection = database.get_connection(readonly=True, autocommit=True)\n        try:\n            with connection.cursor() as cursor:\n                table = Table(cls._table)\n                cursor.execute(*table.select(\n                        _cast(table.timestamp), table.name))\n                timestamps = {}\n                for timestamp, name in cursor:\n                    timestamps[name] = timestamp\n                modules = _get_modules(cursor)\n        finally:\n            database.put_connection(connection)\n        for name, timestamp in timestamps.items():\n            try:\n                inst = cls._instances[name]\n            except KeyError:\n                continue\n            inst_timestamp = inst._timestamp.get(dbname)\n            if not inst_timestamp or timestamp > inst_timestamp:\n                inst._clear(dbname, timestamp)\n        Pool(dbname).refresh(modules)\n        cls._clean_last = dt.datetime.now()\n\n    def sync_since(self, value):\n        return self._clean_last > value\n\n    @classmethod\n    def commit(cls, transaction):\n        table = Table(cls._table)\n        reset = cls._reset.pop(transaction, None)\n        if not reset:\n            return\n        database = transaction.database\n        dbname = database.name\n        if not _clear_timeout and transaction.database.has_channel():\n            with transaction.connection.cursor() as cursor:\n                # The count computed as\n                # 8000 (max notify size) / 64 (max name data len)\n                for sub_reset in grouped_slice(reset, 125):\n                    cursor.execute(\n                        'NOTIFY \"%s\", %%s' % cls._channel,\n                        (json.dumps(list(sub_reset), separators=(',', ':')),))\n        else:\n            connection = database.get_connection(\n                readonly=False, autocommit=True)\n            try:\n                with connection.cursor() as cursor:\n                    for name in reset:\n                        cursor.execute(*table.select(table.name, table.id,\n                                table.timestamp,\n                                where=table.name == name,\n                                limit=1))\n                        if cursor.fetchone():\n                            # It would be better to insert only\n                            cursor.execute(*table.update([table.timestamp],\n                                    [CurrentTimestamp()],\n                                    where=table.name == name))\n                        else:\n                            cursor.execute(*table.insert(\n                                    [table.timestamp, table.name],\n                                    [[CurrentTimestamp(), name]]))\n\n                        cursor.execute(*table.select(\n                                Max(table.timestamp),\n                                where=table.name == name))\n                        timestamp, = cursor.fetchone()\n\n                        cursor.execute(*table.select(\n                                _cast(Max(table.timestamp)),\n                                where=table.name == name))\n                        timestamp, = cursor.fetchone()\n\n                        inst = cls._instances[name]\n                        inst._clear(dbname, timestamp)\n                connection.commit()\n            finally:\n                database.put_connection(connection)\n            cls._clean_last = dt.datetime.now()\n        reset.clear()\n\n    @classmethod\n    def rollback(cls, transaction):\n        cls._reset.pop(transaction, None)\n\n    @classmethod\n    def drop(cls, dbname):\n        pid = os.getpid()\n        with cls._listener_lock[pid]:\n            listener = cls._listener.pop((pid, dbname), None)\n        if listener:\n            database = backend.Database(dbname)\n            conn = database.get_connection()\n            try:\n                cursor = conn.cursor()\n                cursor.execute('NOTIFY \"%s\"' % cls._channel)\n                conn.commit()\n            finally:\n                database.put_connection(conn)\n            listener.join()\n        for inst in cls._instances.values():\n            inst._timestamp.pop(dbname, None)\n            inst._database_cache.pop(dbname, None)\n            inst._transaction_lower.pop(dbname, None)\n\n    @classmethod\n    def refresh_pool(cls, transaction):\n        database = transaction.database\n        dbname = database.name\n        if not _clear_timeout and database.has_channel():\n            database = backend.Database(dbname)\n            conn = database.get_connection()\n            try:\n                cursor = conn.cursor()\n                cursor.execute(\n                    'NOTIFY \"%s\", %%s' % cls._channel, ('refresh pool',))\n                conn.commit()\n            finally:\n                database.put_connection(conn)\n\n    @classmethod\n    def _listen(cls, dbname):\n        current_thread = threading.current_thread()\n        pid = os.getpid()\n\n        conn, selector = None, None\n        try:\n            database = backend.Database(dbname)\n            if not database.has_channel():\n                raise NotImplementedError\n\n            logger.info(\n                \"listening on channel '%s' of '%s'\", cls._channel, dbname)\n            conn = database.get_connection(autocommit=True)\n            selector = selectors.DefaultSelector()\n\n            cursor = conn.cursor()\n            cursor.execute('LISTEN \"%s\"' % cls._channel)\n            current_thread.listening = True\n\n            # Clear everything in case we missed a payload\n            Pool(dbname).refresh(_get_modules(cursor))\n            cls._clear_all(dbname)\n\n            selector.register(conn, selectors.EVENT_READ)\n            while cls._listener.get((pid, dbname)) == current_thread:\n                selector.select(timeout=60)\n                conn.poll()\n                while conn.notifies:\n                    notification = conn.notifies.pop()\n                    if notification.payload == 'refresh pool':\n                        Pool(dbname).refresh(_get_modules(cursor))\n                    elif notification.payload:\n                        reset = json.loads(notification.payload)\n                        for name in reset:\n                            inst = cls._instances[name]\n                            inst._clear(dbname)\n                cls._clean_last = dt.datetime.now()\n        except Exception:\n            logger.error(\n                \"cache listener on '%s' crashed\", dbname, exc_info=True)\n            raise\n        finally:\n            if selector:\n                selector.close()\n            if conn:\n                database.put_connection(conn)\n            with cls._listener_lock[pid]:\n                if cls._listener.get((pid, dbname)) == current_thread:\n                    del cls._listener[pid, dbname]\n\n\nif config.get('cache', 'class'):\n    Cache = resolve(config.get('cache', 'class'))\nelse:\n    Cache = MemoryCache\n\n\nclass LRUDict(OrderedDict):\n    \"\"\"\n    Dictionary with a size limit.\n    If size limit is reached, it will remove the first added items.\n    The default_factory provides the same behavior as in standard\n    collections.defaultdict.\n    If default_factory_with_key is set, the default_factory is called with the\n    missing key.\n    \"\"\"\n    __slots__ = ('size_limit',)\n\n    def __init__(self, size_limit,\n            default_factory=None, default_factory_with_key=False,\n            *args, **kwargs):\n        assert size_limit > 0\n        self.size_limit = size_limit\n        super(LRUDict, self).__init__(*args, **kwargs)\n        self.default_factory = default_factory\n        self.default_factory_with_key = default_factory_with_key\n        self._check_size_limit()\n\n    def __setitem__(self, key, value):\n        super(LRUDict, self).__setitem__(key, value)\n        self._check_size_limit()\n\n    def __missing__(self, key):\n        if self.default_factory is None:\n            raise KeyError(key)\n        if self.default_factory_with_key:\n            value = self.default_factory(key)\n        else:\n            value = self.default_factory()\n        self[key] = value\n        return value\n\n    def update(self, *args, **kwargs):\n        super(LRUDict, self).update(*args, **kwargs)\n        self._check_size_limit()\n\n    def setdefault(self, key, default=None):\n        default = super(LRUDict, self).setdefault(key, default=default)\n        self._check_size_limit()\n        return default\n\n    def _check_size_limit(self):\n        while len(self) > self.size_limit:\n            self.popitem(last=False)\n\n\nclass LRUDictTransaction(LRUDict):\n    \"\"\"\n    Dictionary with a size limit and default_factory. (see LRUDict)\n    It is refreshed when transaction counter is changed.\n    \"\"\"\n    __slots__ = ('transaction', 'counter')\n\n    def __init__(self, *args, **kwargs):\n        super(LRUDictTransaction, self).__init__(*args, **kwargs)\n        self.transaction = Transaction()\n        self.counter = self.transaction.counter\n\n    def clear(self):\n        super(LRUDictTransaction, self).clear()\n        self.counter = self.transaction.counter\n\n    def refresh(self):\n        if self.counter != self.transaction.counter:\n            self.clear()\n"
  },
  {
    "path": "trytond/commandline.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport argparse\nimport csv\nimport logging\nimport logging.config\nimport logging.handlers\nimport os\nimport os.path\nfrom contextlib import contextmanager\nfrom io import StringIO\n\nfrom trytond import __version__\n\nlogger = logging.getLogger(__name__)\n\n\ndef database_completer(parsed_args, **kwargs):\n    from trytond.config import config\n    from trytond.transaction import Transaction\n    config.update_etc(parsed_args.configfile)\n    with Transaction().start(\n            None, 0, readonly=True, close=True) as transaction:\n        return transaction.database.list()\n\n\ndef module_completer(**kwargs):\n    from trytond.modules import get_module_list\n    return get_module_list()\n\n\ndef language_completer(**kwargs):\n    files = os.listdir(os.path.join(os.path.dirname(__file__), 'ir', 'locale'))\n    return [os.path.splitext(f)[0] for f in files]\n\n\ndef get_base_parser():\n    parser = argparse.ArgumentParser()\n    parser.add_argument('--version', action='version',\n        version='%(prog)s ' + __version__)\n    parser.add_argument(\"-c\", \"--config\", dest=\"configfile\", metavar='FILE',\n        nargs='+', default=[os.environ.get('TRYTOND_CONFIG')],\n        help='Specify configuration files')\n    return parser\n\n\ndef get_parser():\n    parser = get_base_parser()\n\n    parser.add_argument(\"-v\", \"--verbose\", action='count',\n        dest=\"verbose\", default=0, help=\"enable verbose mode\")\n    parser.add_argument('--dev', dest='dev', action='store_true',\n        help='enable development mode')\n\n    db_names = os.environ.get('TRYTOND_DATABASE_NAMES')\n    if db_names:\n        db_names = list(next(csv.reader(StringIO(db_names))))\n    else:\n        db_names = []\n    parser.add_argument(\n        \"-d\", \"--database\", dest=\"database_names\", nargs='+',\n        default=db_names, metavar='DATABASE',\n        help=\"specify the database name\").completer = database_completer\n    parser.add_argument(\"--logconf\", dest=\"logconf\", metavar='FILE',\n        help=\"logging configuration file (ConfigParser format)\")\n\n    return parser\n\n\ndef get_parser_daemon():\n    parser = get_parser()\n    parser.add_argument(\"--pidfile\", dest=\"pidfile\", metavar='FILE',\n        help=\"file where the server pid will be stored\")\n    parser.add_argument(\"--coroutine\", action=\"store_true\", dest=\"coroutine\",\n        help=\"use coroutine for concurrency\")\n    return parser\n\n\ndef get_parser_worker():\n    parser = get_parser_daemon()\n    parser.add_argument(\"--name\", dest='name',\n        help=\"work only on the named queue\")\n    parser.add_argument(\"-n\", dest='processes', type=int,\n        help=\"number of processes to use\")\n    parser.add_argument(\"--max\", dest='maxtasksperchild', type=int,\n        help=\"number of tasks a worker process before being replaced\")\n    parser.add_argument(\"-t\", \"--timeout\", dest='timeout', default=60,\n        type=int, help=\"maximum timeout when waiting notification\")\n    return parser\n\n\ndef get_parser_cron():\n    parser = get_parser_daemon()\n    parser.add_argument(\"-1\", \"--once\", dest='once', action='store_true',\n        help=\"run pending tasks and halt\")\n    return parser\n\n\ndef get_parser_admin():\n    parser = get_parser()\n\n    parser.add_argument(\n        \"-u\", \"--update\", dest=\"update\", nargs='+', default=[],\n        metavar='MODULE',\n        help=\"activate or update a module\").completer = module_completer\n    parser.add_argument(\"--all\", dest=\"update\", action=\"append_const\",\n        const=\"ir\", help=\"update all activated modules\")\n    parser.add_argument(\"--activate-dependencies\", dest=\"activatedeps\",\n        action=\"store_true\",\n        help=\"Activate missing dependencies of updated modules\")\n    parser.add_argument(\"--email\", dest=\"email\", help=\"set the admin email\")\n    parser.add_argument(\"-p\", \"--password\", dest=\"password\",\n        action='store_true', help=\"set the admin password\")\n    parser.add_argument(\"--reset-password\", dest='reset_password',\n        action='store_true', help=\"reset the admin password\")\n    parser.add_argument(\"--test-email\", dest='test_email',\n        help=\"Send a test email to the specified address.\")\n    parser.add_argument(\"-m\", \"--update-modules-list\", action=\"store_true\",\n        dest=\"update_modules_list\", help=\"Update list of tryton modules\")\n    parser.add_argument(\n        \"-l\", \"--language\", dest=\"languages\", nargs='+',\n        default=[], metavar='CODE',\n        help=\"Load language translations\").completer = language_completer\n    parser.add_argument(\"--hostname\", dest=\"hostname\", default=None,\n        help=\"Limit database listing to the hostname\")\n    parser.add_argument(\"--validate\", dest=\"validate\", nargs='*',\n        metavar='MODEL', help=\"validate records of models\")\n    parser.add_argument(\"--validate-percentage\", dest=\"validate_percentage\",\n        type=float, default=100, metavar=\"PERCENTAGE\",\n        help=\"percentage of records to validate (default: 100)\")\n\n    parser.epilog = ('The first time a database is initialized '\n        'or when the password is set, the admin password is read '\n        'from file defined by TRYTONPASSFILE environment variable '\n        'or interactively asked from the user.\\n'\n        'The config file can be specified in the TRYTOND_CONFIG '\n        'environment variable.\\n'\n        'The database URI can be specified in the TRYTOND_DATABASE_URI '\n        'environment variable.')\n    return parser\n\n\ndef get_parser_console():\n    parser = get_base_parser()\n    parser.add_argument(\"-d\", \"--database\", dest=\"database_name\",\n        required=True, metavar='DATABASE', help=\"specify the database name\")\n    parser.add_argument(\"--histsize\", dest=\"histsize\", type=int, default=500,\n        help=\"The number of commands to remember in the command history\")\n    parser.add_argument(\"--readonly\", dest=\"readonly\", action='store_true',\n        help=\"Start a readonly transaction\")\n    parser.epilog = \"To store changes, `transaction.commit()` must be called.\"\n    return parser\n\n\ndef get_parser_stat():\n    parser = get_base_parser()\n    parser.epilog = \"To exit press 'q', to inverse sort order press 'r'.\"\n    return parser\n\n\ndef config_log(options):\n    if options.logconf:\n        logging.config.fileConfig(\n            options.logconf, disable_existing_loggers=False)\n        logging.getLogger('server').info('using %s as logging '\n            'configuration file', options.logconf)\n    else:\n        logformat = ('%(process)s %(thread)s [%(asctime)s] '\n            '%(levelname)s %(name)s %(message)s')\n        level = max(logging.ERROR - options.verbose * 10, logging.NOTSET)\n        logging.basicConfig(level=level, format=logformat)\n    logging.captureWarnings(True)\n\n\n@contextmanager\ndef pidfile(options):\n    path = options.pidfile\n    if not path:\n        yield\n    else:\n        with open(path, 'w') as fd:\n            fd.write('%d' % os.getpid())\n        yield\n        os.unlink(path)\n"
  },
  {
    "path": "trytond/config.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport configparser\nimport logging\nimport os\nimport urllib.parse\n\nimport __main__ as main\n\nfrom . import status\n\n__all__ = ['config', 'get_hostname', 'get_port', 'split_netloc',\n    'parse_listen', 'parse_uri']\nlogger = logging.getLogger(__name__)\n\n# Needed so urlunsplit to always set netloc\nfor backend_name in ['postgresql', 'sqlite']:\n    if backend_name not in urllib.parse.uses_netloc:\n        urllib.parse.uses_netloc.append(backend_name)\n\n\ndef get_hostname(netloc):\n    if '[' in netloc and ']' in netloc:\n        return netloc.split(']')[0][1:]\n    elif ':' in netloc:\n        return netloc.split(':')[0]\n    else:\n        return netloc\n\n\ndef get_port(netloc):\n    netloc = netloc.split(']')[-1]\n    return int(netloc.split(':')[1])\n\n\ndef split_netloc(netloc):\n    return get_hostname(netloc).replace('*', ''), get_port(netloc)\n\n\ndef parse_listen(value):\n    for netloc in value.split(','):\n        yield split_netloc(netloc)\n\n\ndef parse_uri(uri):\n    return urllib.parse.urlparse(uri)\n\n\nclass TrytonConfigParser(configparser.ConfigParser):\n\n    def __init__(self):\n        super().__init__(interpolation=None)\n        self.add_section('web')\n        self.set('web', 'listen', 'localhost:8000')\n        self.set('web', 'root', os.path.join(os.path.expanduser('~'), 'www'))\n        self.set('web', 'num_proxies', '0')\n        self.set('web', 'cache_timeout', str(60 * 60 * 12))\n        self.add_section('database')\n        self.set('database', 'uri',\n            os.environ.get('TRYTOND_DATABASE_URI', 'sqlite://'))\n        self.set('database', 'path', os.path.join(\n                os.path.expanduser('~'), 'db'))\n        self.set('database', 'list', 'True')\n        self.set('database', 'retry', '5')\n        self.set('database', 'language', 'en')\n        self.set('database', 'timeout', str(30 * 60))\n        self.add_section('request')\n        self.set('request', 'max_size', str(2 * 1024 * 1024))\n        self.set('request', 'max_size_authenticated',\n            str(2 * 1024 * 1024 * 1024))\n        self.add_section('cache')\n        self.set('cache', 'transaction', '10')\n        self.set('cache', 'model', '200')\n        self.set('cache', 'record', '2000')\n        self.set('cache', 'field', '100')\n        self.add_section('queue')\n        self.set('queue', 'worker', 'False')\n        self.add_section('ssl')\n        self.add_section('email')\n        self.set('email', 'uri', 'smtp://localhost:25')\n        self.add_section('session')\n        self.set('session', 'authentications', 'password')\n        self.set('session', 'max_age', str(60 * 60 * 24 * 30))\n        self.set('session', 'timeout', str(60 * 5))\n        self.set('session', 'max_attempt', '5')\n        self.set('session', 'max_attempt_ip_network', '300')\n        self.set('session', 'ip_network_4', '32')\n        self.set('session', 'ip_network_6', '56')\n        self.add_section('password')\n        self.set('password', 'length', '8')\n        self.set('password', 'reset_timeout', str(24 * 60 * 60))\n        self.add_section('bus')\n        self.set('bus', 'allow_subscribe', 'False')\n        self.set('bus', 'long_polling_timeout', str(5 * 60))\n        self.set('bus', 'cache_timeout', '5')\n        self.set('bus', 'select_timeout', '5')\n        self.add_section('html')\n        self.update_environ()\n        self.update_etc()\n\n    def update_environ(self):\n        for key, value in os.environ.items():\n            if not key.startswith('TRYTOND_'):\n                continue\n            try:\n                section, option = key[len('TRYTOND_'):].lower().split('__', 1)\n            except ValueError:\n                continue\n            if section.startswith('wsgi_'):\n                section = section.replace('wsgi_', 'wsgi ')\n            if not self.has_section(section):\n                self.add_section(section)\n            self.set(section, option, value)\n\n    def update_etc(self, configfile=os.environ.get('TRYTOND_CONFIG')):\n        if isinstance(configfile, str):\n            configfile = [configfile]\n        if not configfile or not [_f for _f in configfile if _f]:\n            return []\n        configfile = [os.path.expanduser(filename) for filename in configfile]\n        read_files = self.read(configfile)\n        logger.info('using %s as configuration files', ', '.join(read_files))\n        if configfile != read_files:\n            logger.error('could not load %s',\n                ','.join(set(configfile) - set(read_files)))\n        return configfile\n\n    def get(self, section, option, *args, **kwargs):\n        default = kwargs.pop('default', None)\n        try:\n            return configparser.RawConfigParser.get(self, section, option,\n                *args, **kwargs)\n        except (configparser.NoOptionError, configparser.NoSectionError):\n            return default\n\n    def getint(self, section, option, *args, **kwargs):\n        default = kwargs.pop('default', None)\n        try:\n            return configparser.RawConfigParser.getint(self, section, option,\n                *args, **kwargs)\n        except (configparser.NoOptionError, configparser.NoSectionError,\n                TypeError):\n            return default\n\n    def getfloat(self, section, option, *args, **kwargs):\n        default = kwargs.pop('default', None)\n        try:\n            return configparser.RawConfigParser.getfloat(self, section, option,\n                *args, **kwargs)\n        except (configparser.NoOptionError, configparser.NoSectionError,\n                TypeError):\n            return default\n\n    def getboolean(self, section, option, *args, **kwargs):\n        default = kwargs.pop('default', None)\n        try:\n            return configparser.RawConfigParser.getboolean(\n                self, section, option, *args, **kwargs)\n        except (configparser.NoOptionError, configparser.NoSectionError,\n                AttributeError):\n            return default\n\n\nconfig = TrytonConfigParser()\n\nif os.path.basename(getattr(main, '__file__', '')) != 'trytond-stat':\n    status.start(config.get('database', 'path'))\n"
  },
  {
    "path": "trytond/console.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport atexit\nimport os\nimport readline\nimport sys\nfrom code import InteractiveConsole\nfrom rlcompleter import Completer\n\nfrom trytond import __version__\nfrom trytond.pool import Pool\nfrom trytond.transaction import Transaction\nfrom trytond.worker import run_task\n\n\nclass Console(InteractiveConsole):\n    def __init__(self, locals=None, filename=\"<console>\", histsize=-1,\n            histfile=os.path.expanduser(\"~/.trytond_console_history\")):\n        super().__init__(locals, filename)\n        self.init_completer(locals)\n        self.init_history(histfile, histsize)\n\n    def init_completer(selfi, locals):\n        completer = Completer(locals)\n        readline.set_completer(completer.complete)\n        readline.parse_and_bind(\"tab: complete\")\n\n    def init_history(self, histfile, histsize):\n        readline.parse_and_bind(\"tab: complete\")\n        if hasattr(readline, 'read_history_file'):\n            try:\n                readline.read_history_file(histfile)\n            except FileNotFoundError:\n                pass\n            atexit.register(self.save_history, histfile, histsize)\n\n    def save_history(self, histfile, histsize):\n        readline.set_history_length(histsize)\n        readline.write_history_file(histfile)\n\n\ndef run(options):\n    db_name = options.database_name\n    pool = Pool(db_name)\n    with Transaction().start(db_name, 0, readonly=True):\n        pool.init()\n\n    with Transaction().start(\n            db_name, 0, readonly=options.readonly) as transaction:\n        local = {\n            'pool': pool,\n            'transaction': transaction,\n            }\n        if sys.stdin.isatty():\n            console = Console(local, histsize=options.histsize)\n            banner = \"Tryton %s, Python %s on %s\" % (\n                __version__, sys.version, sys.platform)\n            console.interact(banner=banner, exitmsg='')\n        else:\n            console = InteractiveConsole(local)\n            console.runcode(sys.stdin.read())\n        transaction.rollback()\n    while transaction.tasks:\n        task_id = transaction.tasks.pop()\n        run_task(pool, task_id)\n"
  },
  {
    "path": "trytond/const.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nOPERATORS = (\n    'where',\n    'not where',\n    'child_of',\n    'not child_of',\n    'parent_of',\n    'not parent_of',\n    '=',\n    '!=',\n    'like',\n    'not like',\n    'ilike',\n    'not ilike',\n    'in',\n    'not in',\n    '<=',\n    '>=',\n    '<',\n    '>',\n    )\n"
  },
  {
    "path": "trytond/convert.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport logging\nimport re\nimport time\nfrom collections import defaultdict\nfrom decimal import Decimal\nfrom xml import sax\n\nfrom trytond import __version__\nfrom trytond.pyson import CONTEXT, PYSONEncoder\nfrom trytond.tools import grouped_slice\nfrom trytond.transaction import Transaction\n\nlogger = logging.getLogger(__name__)\n\nCDATA_START = re.compile(r'^\\s*\\<\\!\\[cdata\\[', re.IGNORECASE)\nCDATA_END = re.compile(r'\\]\\]\\>\\s*$', re.IGNORECASE)\n\n\nclass ParsingError(Exception):\n    pass\n\n\nclass DummyTagHandler:\n    \"\"\"Dubhandler implementing empty methods. Will be used when whe\n    want to ignore the xml content\"\"\"\n\n    def __init__(self):\n        pass\n\n    def startElement(self, name, attributes):\n        pass\n\n    def characters(self, data):\n        pass\n\n    def endElement(self, name):\n        pass\n\n\nclass MenuitemTagHandler:\n    \"\"\"Taghandler for the tag <record> \"\"\"\n    def __init__(self, master_handler):\n        self.mh = master_handler\n        self.xml_id = None\n\n    def startElement(self, name, attributes):\n        cursor = Transaction().connection.cursor()\n\n        values = {}\n\n        try:\n            self.xml_id = attributes['id']\n        except KeyError:\n            self.xml_id = None\n            raise ParsingError(\"missing 'id' attribute\")\n\n        for attr in ('name', 'sequence', 'parent', 'action', 'groups'):\n            if attr in attributes:\n                values[attr] = attributes.get(attr)\n        values['icon'] = attributes.get('icon', 'tryton-folder')\n\n        if attributes.get('active'):\n            values['active'] = bool(eval(attributes['active']))\n\n        if values.get('parent'):\n            model, id_ = self.mh.get_id(values['parent'])\n            if model != 'ir.ui.menu':\n                raise ParsingError(\n                    \"invalid 'ir.ui.menu' parent: %s\" % model)\n            values['parent'] = id_\n\n        action_name = None\n        if values.get('action'):\n            model, action_id = self.mh.get_id(values['action'])\n            if not model.startswith('ir.action'):\n                raise ParsingError(\n                    \"invalid model for action: %s\" % model)\n\n            # TODO maybe use a prefetch for this:\n            action = self.mh.pool.get('ir.action').__table__()\n            report = self.mh.pool.get('ir.action.report').__table__()\n            act_window = self.mh.pool.get('ir.action.act_window').__table__()\n            wizard = self.mh.pool.get('ir.action.wizard').__table__()\n            url = self.mh.pool.get('ir.action.url').__table__()\n            act_window_view = self.mh.pool.get(\n                'ir.action.act_window.view').__table__()\n            view = self.mh.pool.get('ir.ui.view').__table__()\n            icon = self.mh.pool.get('ir.ui.icon').__table__()\n            cursor.execute(*action.join(\n                    report, 'LEFT',\n                    condition=action.id == report.action\n                    ).join(act_window, 'LEFT',\n                    condition=action.id == act_window.action\n                    ).join(wizard, 'LEFT',\n                    condition=action.id == wizard.action\n                    ).join(url, 'LEFT',\n                    condition=action.id == url.action\n                    ).join(act_window_view, 'LEFT',\n                    condition=act_window.id == act_window_view.act_window\n                    ).join(view, 'LEFT',\n                    condition=view.id == act_window_view.view\n                    ).join(icon, 'LEFT',\n                    condition=action.icon == icon.id).select(\n                    action.name.as_('action_name'),\n                    action.type.as_('action_type'),\n                    view.type.as_('view_type'),\n                    view.field_childs.as_('field_childs'),\n                    icon.name.as_('icon_name'),\n                    where=(report.id == action_id)\n                    | (act_window.id == action_id)\n                    | (wizard.id == action_id)\n                    | (url.id == action_id),\n                    order_by=act_window_view.sequence, limit=1))\n            action_name, action_type, view_type, field_childs, icon_name = \\\n                cursor.fetchone()\n\n            values['action'] = '%s,%s' % (action_type, action_id)\n\n            icon = attributes.get('icon', '')\n            if icon:\n                values['icon'] = icon\n            elif icon_name:\n                values['icon'] = icon_name\n            elif action_type == 'ir.action.wizard':\n                values['icon'] = 'tryton-launch'\n            elif action_type == 'ir.action.report':\n                values['icon'] = 'tryton-print'\n            elif action_type == 'ir.action.act_window':\n                if view_type == 'tree':\n                    if field_childs:\n                        values['icon'] = 'tryton-tree'\n                    else:\n                        values['icon'] = 'tryton-list'\n                elif view_type == 'form':\n                    values['icon'] = 'tryton-form'\n                elif view_type == 'graph':\n                    values['icon'] = 'tryton-graph'\n                elif view_type == 'calendar':\n                    values['icon'] = 'tryton-calendar'\n            elif action_type == 'ir.action.url':\n                values['icon'] = 'tryton-public'\n            else:\n                values['icon'] = None\n\n        if values.get('groups'):\n            raise ParsingError(\"forbidden 'groups' attribute\")\n\n        if not values.get('name'):\n            if not action_name:\n                raise ParsingError(\"missing 'name' or 'action' attribute\")\n            else:\n                values['name'] = action_name\n\n        if values.get('sequence'):\n            values['sequence'] = int(values['sequence'])\n\n        self.values = values\n\n    def characters(self, data):\n        pass\n\n    def endElement(self, name):\n        \"\"\"Must return the object to use for the next call \"\"\"\n        if name != \"menuitem\":\n            return self\n        else:\n            self.mh.import_record('ir.ui.menu', self.values, self.xml_id)\n            return None\n\n    def current_state(self):\n        return \"menuitem '%s.%s'\" % (self.mh.module, self.xml_id)\n\n\nclass RecordTagHandler:\n\n    \"\"\"Taghandler for the tag <record> and all the tags inside it\"\"\"\n\n    def __init__(self, master_handler):\n        # Remind reference of parent handler\n        self.mh = master_handler\n        # stock xml_id parsed in one module\n        self.xml_ids = []\n        self.model = None\n        self.xml_id = None\n        self.update = None\n        self.values = None\n        self.current_field = None\n        self.cdata = None\n        self.start_cdata = None\n\n    def startElement(self, name, attributes):\n\n        # Manage the top level tag\n        if name == \"record\":\n            try:\n                self.xml_id = attributes[\"id\"]\n            except KeyError:\n                self.xml_id = None\n                raise ParsingError(\"missing 'id' attribute\")\n\n            self.model = self.mh.pool.get(attributes[\"model\"])\n\n            self.update = bool(int(attributes.get('update', '0')))\n\n            # create/update a dict containing fields values\n            self.values = {}\n\n            self.current_field = None\n            self.cdata = False\n\n            return self.xml_id\n\n        # Manage included tags:\n        elif name == \"field\":\n\n            field_name = attributes['name']\n            field_type = attributes.get('type', '')\n            # Remind the current name and if we have to load (see characters)\n            self.current_field = field_name\n            depends = attributes.get('depends', '').split(',')\n            depends = {m.strip() for m in depends if m}\n            if not depends.issubset(self.mh.modules):\n                self.current_field = None\n                return\n            # Create a new entry in the values\n            self.values[field_name] = \"\"\n            # Put a flag to escape cdata tags\n            if field_type == \"xml\":\n                self.cdata = \"start\"\n\n            # Catch the known attributes\n            search_attr = attributes.get('search', '')\n            ref_attr = attributes.get('ref', '')\n            eval_attr = attributes.get('eval', '')\n            pyson_attr = bool(int(attributes.get('pyson', '0')))\n\n            context = {}\n            context['time'] = time\n            context['version'] = __version__.rsplit('.', 1)[0]\n            context['ref'] = lambda xml_id: ','.join(self.mh.get_id(xml_id))\n            context['Decimal'] = Decimal\n            context['datetime'] = datetime\n            if pyson_attr:\n                context.update(CONTEXT)\n\n            field = self.model._fields[field_name]\n            if search_attr:\n                search_model = field.model_name\n                SearchModel = self.mh.pool.get(search_model)\n                with Transaction().set_context(active_test=False):\n                    found, = SearchModel.search(eval(search_attr, context))\n                    self.values[field_name] = found.id\n\n            elif ref_attr:\n                model, id_ = self.mh.get_id(ref_attr)\n                if field._type == 'reference':\n                    self.values[field_name] = '%s,%s' % (model, id_)\n                else:\n                    if (field.model_name == 'ir.action'\n                            and model.startswith('ir.action')):\n                        pass\n                    elif model != field.model_name:\n                        raise ParsingError(\n                            \"invalid model for %s: %s\" % (field_name, model))\n                    self.values[field_name] = id_\n\n            elif eval_attr:\n                value = eval(eval_attr, context)\n                if pyson_attr:\n                    value = PYSONEncoder(sort_keys=True).encode(value)\n                self.values[field_name] = value\n\n        else:\n            raise ParsingError(\n                \"forbidden '%s' tag inside record tag\" % name)\n\n    def characters(self, data):\n\n        \"\"\"If we are in a field tag, consume all the content\"\"\"\n\n        if not self.current_field:\n            return\n        # Escape start cdata tag if necessary\n        if self.cdata == \"start\":\n            data = CDATA_START.sub('', data)\n            self.start_cdata = \"inside\"\n\n        self.values[self.current_field] += data\n\n    def endElement(self, name):\n\n        \"\"\"Must return the object to use for the next call, if name is\n        not 'record' we return self to keep our hand on the\n        process. If name is 'record' we return None to end the\n        delegation\"\"\"\n\n        if name == \"field\":\n            if not self.current_field:\n                return self\n            # Escape end cdata tag :\n            if self.cdata in ('inside', 'start'):\n                self.values[self.current_field] = \\\n                    CDATA_END.sub('', self.values[self.current_field])\n                self.cdata = 'done'\n            self.current_field = None\n            return self\n\n        elif name == \"record\":\n            if self.xml_id in self.xml_ids and not self.update:\n                raise ParsingError(\"duplicate id: %s\" % self.xml_id)\n            self.mh.import_record(\n                self.model.__name__, self.values, self.xml_id)\n            self.xml_ids.append(self.xml_id)\n            return None\n        else:\n            raise ParsingError(\"unexpected closing tag '%s'\" % name)\n\n    def current_state(self):\n        return \"record '%s.%s'\" % (self.mh.module, self.xml_id)\n\n\nclass Fs2bdAccessor:\n    \"\"\"\n    Used in TrytondXmlHandler.\n    Provide some helper function to ease cache access and management.\n    \"\"\"\n\n    def __init__(self, ModelData, pool):\n        self.fs2db = {}\n        self.fetched_modules = []\n        self.ModelData = ModelData\n        self.browserecord = {}\n        self.pool = pool\n\n    def get(self, module, fs_id):\n        if module not in self.fetched_modules:\n            self.fetch_new_module(module)\n        return self.fs2db[module].get(fs_id, None)\n\n    def exists(self, module, fs_id):\n        if module not in self.fetched_modules:\n            self.fetch_new_module(module)\n        return fs_id in self.fs2db[module]\n\n    def get_browserecord(self, module, model_name, db_id):\n        if module not in self.fetched_modules:\n            self.fetch_new_module(module)\n        if model_name in self.browserecord[module] \\\n                and db_id in self.browserecord[module][model_name]:\n            return self.browserecord[module][model_name][db_id]\n        return None\n\n    def set(self, module, fs_id, values):\n        \"\"\"\n        Whe call the prefetch function here to. Like that whe are sure\n        not to erase data when get is called.\n        \"\"\"\n        if module not in self.fetched_modules:\n            self.fetch_new_module(module)\n        if fs_id not in self.fs2db[module]:\n            self.fs2db[module][fs_id] = {}\n        fs2db_val = self.fs2db[module][fs_id]\n        for key, val in values.items():\n            fs2db_val[key] = val\n\n    def reset_browsercord(self, module, model_name, ids=None):\n        if module not in self.fetched_modules:\n            return\n        self.browserecord[module].setdefault(model_name, {})\n        Model = self.pool.get(model_name)\n        if not ids:\n            ids = list(self.browserecord[module][model_name].keys())\n        models = Model.browse(ids)\n        for model in models:\n            if model.id in self.browserecord[module][model_name]:\n                for cache in Transaction().cache.values():\n                    if model_name in cache:\n                        cache[model_name].pop(model.id, None)\n            self.browserecord[module][model_name][model.id] = model\n\n    def fetch_new_module(self, module):\n        self.fs2db[module] = {}\n        module_data_ids = self.ModelData.search([\n                ('module', '=', module),\n                ], order=[('db_id', 'ASC')])\n\n        record_ids = {}\n        for rec in self.ModelData.browse(module_data_ids):\n            self.fs2db[rec.module][rec.fs_id] = {\n                \"db_id\": rec.db_id, \"model\": rec.model,\n                \"id\": rec.id, \"values\": rec.values\n                }\n            record_ids.setdefault(rec.model, [])\n            record_ids[rec.model].append(rec.db_id)\n\n        self.browserecord[module] = {}\n        for model_name in record_ids.keys():\n            try:\n                Model = self.pool.get(model_name)\n            except KeyError:\n                continue\n            self.browserecord[module][model_name] = {}\n            for sub_record_ids in grouped_slice(record_ids[model_name]):\n                with Transaction().set_context(active_test=False):\n                    records = Model.search([\n                        ('id', 'in', list(sub_record_ids)),\n                        ], order=[('id', 'ASC')])\n                with Transaction().set_context(language='en'):\n                    models = Model.browse(list(map(int, records)))\n                for model in models:\n                    self.browserecord[module][model_name][model.id] = model\n        self.fetched_modules.append(module)\n\n\nclass TrytondXmlHandler(sax.handler.ContentHandler):\n\n    def __init__(self, pool, module, module_state, modules, languages):\n        \"Register known taghandlers, and managed tags.\"\n        sax.handler.ContentHandler.__init__(self)\n\n        self.pool = pool\n        self.module = module\n        self.ModelData = pool.get('ir.model.data')\n        self.fs2db = Fs2bdAccessor(self.ModelData, pool)\n        self.to_delete = self.populate_to_delete()\n        self.noupdate = None\n        self.module_state = module_state\n        self.grouped = None\n        self.grouped_creations = defaultdict(dict)\n        self.grouped_write = defaultdict(list)\n        self.grouped_model_data = []\n        self.skip_data = False\n        self.modules = modules\n        self.languages = languages\n\n        # Tag handlders are used to delegate the processing\n        self.taghandlerlist = {\n            'record': RecordTagHandler(self),\n            'menuitem': MenuitemTagHandler(self),\n            }\n        self.taghandler = None\n\n        # Managed tags are handled by the current class\n        self.managedtags = [\"data\", \"tryton\"]\n\n        # Connect to the sax api:\n        self.sax_parser = sax.make_parser()\n        # Tell the parser we are not interested in XML namespaces\n        self.sax_parser.setFeature(sax.handler.feature_namespaces, 0)\n        self.sax_parser.setContentHandler(self)\n\n    def parse_xmlstream(self, stream):\n        \"\"\"\n        Take a byte stream has input and parse the xml content.\n        \"\"\"\n\n        source = sax.InputSource()\n        source.setByteStream(stream)\n\n        try:\n            self.sax_parser.parse(source)\n        except Exception as e:\n            raise ParsingError(\"in %s\" % self.current_state()) from e\n        return self.to_delete\n\n    def startElement(self, name, attributes):\n        \"\"\"Rebind the current handler if necessary and call\n        startElement on it\"\"\"\n\n        if not self.taghandler:\n\n            if name in self.taghandlerlist:\n                self.taghandler = self.taghandlerlist[name]\n            elif name == \"data\":\n                self.noupdate = bool(int(attributes.get(\"noupdate\", '0')))\n                self.grouped = bool(int(attributes.get('grouped', 0)))\n                self.skip_data = False\n                depends = attributes.get('depends', '').split(',')\n                depends = {m.strip() for m in depends if m}\n                if not depends.issubset(self.modules):\n                    self.skip_data = True\n                if (attributes.get('language')\n                        and attributes.get('language') not in self.languages):\n                    self.skip_data = True\n\n            elif name == \"tryton\":\n                pass\n\n            else:\n                logger.info(\"Tag %s not supported\", (name,))\n                return\n        if self.taghandler and not self.skip_data:\n            self.taghandler.startElement(name, attributes)\n\n    def characters(self, data):\n        if self.taghandler:\n            self.taghandler.characters(data)\n\n    def endElement(self, name):\n\n        if name == 'data' and self.grouped:\n            for model, values in self.grouped_creations.items():\n                self.create_records(model, values.values(), values.keys())\n            self.grouped_creations.clear()\n            for key, actions in self.grouped_write.items():\n                module, model = key\n                self.write_records(module, model, *actions)\n            self.grouped_write.clear()\n        if name == 'data' and self.grouped_model_data:\n            self.ModelData.write(*self.grouped_model_data)\n            del self.grouped_model_data[:]\n\n        # Closing tag found, if we are in a delegation the handler\n        # know what to do:\n        if self.taghandler and not self.skip_data:\n            self.taghandler = self.taghandler.endElement(name)\n        if self.taghandler == self.taghandlerlist.get(name):\n            self.taghandler = None\n\n    def current_state(self):\n        if self.taghandler:\n            return self.taghandler.current_state()\n        else:\n            return '?'\n\n    def get_id(self, xml_id):\n\n        if '.' in xml_id:\n            module, xml_id = xml_id.split('.')\n        else:\n            module = self.module\n\n        if self.fs2db.get(module, xml_id) is None:\n            raise ParsingError(\"%s.%s not found\" % (module, xml_id))\n        value = self.fs2db.get(module, xml_id)\n        return value['model'], value[\"db_id\"]\n\n    @staticmethod\n    def _clean_value(key, record):\n        \"\"\"\n        Take a field name, a browse_record, and a reference to the\n        corresponding object.  Return a raw value has it must look on the\n        db.\n        \"\"\"\n        Model = record.__class__\n        # search the field type in the object or in a parent\n        field_type = Model._fields[key]._type\n\n        # handle the value regarding to the type\n        if field_type == 'many2one':\n            return getattr(record, key).id if getattr(record, key) else None\n        elif field_type == 'reference':\n            if not getattr(record, key):\n                return None\n            return str(getattr(record, key))\n        elif field_type in ['one2many', 'many2many']:\n            raise ParsingError(\n                \"unsupported field %s of type %s\" % (key, field_type))\n        else:\n            return getattr(record, key)\n\n    def populate_to_delete(self):\n        \"\"\"Create a list of all the records that whe should met in the update\n        process. The records that are not encountered are deleted from the\n        database in post_import.\"\"\"\n\n        # Fetch the data in id descending order to avoid depedendcy\n        # problem when the corresponding recordds will be deleted:\n        module_data = self.ModelData.search([\n                ('module', '=', self.module),\n                ], order=[('id', 'DESC')])\n        return set(rec.fs_id for rec in module_data)\n\n    def import_record(self, model, values, fs_id):\n        module = self.module\n\n        if not fs_id:\n            raise ValueError(\"missing fs_id\")\n\n        if '.' in fs_id:\n            assert len(fs_id.split('.')) == 2, ('\"%s\" contains too many dots. '\n                'file system ids should contain ot most one dot ! '\n                'These are used to refer to other modules data, '\n                'as in module.reference_id' % (fs_id))\n\n            module, fs_id = fs_id.split('.')\n            if not self.fs2db.get(module, fs_id):\n                raise ParsingError(\"%s.%s not found\" % (module, fs_id))\n\n        Model = self.pool.get(model)\n\n        if self.fs2db.exists(module, fs_id):\n\n            # Remove this record from the to_delete list. This means that\n            # the corresponding record have been found.\n            if module == self.module and fs_id in self.to_delete:\n                self.to_delete.remove(fs_id)\n\n            if self.noupdate and self.module_state != 'to activate':\n                return\n\n            # this record is already in the db:\n            db_value = self.fs2db.get(module, fs_id)\n            db_id = db_value['db_id']\n            db_model = db_value['model']\n            mdata_id = db_value['id']\n            old_values = db_value['values']\n\n            # Check if record has not been deleted\n            if db_id is None:\n                return\n\n            if not old_values:\n                old_values = {}\n            else:\n                old_values = self.ModelData.load_values(old_values)\n\n            for key in old_values:\n                if isinstance(old_values[key], bytes):\n                    # Fix for migration to unicode\n                    old_values[key] = old_values[key].decode('utf-8')\n\n            if model != db_model:\n                raise ParsingError(\n                    \"wrong model '%s': %s.%s\" % (model, module, fs_id))\n\n            record = self.fs2db.get_browserecord(module, Model.__name__, db_id)\n            # Re-create record if it was deleted\n            if not record:\n                with Transaction().set_context(\n                        module=module, language='en'):\n                    record, = Model.create([values])\n\n                # reset_browsercord\n                self.fs2db.reset_browsercord(\n                    module, Model.__name__, [record.id])\n\n                record = self.fs2db.get_browserecord(\n                    module, Model.__name__, record.id)\n\n                data = self.ModelData.search([\n                    ('fs_id', '=', fs_id),\n                    ('module', '=', module),\n                    ('model', '=', Model.__name__),\n                    ], limit=1)\n                self.ModelData.write(data, {\n                    'db_id': record.id,\n                    })\n                self.fs2db.get(module, fs_id)[\"db_id\"] = record.id\n\n            to_update = {}\n            for key in values:\n\n                db_field = self._clean_value(key, record)\n\n                # if the fs value is the same as in the db, we ignore it\n                if db_field == values[key]:\n                    continue\n\n                # we cannot update a field if it was changed by a user...\n                if key not in old_values:\n                    expected_value = Model._defaults.get(key,\n                        lambda *a: None)()\n                else:\n                    expected_value = old_values[key]\n\n                # ... and we consider that there is an update if the\n                # expected value differs from the actual value, _and_\n                # if they are not false in a boolean context (ie None,\n                # False, {} or [])\n                if db_field != expected_value and (db_field or expected_value):\n                    logger.warning(\n                        \"Field %s of %s@%s not updated (id: %s), because \"\n                        \"it has changed since the last update\",\n                        key, record.id, model, fs_id)\n                    continue\n\n                # so, the field in the fs and in the db are different,\n                # and no user changed the value in the db:\n                to_update[key] = values[key]\n\n            if self.grouped:\n                self.grouped_write[(module, model)].extend(\n                    (record, to_update, old_values, values, fs_id, mdata_id))\n            else:\n                self.write_records(module, model,\n                    record, to_update, old_values, values, fs_id, mdata_id)\n        else:\n            if self.grouped:\n                self.grouped_creations[model][fs_id] = values\n            else:\n                self.create_records(model, [values], [fs_id])\n\n    def create_records(self, model, vlist, fs_ids):\n        Model = self.pool.get(model)\n\n        with Transaction().set_context(module=self.module, language='en'):\n            records = Model.create(vlist)\n\n        mdata_values = []\n        for record, values, fs_id in zip(records, vlist, fs_ids):\n            for key in values:\n                values[key] = self._clean_value(key, record)\n\n            mdata_values.append({\n                    'fs_id': fs_id,\n                    'model': model,\n                    'module': self.module,\n                    'db_id': record.id,\n                    'values': self.ModelData.dump_values(values),\n                    'fs_values': self.ModelData.dump_values(values),\n                    'noupdate': self.noupdate,\n                    })\n\n        models_data = self.ModelData.create(mdata_values)\n\n        for record, values, fs_id, mdata in zip(\n                records, vlist, fs_ids, models_data):\n            self.fs2db.set(self.module, fs_id, {\n                    'db_id': record.id,\n                    'model': model,\n                    'id': mdata.id,\n                    'values': self.ModelData.dump_values(values),\n                    })\n        self.fs2db.reset_browsercord(self.module, model,\n            [r.id for r in records])\n\n    def write_records(self, module, model,\n            record, values, old_values, new_values, fs_id, mdata_id, *args):\n        args = (record, values, old_values, new_values, fs_id, mdata_id) + args\n        Model = self.pool.get(model)\n\n        actions = iter(args)\n        to_update = []\n        for record, values, _, _, _, _ in zip(*((actions,) * 6)):\n            if values:\n                to_update += [[record], values]\n        # if there is values to update:\n        if to_update:\n            # write the values in the db:\n            with Transaction().set_context(\n                    module=module, language='en'):\n                Model.write(*to_update)\n            self.fs2db.reset_browsercord(\n                module, Model.__name__, sum(to_update[::2], []))\n\n        actions = iter(to_update)\n        for records, values in zip(actions, actions):\n            record, = records\n            # re-read it: this ensure that we store the real value\n            # in the model_data table:\n            record = self.fs2db.get_browserecord(\n                module, Model.__name__, record.id)\n            if not record:\n                record = Model(record.id)\n            for key in values:\n                values[key] = self._clean_value(key, record)\n\n        actions = iter(args)\n        for record, values, old_values, new_values, fs_id, mdata_id in zip(\n                *((actions,) * 6)):\n            temp_values = old_values.copy()\n            temp_values.update(values)\n            values = temp_values\n            fs_values = old_values.copy()\n            fs_values.update(new_values)\n\n            if values != fs_values:\n                self.grouped_model_data.extend(([self.ModelData(mdata_id)], {\n                            'fs_id': fs_id,\n                            'model': model,\n                            'module': module,\n                            'db_id': record.id,\n                            'values': self.ModelData.dump_values(values),\n                            'fs_values': self.ModelData.dump_values(fs_values),\n                            'noupdate': self.noupdate,\n                            }))\n\n        # reset_browsercord to keep cache memory low\n        self.fs2db.reset_browsercord(module, Model.__name__, args[::6])\n\n\ndef post_import(pool, module, to_delete):\n    \"\"\"\n    Remove the records that are given in to_delete.\n    \"\"\"\n    transaction = Transaction()\n    mdata_delete = []\n    ModelData = pool.get(\"ir.model.data\")\n\n    with Transaction().set_context(active_test=False):\n        mdata = ModelData.search([\n            ('fs_id', 'in', to_delete),\n            ('module', '=', module),\n            ], order=[('id', 'DESC')])\n\n    for mrec in mdata:\n        model, db_id, fs_id = mrec.model, mrec.db_id, mrec.fs_id\n\n        logger.info('Deleting %s@%s from %s.%s', db_id, model, module, fs_id)\n        try:\n            # Deletion of the record\n            try:\n                Model = pool.get(model)\n            except KeyError:\n                Model = None\n            if Model:\n                Model.delete([Model(db_id)])\n                mdata_delete.append(mrec)\n            else:\n                logger.warning(\n                    'Could not delete id %d of model %s because model no '\n                    'longer exists.', db_id, model)\n        except Exception:\n            transaction.rollback()\n            logger.error(\n                \"Could not delete id %d from model %s.\\n\"\n                \"There may be a relation that points to this resource \"\n                \"that must be manually fixed before restarting the update.\",\n                db_id, model, exc_info=True)\n            if 'active' in Model._fields:\n                try:\n                    Model.write([Model(db_id)], {\n                            'active': False,\n                            })\n                except Exception:\n                    transaction.rollback()\n                    logger.error(\n                        'Could not inactivate id: %d of model %s\\n',\n                        db_id, model, exc_info=True)\n        transaction.commit()\n\n    # Clean model_data:\n    if mdata_delete:\n        ModelData.delete(mdata_delete)\n        transaction.commit()\n\n    return True\n"
  },
  {
    "path": "trytond/cron.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport logging\nimport threading\nimport time\n\nfrom trytond.pool import Pool\nfrom trytond.transaction import Transaction\n\n__all__ = ['run']\nlogger = logging.getLogger(__name__)\n\n\ndef run(options):\n    threads = []\n    for name in options.database_names:\n        thread = threading.Thread(target=Pool(name).init)\n        thread.start()\n        threads.append(thread)\n    for thread in threads:\n        thread.join()\n\n    threads = {}\n    while True:\n        for db_name in options.database_names:\n            thread = threads.get(db_name)\n            if thread and thread.is_alive():\n                logger.info(\n                    'skip \"%s\" as previous cron still running', db_name)\n                continue\n            database_list = Pool.database_list()\n            pool = Pool(db_name)\n            if db_name not in database_list:\n                with Transaction().start(db_name, 0, readonly=True):\n                    pool.init()\n            Cron = pool.get('ir.cron')\n            thread = threading.Thread(\n                    target=Cron.run,\n                    args=(db_name,), kwargs={})\n            logger.info('start thread for \"%s\"', db_name)\n            thread.start()\n            threads[db_name] = thread\n        if options.once:\n            break\n        time.sleep(60)\n    for thread in threads.values():\n        thread.join()\n"
  },
  {
    "path": "trytond/exceptions.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\n\nclass TrytonException(Exception):\n    pass\n\n\nclass UserError(TrytonException):\n\n    def __init__(self, message, description='', domain=None):\n        super().__init__('UserError', (message, description, domain))\n        self.message = message\n        self.description = description\n        self.domain = domain\n        self.code = 1\n\n    def __str__(self):\n        return '%s - %s' % (self.message, self.description)\n\n\nclass UserWarning(TrytonException):\n    \"Exception that will be displayed as a warning message in the client.\"\n\n    def __init__(self, name, message, description=''):\n        super(UserWarning, self).__init__('UserWarning', (name, message,\n                description))\n        self.name = name\n        self.message = message\n        self.description = description\n        self.code = 2\n\n    def __str__(self):\n        return '%s - %s' % (self.message, self.description)\n\n\nclass LoginException(TrytonException):\n    \"\"\"Request the named parameter for the login process.\n    The type can be 'password' or 'char'.\n    \"\"\"\n\n    def __init__(self, name, message, type='password'):\n        super(LoginException, self).__init__(\n            'LoginException', (name, message, type))\n        self.name = name\n        self.message = message\n        self.type = type\n        self.code = 3\n\n\nclass ConcurrencyException(TrytonException):\n\n    def __init__(self, message):\n        super(ConcurrencyException, self).__init__('ConcurrencyException',\n            message)\n        self.message = message\n        self.code = 4\n\n    def __str__(self):\n        return self.message\n\n\nclass RateLimitException(TrytonException):\n    \"\"\"User has sent too many requests in a given amount of time.\"\"\"\n\n\nclass MissingDependenciesException(TrytonException):\n\n    def __init__(self, missings):\n        self.missings = missings\n\n    def __str__(self):\n        return 'Missing dependencies: %s' % ' '.join(self.missings)\n"
  },
  {
    "path": "trytond/filestore.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport hashlib\nimport os\n\nfrom trytond.config import config\nfrom trytond.tools import resolve\n\n__all__ = ['filestore']\n\n\nclass FileStore(object):\n\n    def get(self, id, prefix=''):\n        filename = self._filename(id, prefix)\n        with open(filename, 'rb') as fp:\n            return fp.read()\n\n    def getmany(self, ids, prefix=''):\n        return [self.get(id, prefix) for id in ids]\n\n    def size(self, id, prefix=''):\n        filename = self._filename(id, prefix)\n        statinfo = os.stat(filename)\n        return statinfo.st_size\n\n    def sizemany(self, ids, prefix=''):\n        return [self.size(id, prefix) for id in ids]\n\n    def set(self, data, prefix=''):\n        id = self._id(data)\n        filename = self._filename(id, prefix)\n        dirname = os.path.dirname(filename)\n        if not os.path.exists(dirname):\n            os.makedirs(dirname, 0o770)\n\n        collision = 0\n        while True:\n            basename = os.path.basename(filename)\n            if os.path.exists(filename):\n                if data != self.get(basename, prefix):\n                    collision += 1\n                    filename = self._filename(\n                        '%s-%s' % (id, collision), prefix)\n                    continue\n            else:\n                with open(filename, 'wb')as fp:\n                    fp.write(data)\n            return basename\n\n    def setmany(self, data, prefix=''):\n        return [self.set(d, prefix) for d in data]\n\n    def _filename(self, id, prefix):\n        path = os.path.normpath(config.get('database', 'path'))\n        filename = os.path.join(path, prefix, id[0:2], id[2:4], id)\n        filename = os.path.normpath(filename)\n        if not filename.startswith(path):\n            raise ValueError('Bad prefix')\n        return filename\n\n    def _id(self, data):\n        return hashlib.md5(data).hexdigest()\n\n\nif config.get('database', 'class'):\n    FileStore = resolve(config.get('database', 'class'))  # noqa: F811\nfilestore = FileStore()\n"
  },
  {
    "path": "trytond/i18n.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.pool import Pool\nfrom trytond.tools.string_ import LazyString\nfrom trytond.transaction import Transaction\n\n\ndef gettext(message_id, *args, **variables):\n    \"Returns the message translated into language\"\n    if not Transaction().database:\n        return message_id\n    pool = Pool()\n    try:\n        Message = pool.get('ir.message')\n    except KeyError:\n        return message_id\n    if not args:\n        language = Transaction().language\n    else:\n        language, = args\n    try:\n        module, id_ = message_id.split('.')\n    except ValueError:\n        return message_id\n    try:\n        return Message.gettext(module, id_, language, **variables)\n    except KeyError:\n        return message_id\n\n\ndef lazy_gettext(message_id, *args, **variables):\n    \"Like gettext but the string returned is lazy\"\n    return LazyString(gettext, message_id, *args, **variables)\n"
  },
  {
    "path": "trytond/ir/__init__.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.pool import Pool\n\nfrom . import (\n    action, attachment, avatar, cache, calendar_, configuration, cron, date,\n    email_, error, export, lang, message, model, module, note, queue_, routes,\n    rule, sequence, session, translation, trigger, ui)\n\n__all__ = ['register', 'routes']\n\n\ndef register():\n    Pool.register(\n        configuration.Configuration,\n        translation.Translation,\n        translation.TranslationSetStart,\n        translation.TranslationSetSucceed,\n        translation.TranslationCleanStart,\n        translation.TranslationCleanSucceed,\n        translation.TranslationUpdateStart,\n        translation.TranslationExportStart,\n        translation.TranslationExportResult,\n        sequence.SequenceType,\n        sequence.Sequence,\n        sequence.SequenceStrict,\n        ui.menu.UIMenu,\n        ui.menu.UIMenuFavorite,\n        ui.view.View,\n        ui.view.ShowViewStart,\n        ui.view.ViewTreeWidth,\n        ui.view.ViewTreeOptional,\n        ui.view.ViewTreeState,\n        ui.view.ViewSearch,\n        ui.icon.Icon,\n        action.Action,\n        action.ActionKeyword,\n        action.ActionReport,\n        action.ActionActWindow,\n        action.ActionActWindowView,\n        action.ActionActWindowDomain,\n        action.ActionWizard,\n        action.ActionURL,\n        model.Model,\n        model.ModelField,\n        model.ModelAccess,\n        model.ModelFieldAccess,\n        model.ModelButton,\n        model.ModelButtonRule,\n        model.ModelButtonClick,\n        model.ModelButtonReset,\n        model.ModelData,\n        model.PrintModelGraphStart,\n        attachment.Attachment,\n        note.Note,\n        note.NoteRead,\n        avatar.Avatar,\n        avatar.AvatarCache,\n        cron.Cron,\n        lang.Lang,\n        lang.LangConfigStart,\n        export.Export,\n        export.ExportLine,\n        rule.RuleGroup,\n        rule.Rule,\n        module.Module,\n        module.ModuleDependency,\n        module.ModuleConfigWizardItem,\n        module.ModuleConfigWizardFirst,\n        module.ModuleConfigWizardOther,\n        module.ModuleConfigWizardDone,\n        module.ModuleActivateUpgradeStart,\n        module.ModuleActivateUpgradeDone,\n        module.ModuleConfigStart,\n        cache.Cache,\n        date.Date,\n        trigger.Trigger,\n        trigger.TriggerLog,\n        session.Session,\n        session.SessionWizard,\n        queue_.Queue,\n        calendar_.Month,\n        calendar_.Day,\n        message.Message,\n        email_.Email,\n        email_.EmailAddress,\n        email_.EmailTemplate,\n        email_.EmailTemplate_Report,\n        error.Error,\n        module='ir', type_='model')\n    Pool.register(\n        translation.TranslationSet,\n        translation.TranslationClean,\n        translation.TranslationUpdate,\n        translation.TranslationExport,\n        translation.TranslationReport,\n        ui.view.ShowView,\n        model.PrintModelGraph,\n        module.ModuleConfigWizard,\n        module.ModuleActivateUpgrade,\n        module.ModuleConfig,\n        lang.LangConfig,\n        module='ir', type_='wizard')\n    Pool.register(\n        model.ModelGraph,\n        model.ModelWorkflowGraph,\n        module='ir', type_='report')\n"
  },
  {
    "path": "trytond/ir/action.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport os\nfrom collections import defaultdict\nfrom functools import partial\nfrom operator import itemgetter\n\nfrom genshi.template.text import TextTemplate\nfrom sql import Null\n\nfrom trytond.cache import Cache, MemoryCache\nfrom trytond.config import config\nfrom trytond.i18n import gettext\nfrom trytond.model import (\n    DeactivableMixin, Index, ModelSingleton, ModelSQL, ModelStorage, ModelView,\n    fields, sequence_ordered)\nfrom trytond.model.exceptions import ValidationError\nfrom trytond.pool import Pool\nfrom trytond.pyson import PYSON, Eval, PYSONDecoder, PYSONEncoder\nfrom trytond.rpc import RPC\nfrom trytond.tools import file_open\nfrom trytond.transaction import Transaction\n\nif not config.get('html', 'plugins-ir.action.report-report_content_html'):\n    config.set(\n        'html', 'plugins-ir.action.report-report_content_html', 'fullpage')\n\n\nclass WizardModelError(ValidationError):\n    pass\n\n\nclass EmailError(ValidationError):\n    pass\n\n\nclass ViewError(ValidationError):\n    pass\n\n\nclass DomainError(ValidationError):\n    pass\n\n\nclass ContextError(ValidationError):\n    pass\n\n\nEMAIL_REFKEYS = set(('cc', 'to', 'subject'))\n\n\nclass Action(DeactivableMixin, ModelSQL, ModelView):\n    \"Action\"\n    __name__ = 'ir.action'\n    name = fields.Char('Name', required=True, translate=True)\n    type = fields.Char('Type', required=True, readonly=True)\n    records = fields.Selection([\n            ('selected', \"Selected\"),\n            ('listed', \"Listed\"),\n            ], \"Records\",\n        help=\"The records on which the action runs.\")\n    usage = fields.Char('Usage')\n    keywords = fields.One2Many('ir.action.keyword', 'action',\n            'Keywords')\n    icon = fields.Many2One('ir.ui.icon', 'Icon')\n\n    @classmethod\n    def __setup__(cls):\n        super(Action, cls).__setup__()\n        cls.__rpc__.update({\n                'get_action_value': RPC(instantiate=0, cache=dict(days=1)),\n                })\n\n    @classmethod\n    def default_records(cls):\n        return 'selected'\n\n    @staticmethod\n    def default_usage():\n        return None\n\n    @classmethod\n    def write(cls, actions, values, *args):\n        pool = Pool()\n        super(Action, cls).write(actions, values, *args)\n        pool.get('ir.action.keyword')._get_keyword_cache.clear()\n\n    @classmethod\n    def get_action_id(cls, action_id):\n        pool = Pool()\n        with Transaction().set_context(active_test=False):\n            if cls.search([\n                        ('id', '=', action_id),\n                        ]):\n                return action_id\n            for action_type in (\n                    'ir.action.report',\n                    'ir.action.act_window',\n                    'ir.action.wizard',\n                    'ir.action.url',\n                    ):\n                Action = pool.get(action_type)\n                actions = Action.search([\n                    ('id', '=', action_id),\n                    ])\n                if actions:\n                    action, = actions\n                    return action.action.id\n\n    @classmethod\n    def get_action_values(cls, type_, action_ids, columns=None):\n        pool = Pool()\n        Action = pool.get(type_)\n        if columns is None:\n            columns = []\n        columns += ['id', 'name', 'type', 'records', 'icon.rec_name']\n        if type_ == 'ir.action.report':\n            columns += ['report_name', 'direct_print']\n        elif type_ == 'ir.action.act_window':\n            columns += [\n                'views', 'domains', 'res_model', 'limit',\n                'context_model', 'context_domain',\n                'pyson_domain', 'pyson_context', 'pyson_order',\n                'pyson_search_value']\n        elif type_ == 'ir.action.wizard':\n            columns += ['wiz_name', 'window']\n        elif type_ == 'ir.action.url':\n            columns += ['url']\n        actions = Action.read(action_ids, columns)\n        if type_ == 'ir.action.act_window':\n            for values in actions:\n                if (values['res_model']\n                        and issubclass(\n                            pool.get(values['res_model']), ModelSingleton)):\n                    values['res_id'] = 1\n        return actions\n\n    def get_action_value(self):\n        return self.get_action_values(\n            self.type, [self.get_action_id(self.id)])[0]\n\n\nclass ActionKeyword(ModelSQL, ModelView):\n    \"Action keyword\"\n    __name__ = 'ir.action.keyword'\n    keyword = fields.Selection([\n            ('tree_open', 'Open tree'),\n            ('form_print', 'Print form'),\n            ('form_action', 'Action form'),\n            ('form_relate', 'Form relate'),\n            ('graph_open', 'Open Graph'),\n            ], string='Keyword', required=True)\n    model = fields.Reference('Model', selection='models_get')\n    action = fields.Many2One('ir.action', 'Action',\n        ondelete='CASCADE')\n    _get_keyword_cache = Cache('ir_action_keyword.get_keyword')\n\n    @classmethod\n    def __setup__(cls):\n        super(ActionKeyword, cls).__setup__()\n        table = cls.__table__()\n\n        cls.__rpc__.update({\n                'get_keyword': RPC(cache=dict(days=1)),\n                })\n        cls._sql_indexes.add(\n            Index(\n                table,\n                (table.keyword, Index.Equality()),\n                (table.model, Index.Equality())))\n\n    @classmethod\n    def validate_fields(cls, actions, field_names):\n        super().validate_fields(actions, field_names)\n        cls.check_wizard_model(actions, field_names)\n\n    @classmethod\n    def check_wizard_model(cls, actions, field_names=None):\n        pool = Pool()\n        ActionWizard = pool.get('ir.action.wizard')\n        if field_names and not (field_names & {'action', 'model'}):\n            return\n        for action in actions:\n            if action.action.type == 'ir.action.wizard':\n                action_wizards = ActionWizard.search([\n                    ('action', '=', action.action.id),\n                    ], limit=1)\n                # could be empty when copying an action\n                if action_wizards:\n                    action_wizard, = action_wizards\n                    if action_wizard.model:\n                        if not str(action.model).startswith(\n                                '%s,' % action_wizard.model):\n                            raise WizardModelError(\n                                gettext('ir.msg_action_wrong_wizard_model',\n                                    name=action_wizard.rec_name))\n\n    @staticmethod\n    def _convert_vals(vals):\n        vals = vals.copy()\n        pool = Pool()\n        Action = pool.get('ir.action')\n        if 'action' in vals:\n            vals['action'] = Action.get_action_id(vals['action'])\n        return vals\n\n    @staticmethod\n    def models_get():\n        pool = Pool()\n        Model = pool.get('ir.model')\n        return [(None, '')] + Model.get_name_items()\n\n    @classmethod\n    def delete(cls, keywords):\n        ModelView._fields_view_get_cache.clear()\n        ModelView._view_toolbar_get_cache.clear()\n        cls._get_keyword_cache.clear()\n        super(ActionKeyword, cls).delete(keywords)\n\n    @classmethod\n    def create(cls, vlist):\n        ModelView._fields_view_get_cache.clear()\n        ModelView._view_toolbar_get_cache.clear()\n        cls._get_keyword_cache.clear()\n        new_vlist = []\n        for vals in vlist:\n            new_vlist.append(cls._convert_vals(vals))\n        return super(ActionKeyword, cls).create(new_vlist)\n\n    @classmethod\n    def write(cls, keywords, values, *args):\n        actions = iter((keywords, values) + args)\n        args = []\n        for keywords, values in zip(actions, actions):\n            args.extend((keywords, cls._convert_vals(values)))\n        super(ActionKeyword, cls).write(*args)\n        ModelView._fields_view_get_cache.clear()\n        ModelView._view_toolbar_get_cache.clear()\n        cls._get_keyword_cache.clear()\n\n    @classmethod\n    def get_keyword(cls, keyword, value):\n        pool = Pool()\n        Action = pool.get('ir.action')\n        Menu = pool.get('ir.ui.menu')\n        ModelAccess = pool.get('ir.model.access')\n        key = (keyword, tuple(value))\n        keywords = cls._get_keyword_cache.get(key)\n        if keywords is not None:\n            return keywords\n        keywords = []\n        model, model_id = value\n\n        clause = [\n            ('keyword', '=', keyword),\n            ['OR',\n                ('model', '=', model + ',-1'),\n                ('model', '=', None),\n                ],\n            ]\n        if model_id >= 0:\n            clause = ['OR',\n                clause,\n                [\n                    ('keyword', '=', keyword),\n                    ('model', '=', model + ',' + str(model_id)),\n                    ],\n                ]\n        clause = [clause, ('action.active', '=', True)]\n        action_keywords = cls.search(clause, order=[])\n        types = defaultdict(list)\n        for action_keyword in action_keywords:\n            type_ = action_keyword.action.type\n            types[type_].append(action_keyword.action.id)\n        for type_, action_ids in types.items():\n            for value in Action.get_action_values(type_, action_ids):\n                if (type_ == 'ir.action.act_window'\n                        and not ModelAccess.check(\n                            value['res_model'], raise_exception=False)):\n                    continue\n                value['keyword'] = keyword\n                keywords.append(value)\n        if keyword == 'tree_open' and model == Menu.__name__:\n            menu = Menu(model_id)\n            for value in keywords:\n                if value['type'] == 'ir.action.act_window':\n                    if len(keywords) == 1:\n                        value['name'] = menu.name\n                    if menu.parent:\n                        parent = menu.parent\n                        if parent.name == value['name']:\n                            parent = parent.parent\n                        if parent:\n                            value['name'] = (\n                                parent.rec_name + ' / ' + value['name'])\n        keywords.sort(key=itemgetter('name'))\n        cls._get_keyword_cache.set(key, keywords)\n        return keywords\n\n\nclass ActionMixin(ModelSQL):\n    _order_name = 'action'\n    _action_name = 'name'\n\n    @classmethod\n    def __setup__(cls):\n        pool = Pool()\n        super(ActionMixin, cls).__setup__()\n        Action = pool.get('ir.action')\n        for name in dir(Action):\n            field = getattr(Action, name)\n            if (isinstance(field, fields.Field)\n                    and not getattr(cls, name, None)):\n                setattr(cls, name, fields.Function(field, 'get_action',\n                        setter='set_action', searcher='search_action'))\n                default_func = 'default_' + name\n                if getattr(Action, default_func, None):\n                    setattr(cls, default_func,\n                        partial(ActionMixin._default_action, name))\n\n    @staticmethod\n    def _default_action(name):\n        pool = Pool()\n        Action = pool.get('ir.action')\n        return getattr(Action, 'default_' + name, None)()\n\n    @classmethod\n    def get_action(cls, ids, names):\n        def identical(v):\n            return v\n\n        def list_int(v):\n            return list(map(int, v))\n        records = cls.browse(ids)\n        result = {}\n        for name in names:\n            result[name] = values = {}\n            for record in records:\n                value = getattr(record, 'action')\n                convert = identical\n                if value is not None:\n                    value = getattr(value, name)\n                    if isinstance(value, ModelStorage):\n                        if cls._fields[name]._type == 'reference':\n                            convert = str\n                        else:\n                            convert = int\n                    elif isinstance(value, (list, tuple)):\n                        convert = list_int\n                values[record.id] = convert(value)\n        return result\n\n    @classmethod\n    def set_action(cls, records, name, value):\n        pool = Pool()\n        Action = pool.get('ir.action')\n        Action.write([r.action for r in records], {\n                name: value,\n                })\n\n    @classmethod\n    def search_action(cls, name, clause):\n        return [('action.' + clause[0],) + tuple(clause[1:])]\n\n    @classmethod\n    def create(cls, vlist):\n        pool = Pool()\n        ModelView._fields_view_get_cache.clear()\n        ModelView._view_toolbar_get_cache.clear()\n        Action = pool.get('ir.action')\n        ir_action = cls.__table__()\n        new_records = []\n        to_write = []\n        for values in vlist:\n            later = {}\n            action_values = {}\n            values = values.copy()\n            for field in values:\n                if field in Action._fields:\n                    action_values[field] = values[field]\n                if hasattr(getattr(cls, field), 'set'):\n                    later[field] = values[field]\n            for field in later:\n                del values[field]\n            action_values['type'] = cls.default_type()\n            transaction = Transaction()\n            database = transaction.database\n            cursor = transaction.connection.cursor()\n            if database.nextid(transaction.connection, cls._table):\n                database.setnextid(transaction.connection, cls._table,\n                    database.currid(transaction.connection, Action._table))\n            if 'action' not in values:\n                action, = Action.create([action_values])\n                values['action'] = action.id\n            else:\n                action = Action(values['action'])\n            record, = super(ActionMixin, cls).create([values])\n            cursor.execute(*ir_action.update(\n                    [ir_action.id], [action.id],\n                    where=ir_action.id == record.id))\n            record = cls(action.id)\n            new_records.append(record)\n            to_write.extend(([record], later))\n        if to_write:\n            cls.write(*to_write)\n        return new_records\n\n    @classmethod\n    def write(cls, records, values, *args):\n        pool = Pool()\n        ActionKeyword = pool.get('ir.action.keyword')\n        super(ActionMixin, cls).write(records, values, *args)\n        ModelView._fields_view_get_cache.clear()\n        ModelView._view_toolbar_get_cache.clear()\n        ActionKeyword._get_keyword_cache.clear()\n\n    @classmethod\n    def delete(cls, records):\n        pool = Pool()\n        ModelView._fields_view_get_cache.clear()\n        ModelView._view_toolbar_get_cache.clear()\n        Action = pool.get('ir.action')\n        actions = [x.action for x in records]\n        super(ActionMixin, cls).delete(records)\n        Action.delete(actions)\n\n    @classmethod\n    def copy(cls, records, default=None):\n        pool = Pool()\n        Action = pool.get('ir.action')\n        if default is None:\n            default = {}\n        default = default.copy()\n        new_records = []\n        for record in records:\n            default['action'] = Action.copy([record.action])[0].id\n            new_records.extend(super(ActionMixin, cls).copy([record],\n                    default=default))\n        return new_records\n\n    @classmethod\n    def fetch_action(cls, action_id):\n        fields = list(cls._fields.keys())\n        return cls.search_read(\n            [('action', '=', action_id)], fields_names=fields, limit=1)\n\n\nclass ActionReport(ActionMixin, ModelSQL, ModelView):\n    \"Action report\"\n    __name__ = 'ir.action.report'\n    _action_name = 'report_name'\n    model = fields.Char('Model')\n    report_name = fields.Char('Internal Name', required=True)\n    report = fields.Char(\n        \"Path\",\n        states={\n            'invisible': Eval('is_custom', False),\n            },\n        depends=['is_custom'])\n    report_content_custom = fields.Binary('Content')\n    is_custom = fields.Function(fields.Boolean(\"Is Custom\"), 'get_is_custom')\n    report_content = fields.Function(fields.Binary('Content',\n            filename='report_content_name'),\n        'get_report_content', setter='set_report_content')\n    report_content_name = fields.Function(fields.Char('Content Name'),\n        'on_change_with_report_content_name')\n    report_content_html = fields.Function(fields.Binary(\n            \"Content HTML\",\n            states={\n                'invisible': ~Eval('template_extension').in_(\n                    ['html', 'xhtml']),\n                },\n            depends=['template_extension']),\n        'get_report_content_html', setter='set_report_content_html')\n    action = fields.Many2One('ir.action', 'Action', required=True,\n            ondelete='CASCADE')\n    direct_print = fields.Boolean('Direct Print')\n    single = fields.Boolean(\"Single\",\n        help=\"Check if the template works only for one record.\")\n    translatable = fields.Boolean(\"Translatable\",\n        help=\"Uncheck to disable translations for this report.\")\n    template_extension = fields.Selection([\n            ('odt', 'OpenDocument Text'),\n            ('odp', 'OpenDocument Presentation'),\n            ('ods', 'OpenDocument Spreadsheet'),\n            ('odg', 'OpenDocument Graphics'),\n            ('txt', 'Plain Text'),\n            ('xml', 'XML'),\n            ('html', 'HTML'),\n            ('xhtml', 'XHTML'),\n            ], string='Template Extension', required=True,\n        translate=False)\n    extension = fields.Selection([\n            ('', ''),\n            ('bib', 'BibTex'),\n            ('bmp', 'Windows Bitmap'),\n            ('csv', 'Text CSV'),\n            ('dbf', 'dBase'),\n            ('dif', 'Data Interchange Format'),\n            ('doc', 'Microsoft Word 97/2000/XP'),\n            ('doc6', 'Microsoft Word 6.0'),\n            ('doc95', 'Microsoft Word 95'),\n            ('docbook', 'DocBook'),\n            ('docx', 'Microsoft Office Open XML Text'),\n            ('docx7', 'Microsoft Word 2007 XML'),\n            ('emf', 'Enhanced Metafile'),\n            ('eps', 'Encapsulated PostScript'),\n            ('gif', 'Graphics Interchange Format'),\n            ('html', 'HTML Document'),\n            ('jpg', 'Joint Photographic Experts Group'),\n            ('met', 'OS/2 Metafile'),\n            ('ooxml', 'Microsoft Office Open XML'),\n            ('pbm', 'Portable Bitmap'),\n            ('pct', 'Mac Pict'),\n            ('pdb', 'AportisDoc (Palm)'),\n            ('pdf', 'Portable Document Format'),\n            ('pgm', 'Portable Graymap'),\n            ('png', 'Portable Network Graphic'),\n            ('ppm', 'Portable Pixelmap'),\n            ('ppt', 'Microsoft PowerPoint 97/2000/XP'),\n            ('psw', 'Pocket Word'),\n            ('pwp', 'PlaceWare'),\n            ('pxl', 'Pocket Excel'),\n            ('ras', 'Sun Raster Image'),\n            ('rtf', 'Rich Text Format'),\n            ('latex', 'LaTeX 2e'),\n            ('sda', 'StarDraw 5.0 (OpenOffice.org Impress)'),\n            ('sdc', 'StarCalc 5.0'),\n            ('sdc4', 'StarCalc 4.0'),\n            ('sdc3', 'StarCalc 3.0'),\n            ('sdd', 'StarImpress 5.0'),\n            ('sdd3', 'StarDraw 3.0 (OpenOffice.org Impress)'),\n            ('sdd4', 'StarImpress 4.0'),\n            ('sdw', 'StarWriter 5.0'),\n            ('sdw4', 'StarWriter 4.0'),\n            ('sdw3', 'StarWriter 3.0'),\n            ('slk', 'SYLK'),\n            ('svg', 'Scalable Vector Graphics'),\n            ('svm', 'StarView Metafile'),\n            ('swf', 'Macromedia Flash (SWF)'),\n            ('sxc', 'OpenOffice.org 1.0 Spreadsheet'),\n            ('sxi', 'OpenOffice.org 1.0 Presentation'),\n            ('sxd', 'OpenOffice.org 1.0 Drawing'),\n            ('sxd3', 'StarDraw 3.0'),\n            ('sxd5', 'StarDraw 5.0'),\n            ('sxw', 'Open Office.org 1.0 Text Document'),\n            ('text', 'Text Encoded'),\n            ('tiff', 'Tagged Image File Format'),\n            ('txt', 'Plain Text'),\n            ('wmf', 'Windows Metafile'),\n            ('xhtml', 'XHTML Document'),\n            ('xls', 'Microsoft Excel 97/2000/XP'),\n            ('xls5', 'Microsoft Excel 5.0'),\n            ('xls95', 'Microsoft Excel 95'),\n            ('xlsx', 'Microsoft Excel 2007/2010 XML'),\n            ('xpm', 'X PixMap'),\n            ], translate=False,\n        string='Extension', help='Leave empty for the same as template, '\n        'see LibreOffice documentation for compatible format.')\n    record_name = fields.Char(\n        \"Record Name\", translate=True,\n        help=\"A Genshi expression to compute the name using 'record'.\\n\"\n        \"Leave empty for the default name.\",)\n    module = fields.Char('Module', readonly=True)\n    _template_cache = MemoryCache('ir.action.report.template', context=False)\n\n    @classmethod\n    def __register__(cls, module_name):\n        super(ActionReport, cls).__register__(module_name)\n\n        transaction = Transaction()\n        cursor = transaction.connection.cursor()\n        table = cls.__table_handler__(module_name)\n        action_report = cls.__table__()\n\n        # Migration from 3.4 remove report_name_module_uniq constraint\n        table.drop_constraint('report_name_module_uniq')\n\n        # Migration from 4.4 replace plain extension by txt\n        cursor.execute(*action_report.update(\n                [action_report.extension],\n                ['txt'],\n                where=action_report.extension == 'plain'))\n\n    @staticmethod\n    def default_type():\n        return 'ir.action.report'\n\n    @staticmethod\n    def default_report_content():\n        return None\n\n    @staticmethod\n    def default_direct_print():\n        return False\n\n    @classmethod\n    def default_single(cls):\n        return False\n\n    @classmethod\n    def default_translatable(cls):\n        return True\n\n    @staticmethod\n    def default_template_extension():\n        return 'odt'\n\n    @staticmethod\n    def default_extension():\n        return ''\n\n    @staticmethod\n    def default_module():\n        return Transaction().context.get('module') or ''\n\n    def get_is_custom(self, name):\n        return bool(self.report_content_custom)\n\n    @classmethod\n    def get_report_content(cls, reports, name):\n        contents = {}\n        converter = fields.Binary.cast\n        default = None\n        format_ = Transaction().context.get(\n            '%s.%s' % (cls.__name__, name), '')\n        if format_ == 'size':\n            converter = len\n            default = 0\n        for report in reports:\n            data = getattr(report, name + '_custom')\n            if not data and getattr(report, name[:-8]):\n                try:\n                    with file_open(\n                            getattr(report, name[:-8]).replace('/', os.sep),\n                            mode='rb') as fp:\n                        data = fp.read()\n                except Exception:\n                    data = None\n            contents[report.id] = converter(data) if data else default\n        return contents\n\n    @classmethod\n    def set_report_content(cls, records, name, value):\n        cls.write(records, {'%s_custom' % name: value})\n\n    @classmethod\n    def get_report_content_html(cls, reports, name):\n        return cls.get_report_content(reports, name[:-5])\n\n    @classmethod\n    def set_report_content_html(cls, reports, name, value):\n        if value is not None:\n            value = value.encode('utf-8')\n        cls.set_report_content(reports, name[:-5], value)\n\n    @fields.depends('name', 'template_extension')\n    def on_change_with_report_content_name(self, name=None):\n        return ''.join(\n            filter(None, [self.name, os.extsep, self.template_extension]))\n\n    @classmethod\n    def get_pyson(cls, reports, name):\n        pysons = {}\n        field = name[6:]\n        defaults = {}\n        for report in reports:\n            pysons[report.id] = (getattr(report, field)\n                or defaults.get(field, 'null'))\n        return pysons\n\n    @classmethod\n    def copy(cls, reports, default=None):\n        if default is None:\n            default = {}\n        default = default.copy()\n        default.setdefault('module', None)\n\n        new_reports = []\n        for report in reports:\n            if report.report:\n                default['report_content'] = None\n                default['report'] = None\n            default['report_name'] = report.report_name\n            new_reports.extend(super(ActionReport, cls).copy([report],\n                    default=default))\n        return new_reports\n\n    @classmethod\n    def write(cls, reports, values, *args):\n        context = Transaction().context\n        if 'module' in context:\n            actions = iter((reports, values) + args)\n            args = []\n            for reports, values in zip(actions, actions):\n                values = values.copy()\n                values['module'] = context['module']\n                args.extend((reports, values))\n            reports, values = args[:2]\n            args = args[2:]\n        cls._template_cache.clear()\n        super(ActionReport, cls).write(reports, values, *args)\n\n    def get_template_cached(self):\n        return self._template_cache.get(self.id)\n\n    def set_template_cached(self, template):\n        self._template_cache.set(self.id, template)\n\n    @classmethod\n    def validate_fields(cls, reports, field_names):\n        super().validate_fields(reports, field_names)\n        cls.check_record_name(reports, field_names)\n\n    @classmethod\n    def check_record_name(cls, reports, field_names=None):\n        if field_names and 'record_name' not in field_names:\n            return\n        for report in reports:\n            if not report.record_name:\n                return\n            try:\n                TextTemplate(report.record_name)\n            except Exception as exception:\n                raise ValidationError(gettext(\n                        'ir.msg_report_invalid_record_name',\n                        report=report.rec_name,\n                        exception=exception)) from exception\n\n\nclass ActionActWindow(ActionMixin, ModelSQL, ModelView):\n    \"Action act window\"\n    __name__ = 'ir.action.act_window'\n    domain = fields.Char('Domain Value')\n    context = fields.Char('Context Value')\n    order = fields.Char('Order Value')\n    res_model = fields.Char('Model')\n    context_model = fields.Char('Context Model')\n    context_domain = fields.Char(\n        \"Context Domain\",\n        help=\"Part of the domain that will be evaluated on each refresh.\")\n    act_window_views = fields.One2Many('ir.action.act_window.view',\n            'act_window', 'Views')\n    views = fields.Function(fields.Binary('Views'), 'get_views')\n    act_window_domains = fields.One2Many('ir.action.act_window.domain',\n        'act_window', 'Domains')\n    domains = fields.Function(fields.Binary('Domains'), 'get_domains')\n    limit = fields.Integer('Limit', help='Default limit for the list view.')\n    action = fields.Many2One('ir.action', 'Action', required=True,\n            ondelete='CASCADE')\n    search_value = fields.Char('Search Criteria',\n            help='Default search criteria for the list view.')\n    pyson_domain = fields.Function(fields.Char('PySON Domain'), 'get_pyson')\n    pyson_context = fields.Function(fields.Char('PySON Context'),\n            'get_pyson')\n    pyson_order = fields.Function(fields.Char('PySON Order'), 'get_pyson')\n    pyson_search_value = fields.Function(fields.Char(\n        'PySON Search Criteria'), 'get_pyson')\n\n    @classmethod\n    def __setup__(cls):\n        super(ActionActWindow, cls).__setup__()\n        cls.__rpc__.update({\n                'get': RPC(cache=dict(days=1)),\n                })\n\n    @classmethod\n    def __register__(cls, module_name):\n        cursor = Transaction().connection.cursor()\n        act_window = cls.__table__()\n        super(ActionActWindow, cls).__register__(module_name)\n\n        table = cls.__table_handler__(module_name)\n\n        # Migration from 3.0: auto_refresh removed\n        table.drop_column('auto_refresh')\n\n        # Migration from 4.0: window_name removed\n        table.drop_column('window_name')\n\n        # Migration from 4.2: remove required on limit\n        table.not_null_action('limit', 'remove')\n        cursor.execute(*act_window.update(\n                [act_window.limit], [Null],\n                where=act_window.limit == 0))\n\n    @staticmethod\n    def default_type():\n        return 'ir.action.act_window'\n\n    @staticmethod\n    def default_context():\n        return '{}'\n\n    @staticmethod\n    def default_search_value():\n        return '[]'\n\n    @classmethod\n    def validate(cls, actions):\n        super(ActionActWindow, cls).validate(actions)\n        cls.check_views(actions)\n\n    @classmethod\n    def validate_fields(cls, actions, field_names):\n        super().validate_fields(actions, field_names)\n        cls.check_domain(actions, field_names)\n        cls.check_context(actions, field_names)\n\n    @classmethod\n    def check_views(cls, actions):\n        \"Check views\"\n        for action in actions:\n            if action.res_model:\n                for act_window_view in action.act_window_views:\n                    view = act_window_view.view\n                    if view.model != action.res_model:\n                        raise ViewError(\n                            gettext('ir.msg_action_invalid_views',\n                                view=view.rec_name,\n                                action=action.rec_name))\n                    if view.type == 'board':\n                        raise ViewError(\n                            gettext('ir.msg_action_invalid_views',\n                                view=view.rec_name,\n                                action=action.rec_name))\n            else:\n                for act_window_view in action.act_window_views:\n                    view = act_window_view.view\n                    if view.model:\n                        raise ViewError(\n                            gettext('ir.msg_action_invalid_views',\n                                view=view.rec_name,\n                                action=action.rec_name))\n                    if view.type != 'board':\n                        raise ViewError(\n                            gettext('ir.msg_action_invalid_views',\n                                view=view.rec_name,\n                                action=action.rec_name))\n\n    @classmethod\n    def check_domain(cls, actions, field_names=None):\n        \"Check domain and search_value\"\n        if field_names and not (field_names & {'domain', 'search_value'}):\n            return\n        for action in actions:\n            for domain in (action.domain, action.search_value):\n                if not domain:\n                    continue\n                try:\n                    value = PYSONDecoder().decode(domain)\n                except Exception as exception:\n                    raise DomainError(\n                        gettext('ir.msg_action_invalid_domain',\n                            domain=domain,\n                            action=action.rec_name)) from exception\n                if isinstance(value, PYSON):\n                    if not value.types() == set([list]):\n                        raise DomainError(\n                            gettext('ir.msg_action_invalid_domain',\n                                domain=domain,\n                                action=action.rec_name))\n                elif not isinstance(value, list):\n                    raise DomainError(\n                        gettext('ir.msg_action_invalid_domain',\n                            domain=domain,\n                            action=action.rec_name))\n                else:\n                    try:\n                        fields.domain_validate(value)\n                    except Exception as exception:\n                        raise DomainError(\n                            gettext('ir.msg_action_invalid_domain',\n                                domain=domain,\n                                action=action.rec_name)) from exception\n\n    @classmethod\n    def check_context(cls, actions, field_names=None):\n        \"Check context\"\n        if field_names and 'context' not in field_names:\n            return\n        for action in actions:\n            if action.context:\n                try:\n                    value = PYSONDecoder().decode(action.context)\n                except Exception as exception:\n                    raise ContextError(\n                        gettext('ir.msg_action_invalid_context',\n                            context=action.context,\n                            action=action.rec_name)) from exception\n                if isinstance(value, PYSON):\n                    if not value.types() == set([dict]):\n                        raise ContextError(\n                            gettext('ir.msg_action_invalid_context',\n                                context=action.context,\n                                action=action.rec_name))\n                elif not isinstance(value, dict):\n                    raise ContextError(\n                        gettext('ir.msg_action_invalid_context',\n                            context=action.context,\n                            action=action.rec_name))\n                else:\n                    try:\n                        fields.context_validate(value)\n                    except Exception as exception:\n                        raise ContextError(\n                            gettext('ir.msg_action_invalid_context',\n                                context=action.context,\n                                action=action.rec_name)) from exception\n\n    def get_views(self, name):\n        return [(view.view.id, view.view.type)\n            for view in self.act_window_views]\n\n    def get_domains(self, name):\n        return [(domain.name, domain.domain or '[]', domain.count)\n            for domain in self.act_window_domains]\n\n    @classmethod\n    def get_pyson(cls, windows, name):\n        pool = Pool()\n        encoder = PYSONEncoder()\n        pysons = {}\n        field = name[6:]\n        defaults = {\n            'domain': '[]',\n            'context': '{}',\n            'search_value': '[]',\n            }\n        for window in windows:\n            if not window.order and field == 'order':\n                if window.res_model:\n                    defaults['order'] = encoder.encode(\n                        getattr(pool.get(window.res_model), '_order', 'null'))\n                else:\n                    defaults['order'] = 'null'\n            pysons[window.id] = (getattr(window, field)\n                or defaults.get(field, 'null'))\n        return pysons\n\n    @classmethod\n    def get(cls, xml_id):\n        'Get values from XML id or id'\n        pool = Pool()\n        ModelData = pool.get('ir.model.data')\n        Action = pool.get('ir.action')\n        if '.' in xml_id:\n            action_id = ModelData.get_id(*xml_id.split('.'))\n        else:\n            action_id = int(xml_id)\n        return Action(action_id).get_action_value()\n\n\nclass ActionActWindowView(\n        sequence_ordered(), DeactivableMixin, ModelSQL, ModelView):\n    \"Action act window view\"\n    __name__ = 'ir.action.act_window.view'\n    view = fields.Many2One('ir.ui.view', 'View', required=True,\n            ondelete='CASCADE')\n    act_window = fields.Many2One('ir.action.act_window', 'Action',\n            ondelete='CASCADE')\n\n    @classmethod\n    def __register__(cls, module_name):\n        super().__register__(module_name)\n\n        table = cls.__table_handler__(module_name)\n\n        # Migration from 5.0: remove required on sequence\n        table.not_null_action('sequence', 'remove')\n\n    @classmethod\n    def create(cls, vlist):\n        pool = Pool()\n        windows = super(ActionActWindowView, cls).create(vlist)\n        pool.get('ir.action.keyword')._get_keyword_cache.clear()\n        return windows\n\n    @classmethod\n    def write(cls, windows, values, *args):\n        pool = Pool()\n        super(ActionActWindowView, cls).write(windows, values, *args)\n        pool.get('ir.action.keyword')._get_keyword_cache.clear()\n\n    @classmethod\n    def delete(cls, windows):\n        pool = Pool()\n        super(ActionActWindowView, cls).delete(windows)\n        pool.get('ir.action.keyword')._get_keyword_cache.clear()\n\n\nclass ActionActWindowDomain(\n        sequence_ordered(), DeactivableMixin, ModelSQL, ModelView):\n    \"Action act window domain\"\n    __name__ = 'ir.action.act_window.domain'\n    name = fields.Char('Name', translate=True)\n    domain = fields.Char('Domain')\n    count = fields.Boolean('Count')\n    act_window = fields.Many2One('ir.action.act_window', 'Action',\n        required=True, ondelete='CASCADE')\n\n    @classmethod\n    def __register__(cls, module_name):\n        super().__register__(module_name)\n\n        table = cls.__table_handler__(module_name)\n\n        # Migration from 5.0: remove required on sequence\n        table.not_null_action('sequence', 'remove')\n\n    @classmethod\n    def default_count(cls):\n        return False\n\n    @classmethod\n    def validate_fields(cls, actions, field_names):\n        super().validate_fields(actions, field_names)\n        cls.check_domain(actions, field_names)\n\n    @classmethod\n    def check_domain(cls, actions, field_names=None):\n        if field_names and 'domain' not in field_names:\n            return\n        for action in actions:\n            if not action.domain:\n                continue\n            try:\n                value = PYSONDecoder().decode(action.domain)\n            except Exception as exception:\n                raise DomainError(gettext(\n                        'ir.msg_action_invalid_domain',\n                        domain=action.domain,\n                        action=action.rec_name)) from exception\n            if isinstance(value, PYSON):\n                if not value.types() == set([list]):\n                    raise DomainError(gettext(\n                            'ir.msg_action_invalid_domain',\n                            domain=action.domain,\n                            action=action.rec_name))\n            elif not isinstance(value, list):\n                raise DomainError(gettext(\n                        'ir.msg_action_invalid_domain',\n                        domain=action.domain,\n                        action=action.rec_name))\n            else:\n                try:\n                    fields.domain_validate(value)\n                except Exception as exception:\n                    raise DomainError(gettext(\n                            'ir.msg_action_invalid_domain',\n                            domain=action.domain,\n                            action=action.rec_name)) from exception\n\n    @classmethod\n    def create(cls, vlist):\n        pool = Pool()\n        domains = super(ActionActWindowDomain, cls).create(vlist)\n        pool.get('ir.action.keyword')._get_keyword_cache.clear()\n        return domains\n\n    @classmethod\n    def write(cls, domains, values, *args):\n        pool = Pool()\n        super(ActionActWindowDomain, cls).write(domains, values, *args)\n        pool.get('ir.action.keyword')._get_keyword_cache.clear()\n\n    @classmethod\n    def delete(cls, domains):\n        pool = Pool()\n        super(ActionActWindowDomain, cls).delete(domains)\n        pool.get('ir.action.keyword')._get_keyword_cache.clear()\n\n\nclass ActionWizard(ActionMixin, ModelSQL, ModelView):\n    \"Action wizard\"\n    __name__ = 'ir.action.wizard'\n    _action_name = 'wiz_name'\n    wiz_name = fields.Char('Wizard name', required=True)\n    action = fields.Many2One('ir.action', 'Action', required=True,\n            ondelete='CASCADE')\n    model = fields.Char('Model')\n    window = fields.Boolean('Window', help='Run wizard in a new window.')\n\n    @staticmethod\n    def default_type():\n        return 'ir.action.wizard'\n\n    @classmethod\n    def get_models(cls, name, action_id=None):\n        # TODO add cache\n        domain = [\n            (cls._action_name, '=', name),\n            ]\n        if action_id:\n            domain.append(('id', '=', action_id))\n        actions = cls.search(domain)\n        return {a.model for a in actions if a.model}\n\n\nclass ActionURL(ActionMixin, ModelSQL, ModelView):\n    \"Action URL\"\n    __name__ = 'ir.action.url'\n    url = fields.Char('Action Url', required=True)\n    action = fields.Many2One('ir.action', 'Action', required=True,\n            ondelete='CASCADE')\n\n    @staticmethod\n    def default_type():\n        return 'ir.action.url'\n"
  },
  {
    "path": "trytond/ir/action.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <menuitem\n            name=\"Actions\"\n            parent=\"menu_ui\"\n            sequence=\"50\"\n            id=\"menu_action\"/>\n        <record model=\"ir.ui.view\" id=\"action_view_form\">\n            <field name=\"model\">ir.action</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">action_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"action_view_tree\">\n            <field name=\"model\">ir.action</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">action_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_action_form\">\n            <field name=\"name\">Actions</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">ir.action</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_action_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"action_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_action_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_action_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"action_view_form\"/>\n            <field name=\"act_window\" ref=\"act_action_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_action\"\n            action=\"act_action_form\"\n            sequence=\"10\"\n            id=\"menu_act_action\"/>\n\n        <record model=\"ir.ui.view\" id=\"action_keyword_view_list\">\n            <field name=\"model\">ir.action.keyword</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">action_keyword_list</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"action_keyword_view_form\">\n            <field name=\"model\">ir.action.keyword</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">action_keyword_form</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"action_report_view_form\">\n            <field name=\"model\">ir.action.report</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">action_report_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"action_report_view_tree\">\n            <field name=\"model\">ir.action.report</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">action_report_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_action_report_form\">\n            <field name=\"name\">Reports</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">ir.action.report</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_action_report_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"action_report_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_action_report_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_action_report_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"action_report_view_form\"/>\n            <field name=\"act_window\" ref=\"act_action_report_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_action\"\n            action=\"act_action_report_form\"\n            sequence=\"20\"\n            id=\"menu_action_report_form\"/>\n\n        <record model=\"ir.ui.view\" id=\"action_act_window_view_form\">\n            <field name=\"model\">ir.action.act_window</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">action_act_window_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"action_act_window_view_tree\">\n            <field name=\"model\">ir.action.act_window</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">action_act_window_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_action_act_window_form\">\n            <field name=\"name\">Window Actions</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">ir.action.act_window</field>\n        </record>\n        <record model=\"ir.action.act_window.view\" id=\"act_action_act_window_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"action_act_window_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_action_act_window_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\" id=\"act_action_act_window_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"action_act_window_view_form\"/>\n            <field name=\"act_window\" ref=\"act_action_act_window_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_action\"\n            action=\"act_action_act_window_form\"\n            sequence=\"20\"\n            id=\"menu_action_act_window\"/>\n\n        <record model=\"ir.ui.view\" id=\"act_window_view_view_form\">\n            <field name=\"model\">ir.action.act_window.view</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">action_act_window_view_form</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"act_window_view_view_list\">\n            <field name=\"model\">ir.action.act_window.view</field>\n            <field name=\"type\">tree</field>\n            <field name=\"priority\" eval=\"10\"/>\n            <field name=\"name\">action_act_window_view_list</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"act_window_view_view_list2\">\n            <field name=\"model\">ir.action.act_window.view</field>\n            <field name=\"type\">tree</field>\n            <field name=\"priority\" eval=\"20\"/>\n            <field name=\"name\">action_act_window_view_list2</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"act_window_domain_view_form\">\n            <field name=\"model\">ir.action.act_window.domain</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">action_act_window_domain_form</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"act_window_domain_view_list\">\n            <field name=\"model\">ir.action.act_window.domain</field>\n            <field name=\"type\">tree</field>\n            <field name=\"priority\" eval=\"10\"/>\n            <field name=\"name\">action_act_window_domain_list</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"act_window_domain_view_list2\">\n            <field name=\"model\">ir.action.act_window.domain</field>\n            <field name=\"type\">tree</field>\n            <field name=\"priority\" eval=\"20\"/>\n            <field name=\"name\">action_act_window_domain_list2</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"action_wizard_view_form\">\n            <field name=\"model\">ir.action.wizard</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">action_wizard_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"action_wizard_view_tree\">\n            <field name=\"model\">ir.action.wizard</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">action_wizard_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_action_wizard_form\">\n            <field name=\"name\">Wizards</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">ir.action.wizard</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_action_wizard_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"action_wizard_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_action_wizard_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_action_wizard_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"action_wizard_view_form\"/>\n            <field name=\"act_window\" ref=\"act_action_wizard_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_action\"\n            action=\"act_action_wizard_form\"\n            id=\"menu_action_wizard\"/>\n\n        <record model=\"ir.ui.view\" id=\"action_url_view_form\">\n            <field name=\"model\">ir.action.url</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">action_url_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"action_url_view_tree\">\n            <field name=\"model\">ir.action.url</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">action_url_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_action_url_form\">\n            <field name=\"name\">URLs</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">ir.action.url</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_action_url_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"action_url_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_action_url_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_action_url_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"action_url_view_form\"/>\n            <field name=\"act_window\" ref=\"act_action_url_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_action\"\n            action=\"act_action_url_form\"\n            sequence=\"20\"\n            id=\"menu_action_url\"/>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/attachment.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom sql import Null\nfrom sql.operators import Concat\n\nfrom trytond.config import config\nfrom trytond.i18n import lazy_gettext\nfrom trytond.model import ModelSQL, ModelView, fields\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval\nfrom trytond.tools import firstline\nfrom trytond.transaction import Transaction\n\nfrom .resource import ResourceMixin, resource_copy\n\n__all__ = ['AttachmentCopyMixin']\n\n\nif config.getboolean('attachment', 'filestore', default=True):\n    file_id = 'file_id'\n    store_prefix = config.get('attachment', 'store_prefix', default=None)\nelse:\n    file_id = None\n    store_prefix = None\n\n\nclass Attachment(ResourceMixin, ModelSQL, ModelView):\n    \"Attachment\"\n    __name__ = 'ir.attachment'\n    name = fields.Char('Name', required=True)\n    type = fields.Selection([\n        ('data', 'Data'),\n        ('link', 'Link'),\n        ], 'Type', required=True)\n    description = fields.Text('Description')\n    summary = fields.Function(fields.Char('Summary'), 'on_change_with_summary')\n    link = fields.Char('Link', states={\n            'invisible': Eval('type') != 'link',\n            }, depends=['type'])\n    data = fields.Binary('Data', filename='name',\n        file_id=file_id, store_prefix=store_prefix,\n        states={\n            'invisible': Eval('type') != 'data',\n            }, depends=['type'])\n    file_id = fields.Char('File ID', readonly=True)\n    data_size = fields.Function(fields.Integer('Data size', states={\n                'invisible': Eval('type') != 'data',\n                }, depends=['type']), 'get_size')\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        cls._order = [\n            ('create_date', 'DESC'),\n            ('id', 'DESC'),\n            ]\n\n    @classmethod\n    def __register__(cls, module_name):\n        cursor = Transaction().connection.cursor()\n\n        super(Attachment, cls).__register__(module_name)\n\n        table = cls.__table_handler__(module_name)\n        attachment = cls.__table__()\n\n        # Migration from 4.0: merge digest and collision into file_id\n        if table.column_exist('digest') and table.column_exist('collision'):\n            cursor.execute(*attachment.update(\n                    [attachment.file_id],\n                    [attachment.digest],\n                    where=(attachment.collision == 0)\n                    | (attachment.collision == Null)))\n            cursor.execute(*attachment.update(\n                    [attachment.file_id],\n                    [Concat(Concat(attachment.digest, '-'),\n                            attachment.collision)],\n                    where=(attachment.collision != 0)\n                    & (attachment.collision != Null)))\n            table.drop_column('digest')\n            table.drop_column('collision')\n\n        # Migration from 4.8: remove unique constraint\n        table.drop_constraint('resource_name')\n\n    @staticmethod\n    def default_type():\n        return 'data'\n\n    def get_size(self, name):\n        with Transaction().set_context({\n                    '%s.%s' % (self.__name__, name[:-len('_size')]): 'size',\n                    }):\n            record = self.__class__(self.id)\n            return record.data\n\n    @fields.depends('description')\n    def on_change_with_summary(self, name=None):\n        return firstline(self.description or '')\n\n    @classmethod\n    def fields_view_get(cls, view_id=None, view_type='form', level=None):\n        pool = Pool()\n        ModelData = pool.get('ir.model.data')\n        if not view_id:\n            if Transaction().context.get('preview'):\n                view_id = ModelData.get_id(\n                    'ir', 'attachment_view_form_preview')\n        return super().fields_view_get(\n            view_id=view_id, view_type=view_type, level=level)\n\n\nclass AttachmentCopyMixin(\n        resource_copy(\n            'ir.attachment', 'attachments',\n            lazy_gettext('ir.msg_attachments'))):\n    pass\n"
  },
  {
    "path": "trytond/ir/attachment.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <record model=\"ir.ui.view\" id=\"attachment_view_form\">\n            <field name=\"model\">ir.attachment</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">attachment_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"attachment_view_form_preview\">\n            <field name=\"model\">ir.attachment</field>\n            <field name=\"type\">form</field>\n            <field name=\"priority\" eval=\"50\"/>\n            <field name=\"name\">attachment_form_preview</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"attachment_view_tree\">\n            <field name=\"model\">ir.attachment</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">attachment_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_attachment_form\">\n            <field name=\"name\">Attachments</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">ir.attachment</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_attachment_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"attachment_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_attachment_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_attachment_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"attachment_view_form\"/>\n            <field name=\"act_window\" ref=\"act_attachment_form\"/>\n        </record>\n        <menuitem\n            parent=\"ir.menu_models\"\n            action=\"act_attachment_form\"\n            sequence=\"50\"\n            id=\"menu_attachment_form\"/>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/avatar.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport io\nimport math\nimport os\nimport uuid\nfrom random import Random\nfrom urllib.parse import quote, urljoin\n\ntry:\n    import PIL\n    from PIL import Image, ImageDraw, ImageFont\nexcept ImportError:\n    PIL = None\n\nfrom trytond.config import config\nfrom trytond.model import ModelSQL, Unique, fields\nfrom trytond.pool import Pool\nfrom trytond.transaction import Transaction\nfrom trytond.wsgi import Base64Converter\n\nfrom .resource import ResourceMixin\n\nif config.getboolean('database', 'avatar_filestore', default=False):\n    file_id = 'image_id'\n    store_prefix = config.get('database', 'avatar_prefix', default=None)\nelse:\n    file_id = None\n    store_prefix = None\nURL_BASE = config.get('web', 'avatar_base', default='')\nFONT = os.path.join(os.path.dirname(__file__), 'fonts', 'karla.ttf')\n\n\nclass ImageMixin:\n    __slots__ = ()\n    image = fields.Binary(\n        \"Image\", file_id=file_id, store_prefix=store_prefix)\n    image_id = fields.Char(\"Image ID\", readonly=True)\n\n\nclass Avatar(ImageMixin, ResourceMixin, ModelSQL):\n    \"Avatar\"\n    __name__ = 'ir.avatar'\n\n    uuid = fields.Char(\"UUID\", required=True)\n    cache = fields.One2Many('ir.avatar.cache', 'avatar', \"Cache\")\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        t = cls.__table__()\n        cls._sql_constraints = [\n            ('resource_unique', Unique(t, t.resource),\n                'ir.msg_avatar_resource_unique'),\n            ]\n\n    @classmethod\n    def default_uuid(cls):\n        return uuid.uuid4().hex\n\n    @classmethod\n    def create(cls, vlist):\n        vlist = [v.copy() for v in vlist]\n        for values in vlist:\n            values.setdefault('uuid', cls.default_uuid())\n        return super().create(vlist)\n\n    @classmethod\n    def write(cls, *args):\n        avatars = sum(args[0:None:2], [])\n        super().write(*args)\n        cls.clear_cache(avatars)\n\n    @classmethod\n    def copy(cls, avatars, default=None):\n        if default is None:\n            default = {}\n        else:\n            default = default.copy()\n        default.setdefault('uuid', None)\n        default.setdefault('cache', None)\n        return super().copy(avatars, default=default)\n\n    @property\n    def url(self):\n        if self.image_id or self.image:\n            return urljoin(\n                URL_BASE, quote('/avatar/%(database)s/%(uuid)s' % {\n                        'database': Base64Converter(None).to_url(\n                            Transaction().database.name),\n                        'uuid': self.uuid,\n                        }))\n\n    def get(self, size=64):\n        size = min((\n                2 ** math.ceil(math.log2(size)),\n                10 * math.ceil(size / 10) if size <= 100\n                else 50 * math.ceil(size / 50)))\n        if not (0 < size <= 2048):\n            raise ValueError(\"Invalid size\")\n        for avatar in self.cache:\n            if avatar.size == size:\n                return avatar.image\n        if not self.image:\n            return None\n        if PIL:\n            with Transaction().new_transaction():\n                cache = self._store_cache(size, self._resize(size))\n                # Save cache only if record is already committed\n                if self.__class__.search([('id', '=', self.id)]):\n                    cache.save()\n                return cache.image\n        else:\n            return self.image\n\n    @classmethod\n    def convert(cls, image, **_params):\n        if not PIL or not image:\n            return image\n        data = io.BytesIO()\n        img = Image.open(io.BytesIO(image))\n        width, height = img.size\n        size = min(width, height)\n        img = img.crop((\n                (width - size) // 2,\n                (height - size) // 2,\n                (width + size) // 2,\n                (height + size) // 2))\n        if size > 2048:\n            img = img.resize((2048, 2048))\n        if img.mode in {'RGBA', 'P'}:\n            img = img.convert('RGB')\n        img.save(data, format='jpeg', optimize=True, **_params)\n        return data.getvalue()\n\n    def _resize(self, size=64, **_params):\n        if not PIL:\n            return self.image\n        data = io.BytesIO()\n        img = Image.open(io.BytesIO(self.image))\n        img = img.resize((size, size))\n        img.save(data, format='jpeg', optimize=True, **_params)\n        return data.getvalue()\n\n    def _store_cache(self, size, image):\n        pool = Pool()\n        Cache = pool.get('ir.avatar.cache')\n        return Cache(\n            avatar=self,\n            image=image,\n            size=size)\n\n    @classmethod\n    def clear_cache(cls, avatars):\n        pool = Pool()\n        Cache = pool.get('ir.avatar.cache')\n        caches = [c for a in avatars for c in a.cache]\n        Cache.delete(caches)\n\n\nclass AvatarCache(ImageMixin, ModelSQL):\n    \"Avatar Cache\"\n    __name__ = 'ir.avatar.cache'\n\n    avatar = fields.Many2One(\n        'ir.avatar', \"Avatar\", required=True, ondelete='CASCADE')\n    size = fields.Integer(\n        \"Size\", required=True,\n        domain=[\n            ('size', '>', 0),\n            ('size', '<=', 2048),\n            ])\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        t = cls.__table__()\n        cls._sql_constraints = [\n            ('size_unique', Unique(t, t.avatar, t.size),\n                'ir.msg_avatar_size_unique'),\n            ]\n        cls._order.append(('size', 'ASC'))\n\n\ndef generate(size, string):\n    if not PIL:\n        return\n\n    def background_color(string):\n        random = Random(string)\n        r = v = b = 255\n        # Skip too bright color\n        while r + v + b > 255 * 2:\n            r = random.randint(0, 255)\n            v = random.randint(0, 255)\n            b = random.randint(0, 255)\n        return r, v, b\n\n    try:\n        font = ImageFont.truetype(FONT, size=int(0.65 * size))\n    except ImportError:\n        return\n    white = (255, 255, 255)\n    image = Image.new('RGB', (size, size), background_color(string))\n    draw = ImageDraw.Draw(image)\n    letter = string[0].upper() if string else ''\n    draw.text(\n        (size / 2, size / 2), letter, fill=white, font=font, anchor='mm')\n    data = io.BytesIO()\n    image.save(data, format='jpeg', optimize=True)\n    return data.getvalue()\n"
  },
  {
    "path": "trytond/ir/cache.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.model import ModelSQL, fields\n\n\nclass Cache(ModelSQL):\n    \"Cache\"\n    __name__ = 'ir.cache'\n    name = fields.Char('Name', required=True)\n    timestamp = fields.Timestamp(\"Timestamp\")\n"
  },
  {
    "path": "trytond/ir/calendar_.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.cache import Cache\nfrom trytond.model import ModelSQL, Unique, fields\nfrom trytond.rpc import RPC\nfrom trytond.transaction import Transaction\n\n\nclass _Calendar(ModelSQL):\n    _order_name = 'index'\n    index = fields.Integer(\"Index\", required=True)\n    name = fields.Char(\"Name\", required=True, translate=True)\n    abbreviation = fields.Char(\"Abbreviation\", required=True, translate=True)\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        t = cls.__table__()\n        cls.__rpc__.update({\n                'read': RPC(),\n                'search': RPC(),\n                'search_count': RPC(),\n                'search_read': RPC(),\n                })\n        cls.index.domain = [\n            ('index', '>=', cls._min_index),\n            ('index', '<=', cls._max_index),\n            ]\n        cls._order = [('index', 'ASC')]\n        cls._sql_constraints = [\n            ('index_unique', Unique(t, t.index),\n                \"The index must by unique.\")\n            ]\n\n    @classmethod\n    def locale(cls, language=None, field='name'):\n        transaction = Transaction()\n        if language is None:\n            language = transaction.language\n        elif isinstance(language, ModelSQL):\n            language = language.code\n        key = (language, field)\n        result = cls._cache_locale.get(key)\n        if not result:\n            with transaction.set_context(language=language):\n                records = cls.search([])\n            result = [None] * cls._min_index\n            result += [getattr(r, field) for r in records]\n            cls._cache_locale.set(key, result)\n        return result\n\n\nclass Month(_Calendar):\n    \"Month\"\n    __name__ = 'ir.calendar.month'\n    _min_index = 1\n    _max_index = 12\n    _cache_locale = Cache('ir.calendar.month')\n\n\nclass Day(_Calendar):\n    \"Day\"\n    __name__ = 'ir.calendar.day'\n    _min_index = 0\n    _max_index = 6\n    _cache_locale = Cache('ir.calendar.day')\n"
  },
  {
    "path": "trytond/ir/calendar_.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data grouped=\"1\">\n        <record model=\"ir.calendar.month\" id=\"January\">\n            <field name=\"index\" eval=\"1\"/>\n            <field name=\"name\">January</field>\n            <field name=\"abbreviation\">Jan</field>\n        </record>\n        <record model=\"ir.calendar.month\" id=\"February\">\n            <field name=\"index\" eval=\"2\"/>\n            <field name=\"name\">February</field>\n            <field name=\"abbreviation\">Feb</field>\n        </record>\n        <record model=\"ir.calendar.month\" id=\"March\">\n            <field name=\"index\" eval=\"3\"/>\n            <field name=\"name\">March</field>\n            <field name=\"abbreviation\">Mar</field>\n        </record>\n        <record model=\"ir.calendar.month\" id=\"April\">\n            <field name=\"index\" eval=\"4\"/>\n            <field name=\"name\">April</field>\n            <field name=\"abbreviation\">Apr</field>\n        </record>\n        <record model=\"ir.calendar.month\" id=\"May\">\n            <field name=\"index\" eval=\"5\"/>\n            <field name=\"name\">May</field>\n            <field name=\"abbreviation\">May</field>\n        </record>\n        <record model=\"ir.calendar.month\" id=\"June\">\n            <field name=\"index\" eval=\"6\"/>\n            <field name=\"name\">June</field>\n            <field name=\"abbreviation\">Jun</field>\n        </record>\n        <record model=\"ir.calendar.month\" id=\"July\">\n            <field name=\"index\" eval=\"7\"/>\n            <field name=\"name\">July</field>\n            <field name=\"abbreviation\">Jul</field>\n        </record>\n        <record model=\"ir.calendar.month\" id=\"August\">\n            <field name=\"index\" eval=\"8\"/>\n            <field name=\"name\">August</field>\n            <field name=\"abbreviation\">Aug</field>\n        </record>\n        <record model=\"ir.calendar.month\" id=\"September\">\n            <field name=\"index\" eval=\"9\"/>\n            <field name=\"name\">September</field>\n            <field name=\"abbreviation\">Sep</field>\n        </record>\n        <record model=\"ir.calendar.month\" id=\"October\">\n            <field name=\"index\" eval=\"10\"/>\n            <field name=\"name\">October</field>\n            <field name=\"abbreviation\">Oct</field>\n        </record>\n        <record model=\"ir.calendar.month\" id=\"November\">\n            <field name=\"index\" eval=\"11\"/>\n            <field name=\"name\">November</field>\n            <field name=\"abbreviation\">Nov</field>\n        </record>\n        <record model=\"ir.calendar.month\" id=\"December\">\n            <field name=\"index\" eval=\"12\"/>\n            <field name=\"name\">December</field>\n            <field name=\"abbreviation\">Dec</field>\n        </record>\n\n        <record model=\"ir.calendar.day\" id=\"Monday\">\n            <field name=\"index\" eval=\"0\"/>\n            <field name=\"name\">Monday</field>\n            <field name=\"abbreviation\">Mon</field>\n        </record>\n        <record model=\"ir.calendar.day\" id=\"Tuesday\">\n            <field name=\"index\" eval=\"1\"/>\n            <field name=\"name\">Tuesday</field>\n            <field name=\"abbreviation\">Tue</field>\n        </record>\n        <record model=\"ir.calendar.day\" id=\"Wednesday\">\n            <field name=\"index\" eval=\"2\"/>\n            <field name=\"name\">Wednesday</field>\n            <field name=\"abbreviation\">Wed</field>\n        </record>\n        <record model=\"ir.calendar.day\" id=\"Thursday\">\n            <field name=\"index\" eval=\"3\"/>\n            <field name=\"name\">Thursday</field>\n            <field name=\"abbreviation\">Thu</field>\n        </record>\n        <record model=\"ir.calendar.day\" id=\"Friday\">\n            <field name=\"index\" eval=\"4\"/>\n            <field name=\"name\">Friday</field>\n            <field name=\"abbreviation\">Fri</field>\n        </record>\n        <record model=\"ir.calendar.day\" id=\"Saturday\">\n            <field name=\"index\" eval=\"5\"/>\n            <field name=\"name\">Saturday</field>\n            <field name=\"abbreviation\">Sat</field>\n        </record>\n        <record model=\"ir.calendar.day\" id=\"Sunday\">\n            <field name=\"index\" eval=\"6\"/>\n            <field name=\"name\">Sunday</field>\n            <field name=\"abbreviation\">Sun</field>\n        </record>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/configuration.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.cache import Cache\nfrom trytond.config import config\nfrom trytond.model import ModelSingleton, ModelSQL, fields\n\n\nclass Configuration(ModelSingleton, ModelSQL):\n    'Configuration'\n    __name__ = 'ir.configuration'\n    language = fields.Char('language')\n    hostname = fields.Char(\"Hostname\", strip=False)\n    _get_language_cache = Cache('ir_configuration.get_language')\n\n    @staticmethod\n    def default_language():\n        return config.get('database', 'language')\n\n    @classmethod\n    def get_language(cls):\n        language = cls._get_language_cache.get(None)\n        if language is not None:\n            return language\n        language = cls(1).language\n        if not language:\n            language = config.get('database', 'language')\n        cls._get_language_cache.set(None, language)\n        return language\n\n    def check(self):\n        \"Check configuration coherence on pool initialisation\"\n        pass\n\n    @classmethod\n    def create(cls, vlist):\n        records = super().create(vlist)\n        cls._get_language_cache.clear()\n        return records\n\n    @classmethod\n    def write(cls, *args):\n        super().write(*args)\n        cls._get_language_cache.clear()\n\n    @classmethod\n    def delete(cls, records):\n        super().delete(records)\n        cls._get_language_cache.clear()\n"
  },
  {
    "path": "trytond/ir/cron.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport logging\nimport time\n\nfrom dateutil.relativedelta import relativedelta\n\nfrom trytond import backend\nfrom trytond.config import config\nfrom trytond.exceptions import UserError, UserWarning\nfrom trytond.model import (\n    DeactivableMixin, Index, ModelSQL, ModelView, dualmethod, fields)\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval\nfrom trytond.status import processing\nfrom trytond.tools import timezone as tz\nfrom trytond.transaction import Transaction\nfrom trytond.worker import run_task\n\nlogger = logging.getLogger(__name__)\n\n\nclass Cron(DeactivableMixin, ModelSQL, ModelView):\n    \"Cron\"\n    __name__ = \"ir.cron\"\n    interval_number = fields.Integer('Interval Number', required=True)\n    interval_type = fields.Selection([\n            ('minutes', 'Minutes'),\n            ('hours', 'Hours'),\n            ('days', 'Days'),\n            ('weeks', 'Weeks'),\n            ('months', 'Months'),\n            ], \"Interval Type\", sort=False, required=True)\n    minute = fields.Integer(\"Minute\",\n        domain=['OR',\n            ('minute', '=', None),\n            [('minute', '>=', 0), ('minute', '<=', 59)],\n            ],\n        states={\n            'invisible': Eval('interval_type').in_(['minutes']),\n            },\n        depends=['interval_type'])\n    hour = fields.Integer(\"Hour\",\n        domain=['OR',\n            ('hour', '=', None),\n            [('hour', '>=', 0), ('hour', '<=', 23)],\n            ],\n        states={\n            'invisible': Eval('interval_type').in_(['minutes', 'hours']),\n            },\n        depends=['interval_type'])\n    weekday = fields.Many2One(\n        'ir.calendar.day', \"Day of Week\",\n        states={\n            'invisible': Eval('interval_type').in_(\n                ['minutes', 'hours', 'days']),\n            },\n        depends=['interval_type'])\n    day = fields.Integer(\"Day\",\n        domain=['OR',\n            ('day', '=', None),\n            ('day', '>=', 0),\n            ],\n        states={\n            'invisible': Eval('interval_type').in_(\n                ['minutes', 'hours', 'days', 'weeks']),\n            },\n        depends=['interval_type'])\n    timezone = fields.Function(fields.Char(\"Timezone\"), 'get_timezone')\n\n    next_call = fields.DateTime(\"Next Call\")\n    method = fields.Selection([\n            ('ir.trigger|trigger_time', \"Run On Time Triggers\"),\n            ('ir.queue|clean', \"Clean Task Queue\"),\n            ('ir.error|clean', \"Clean Errors\"),\n            ], \"Method\", required=True)\n\n    @classmethod\n    def __setup__(cls):\n        super(Cron, cls).__setup__()\n        table = cls.__table__()\n\n        cls._buttons.update({\n                'run_once': {\n                    'icon': 'tryton-launch',\n                    },\n                })\n        cls._sql_indexes.add(Index(table, (table.next_call, Index.Range())))\n\n    @classmethod\n    def __register__(cls, module_name):\n        super().__register__(module_name)\n\n        table_h = cls.__table_handler__(module_name)\n\n        # Migration from 5.0: remove fields\n        for column in ['name', 'user', 'request_user', 'number_calls',\n                'repeat_missed', 'model', 'function', 'args']:\n            table_h.drop_column(column)\n\n        # Migration from 5.0: remove required on next_call\n        table_h.not_null_action('next_call', 'remove')\n\n    def get_timezone(self, name):\n        return tz.SERVER.key\n\n    @staticmethod\n    def check_xml_record(crons, values):\n        return True\n\n    @classmethod\n    def view_attributes(cls):\n        return [(\n                '//label[@id=\"time_label\"]', 'states', {\n                    'invisible': Eval('interval_type') == 'minutes',\n                }),\n            ]\n\n    def compute_next_call(self, now):\n        return (now.replace(tzinfo=tz.UTC).astimezone(tz.SERVER)\n            + relativedelta(**{self.interval_type: self.interval_number})\n            + relativedelta(\n                microsecond=0,\n                second=0,\n                minute=(\n                    self.minute\n                    if self.interval_type != 'minutes'\n                    else None),\n                hour=(\n                    self.hour\n                    if self.interval_type not in {'minutes', 'hours'}\n                    else None),\n                day=(\n                    self.day\n                    if self.interval_type not in {\n                        'minutes', 'hours', 'days', 'weeks'}\n                    else None),\n                weekday=(\n                    int(self.weekday.index)\n                    if self.weekday\n                    and self.interval_type not in {'minutes', 'hours', 'days'}\n                    else None))).astimezone(tz.UTC).replace(tzinfo=None)\n\n    @dualmethod\n    @ModelView.button\n    def run_once(cls, crons):\n        pool = Pool()\n        for cron in crons:\n            model, method = cron.method.split('|')\n            Model = pool.get(model)\n            getattr(Model, method)()\n\n    @classmethod\n    def run(cls, db_name):\n        transaction = Transaction()\n        logger.info('cron started for \"%s\"', db_name)\n        now = datetime.datetime.now()\n        retry = config.getint('database', 'retry')\n        with transaction.start(db_name, 0, context={'_skip_warnings': True}):\n            pool = Pool()\n            Error = pool.get('ir.error')\n            cls.lock()\n            crons = cls.search(['OR',\n                    ('next_call', '<=', now),\n                    ('next_call', '=', None),\n                    ])\n\n            for cron in crons:\n                def duration():\n                    return (time.monotonic() - started) * 1000\n                started = time.monotonic()\n                name = '<Cron %s@%s %s>' % (cron.id, db_name, cron.method)\n                for count in range(retry, -1, -1):\n                    if count != retry:\n                        time.sleep(0.02 * (retry - count))\n                    try:\n                        with processing(name), \\\n                                transaction.new_transaction() as cron_trans:\n                            cron.run_once()\n                            cron_trans.commit()\n                    except Exception as e:\n                        if (isinstance(e, backend.DatabaseOperationalError)\n                                and count):\n                            logger.debug(\"Retry: %i\", retry - count + 1)\n                            continue\n                        if isinstance(e, (UserError, UserWarning)):\n                            Error.log(cron, e)\n                            logger.info(\n                                \"%s failed after %i ms\", name, duration())\n                        else:\n                            logger.exception(\n                                \"%s failed after %i ms\", name, duration())\n                    cron.next_call = cron.compute_next_call(now)\n                    cron.save()\n                    break\n                logger.info(\"%s in %i ms\", name, duration())\n        while transaction.tasks:\n            task_id = transaction.tasks.pop()\n            run_task(db_name, task_id)\n        logger.info('cron finished for \"%s\"', db_name)\n"
  },
  {
    "path": "trytond/ir/cron.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <menuitem\n            name=\"Scheduler\"\n            parent=\"menu_administration\"\n            sequence=\"50\"\n            id=\"menu_scheduler\"/>\n\n        <record model=\"ir.ui.view\" id=\"cron_view_tree\">\n            <field name=\"model\">ir.cron</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">cron_list</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"cron_view_form\">\n            <field name=\"model\">ir.cron</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">cron_form</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_cron_form\">\n            <field name=\"name\">Actions</field>\n            <field name=\"res_model\">ir.cron</field>\n            <field name=\"context\"></field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_cron_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"cron_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_cron_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_cron_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"cron_view_form\"/>\n            <field name=\"act_window\" ref=\"act_cron_form\"/>\n        </record>\n        <menuitem\n            parent=\"ir.menu_scheduler\"\n            action=\"act_cron_form\"\n            sequence=\"10\"\n            id=\"menu_cron_form\"/>\n\n        <record model=\"ir.model.button\" id=\"cron_run_once_button\">\n            <field name=\"name\">run_once</field>\n            <field name=\"string\">Run Once</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.cron')]\"/>\n        </record>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/date.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\n\nfrom trytond.model import Model\nfrom trytond.rpc import RPC\n\n\nclass Date(Model):\n    'Date'\n    __name__ = 'ir.date'\n\n    @classmethod\n    def __setup__(cls):\n        super(Date, cls).__setup__()\n        cls.__rpc__.update({\n                'today': RPC(),\n                })\n\n    @staticmethod\n    def today(timezone=None):\n        '''\n        Return the current date\n        '''\n        return datetime.datetime.now(timezone).date()\n"
  },
  {
    "path": "trytond/ir/email.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <record model=\"ir.ui.view\" id=\"email_view_form\">\n            <field name=\"model\">ir.email</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">email_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"email_view_list\">\n            <field name=\"model\">ir.email</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">email_list</field>\n        </record>\n\n        <record model=\"ir.action.act_window\" id=\"act_email_form\">\n            <field name=\"name\">E-mails</field>\n            <field name=\"res_model\">ir.email</field>\n        </record>\n        <record model=\"ir.action.act_window.view\" id=\"act_email_form_view1\">\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"view\" ref=\"email_view_list\"/>\n            <field name=\"act_window\" ref=\"act_email_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\" id=\"act_email_form_view2\">\n            <field name=\"sequence\" eval=\"20\"/>\n            <field name=\"view\" ref=\"email_view_form\"/>\n            <field name=\"act_window\" ref=\"act_email_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_models\"\n            action=\"act_email_form\"\n            sequence=\"50\"\n            id=\"menu_email_form\"/>\n\n        <record model=\"ir.model.access\" id=\"access_email\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.email')]\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n\n        <record model=\"ir.action.act_window\" id=\"act_email_form_relate\">\n            <field name=\"name\">E-mail Archives</field>\n            <field name=\"res_model\">ir.email</field>\n            <field\n                name=\"domain\"\n                eval=\"[If(Eval('active_ids', []) == [Eval('active_id')], ('resource', '=', [Eval('active_model'), Eval('active_id')]), ('resource.id', 'in', Eval('active_ids'), Eval('active_model')))]\"\n                pyson=\"1\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\" id=\"act_email_form_relate_view1\">\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"view\" ref=\"email_view_list\"/>\n            <field name=\"act_window\" ref=\"act_email_form_relate\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\" id=\"act_email_form_relate_view2\">\n            <field name=\"sequence\" eval=\"20\"/>\n            <field name=\"view\" ref=\"email_view_form\"/>\n            <field name=\"act_window\" ref=\"act_email_form_relate\"/>\n        </record>\n        <record model=\"ir.action.keyword\" id=\"act_email_form_relate_keyword1\">\n            <field name=\"keyword\">form_relate</field>\n            <field name=\"action\" ref=\"act_email_form_relate\"/>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"email_template_view_form\">\n            <field name=\"model\">ir.email.template</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">email_template_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"email_template_view_list\">\n            <field name=\"model\">ir.email.template</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">email_template_list</field>\n        </record>\n\n        <record model=\"ir.action.act_window\" id=\"act_email_template_form\">\n            <field name=\"name\">E-mail Templates</field>\n            <field name=\"res_model\">ir.email.template</field>\n        </record>\n        <record model=\"ir.action.act_window.view\" id=\"act_email_template_form_view1\">\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"view\" ref=\"email_template_view_list\"/>\n            <field name=\"act_window\" ref=\"act_email_template_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\" id=\"act_email_template_form_view2\">\n            <field name=\"sequence\" eval=\"20\"/>\n            <field name=\"view\" ref=\"email_template_view_form\"/>\n            <field name=\"act_window\" ref=\"act_email_template_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_action\"\n            action=\"act_email_template_form\"\n            sequence=\"50\"\n            id=\"menu_email_template_form\"/>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/email_.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport heapq\nimport mimetypes\nimport re\nfrom email.encoders import encode_base64\nfrom email.header import Header\nfrom email.mime.application import MIMEApplication\nfrom email.mime.multipart import MIMEMultipart\nfrom email.mime.nonmultipart import MIMENonMultipart\nfrom email.mime.text import MIMEText\nfrom email.utils import formataddr, getaddresses\n\ntry:\n    import html2text\nexcept ImportError:\n    html2text = None\nfrom genshi.template import TextTemplate\n\nfrom trytond.config import config\nfrom trytond.i18n import gettext\nfrom trytond.model import EvalEnvironment, ModelSQL, ModelView, fields\nfrom trytond.model.exceptions import AccessError, ValidationError\nfrom trytond.pool import Pool\nfrom trytond.pyson import Bool, Eval, PYSONDecoder\nfrom trytond.report import Report\nfrom trytond.rpc import RPC\nfrom trytond.sendmail import SMTPDataManager, sendmail_transactional\nfrom trytond.tools import escape_wildcard\nfrom trytond.tools.email_ import set_from_header\nfrom trytond.tools.string_ import StringMatcher\nfrom trytond.transaction import Transaction\n\nfrom .resource import ResourceAccessMixin\n\nHTML_EMAIL = \"\"\"<!DOCTYPE html>\n<html>\n<head><title>%(subject)s</title></head>\n<body>%(body)s<br/>\n<hr style=\"width: 2em; text-align: start; display: inline-block\"/><br/>\n%(signature)s</body>\n</html>\"\"\"\nspecialsre = re.compile(r'[][\\\\()<>@,:;\".]')\nescapesre = re.compile(r'[\\\\\"]')\n\n\nclass EmailTemplateError(ValidationError):\n    pass\n\n\ndef _get_emails(value):\n    \"Return list of email from the comma separated list\"\n    return [e for n, e in getaddresses([value]) if e]\n\n\ndef _formataddr(pair):\n    \"Format address without encoding\"\n    name, address = pair\n    address.encode('ascii')\n    if name:\n        quotes = ''\n        if specialsre.search(name):\n            quotes = '\"'\n        name = escapesre.sub(r'\\\\\\g<0>', name)\n        return '%s%s%s <%s>' % (quotes, name, quotes, address)\n    return address\n\n\nclass Email(ResourceAccessMixin, ModelSQL, ModelView):\n    \"Email\"\n    __name__ = 'ir.email'\n\n    user = fields.Function(fields.Char(\"User\"), 'get_user')\n    at = fields.Function(fields.DateTime(\"At\"), 'get_at')\n    recipients = fields.Char(\"Recipients\", readonly=True)\n    recipients_secondary = fields.Char(\"Secondary Recipients\", readonly=True)\n    recipients_hidden = fields.Char(\"Hidden Recipients\", readonly=True)\n    addresses = fields.One2Many(\n        'ir.email.address', 'email', \"Addresses\", readonly=True)\n    subject = fields.Char(\"Subject\", readonly=True)\n    body = fields.Text(\"Body\", readonly=True)\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        cls._order.insert(0, ('create_date', 'DESC'))\n        cls.__rpc__.update({\n                'send': RPC(readonly=False, result=int),\n                'complete': RPC(check_access=False),\n                })\n        del cls.__rpc__['create']\n\n    def get_user(self, name):\n        return self.create_uid.rec_name\n\n    def get_at(self, name):\n        return self.create_date.replace(microsecond=0)\n\n    @classmethod\n    def send(cls, to='', cc='', bcc='', subject='', body='',\n            files=None, record=None, reports=None, attachments=None):\n        pool = Pool()\n        User = pool.get('res.user')\n        ActionReport = pool.get('ir.action.report')\n        Attachment = pool.get('ir.attachment')\n        transaction = Transaction()\n        user = User(transaction.user)\n\n        Model = pool.get(record[0])\n        record = Model(record[1])\n\n        body_html = HTML_EMAIL % {\n            'subject': subject,\n            'body': body,\n            'signature': user.signature or '',\n            }\n        content = MIMEMultipart('alternative')\n        if html2text:\n            body_text = HTML_EMAIL % {\n                'subject': subject,\n                'body': body,\n                'signature': '',\n                }\n            converter = html2text.HTML2Text()\n            body_text = converter.handle(body_text)\n            if user.signature:\n                body_text += '\\n-- \\n' + converter.handle(user.signature)\n            part = MIMEText(body_text, 'plain', _charset='utf-8')\n            content.attach(part)\n        part = MIMEText(body_html, 'html', _charset='utf-8')\n        content.attach(part)\n        if files or reports or attachments:\n            msg = MIMEMultipart('mixed')\n            msg.attach(content)\n            if files is None:\n                files = []\n            else:\n                files = list(files)\n\n            for report_id in (reports or []):\n                report = ActionReport(report_id)\n                Report = pool.get(report.report_name, type='report')\n                ext, content, _, title = Report.execute(\n                    [record.id], {\n                        'action_id': report.id,\n                        })\n                name = '%s.%s' % (title, ext)\n                if isinstance(content, str):\n                    content = content.encode('utf-8')\n                files.append((name, content))\n            if attachments:\n                files += [\n                    (a.name, a.data) for a in Attachment.browse(attachments)]\n            for name, data in files:\n                mimetype, _ = mimetypes.guess_type(name)\n                if mimetype:\n                    attachment = MIMENonMultipart(*mimetype.split('/'))\n                    attachment.set_payload(data)\n                    encode_base64(attachment)\n                else:\n                    attachment = MIMEApplication(data)\n                attachment.add_header(\n                    'Content-Disposition', 'attachment',\n                    filename=('utf-8', '', name))\n                msg.attach(attachment)\n        else:\n            msg = content\n        from_ = config.get('email', 'from')\n        set_from_header(msg, from_, user.email or from_)\n        msg['To'] = ', '.join(formataddr(a) for a in getaddresses([to]))\n        msg['Cc'] = ', '.join(formataddr(a) for a in getaddresses([cc]))\n        msg['Subject'] = Header(subject, 'utf-8')\n\n        to_addrs = list(filter(None, map(\n                    str.strip,\n                    _get_emails(to) + _get_emails(cc) + _get_emails(bcc))))\n        sendmail_transactional(\n            from_, to_addrs, msg, datamanager=SMTPDataManager(strict=True))\n\n        email = cls(\n            recipients=to,\n            recipients_secondary=cc,\n            recipients_hidden=bcc,\n            addresses=[{'address': a} for a in to_addrs],\n            subject=subject,\n            body=body,\n            resource=record)\n        email.save()\n        with Transaction().set_context(_check_access=False):\n            attachments_ = []\n            for name, data in files:\n                attachments_.append(\n                    Attachment(resource=email, name=name, data=data))\n            Attachment.save(attachments_)\n        return email\n\n    @classmethod\n    def complete(cls, text, limit):\n        limit = int(limit)\n        if not limit > 0:\n            raise ValueError('limit must be > 0: %r' % (limit,))\n        emails = getaddresses([text])\n        if not emails:\n            return []\n        name, email = map(str.strip, emails[-1])\n        if not name and not email:\n            return []\n        s = StringMatcher()\n        try:\n            s.set_seq2(_formataddr((name, email)))\n        except UnicodeEncodeError:\n            return []\n\n        def generate(name, email):\n            for name, email in cls._match(name, email):\n                try:\n                    address = _formataddr((name, email))\n                except UnicodeEncodeError:\n                    continue\n                s.set_seq1(address)\n                yield (\n                    s.ratio(), address,\n                    ', '.join(map(_formataddr, emails[:-1] + [(name, email)])))\n        return heapq.nlargest(limit, generate(name, email))\n\n    @classmethod\n    def _match(cls, name, email):\n        pool = Pool()\n        User = pool.get('res.user')\n        domain = ['OR']\n        for field in ['name', 'login', 'email']:\n            for value in [name, email]:\n                if value and len(value) >= 3:\n                    domain.append(\n                        (field, 'ilike', '%' + escape_wildcard(value) + '%'))\n        for user in User.search([\n                    ('email', '!=', ''),\n                    domain,\n                    ], order=[]):\n            yield user.name, user.email\n\n\nclass EmailAddress(ModelSQL):\n    \"Email Address\"\n    __name__ = 'ir.email.address'\n\n    email = fields.Many2One(\n        'ir.email', \"E-mail\", required=True, ondelete='CASCADE')\n    address = fields.Char(\"Address\", required=True)\n\n\nclass EmailTemplate(ModelSQL, ModelView):\n    \"Email Template\"\n    __name__ = 'ir.email.template'\n\n    model = fields.Many2One('ir.model', \"Model\", required=True)\n    name = fields.Char(\"Name\", required=True, translate=True)\n    recipients = fields.Many2One(\n        'ir.model.field', \"Recipients\",\n        states={\n            'invisible': Bool(Eval('recipients_pyson')),\n            },\n        depends=['recipients_pyson'],\n        help=\"The field that contains the recipient(s).\")\n    recipients_pyson = fields.Char(\n        \"Recipients\",\n        states={\n            'invisible': Bool(Eval('recipients')),\n            },\n        depends=['recipients'],\n        help=\"A PYSON expression that generates a list of recipients \"\n        'with the record represented by \"self\".')\n    recipients_secondary = fields.Many2One(\n        'ir.model.field', \"Secondary Recipients\",\n        states={\n            'invisible': Bool(Eval('recipients_secondary_pyson')),\n            },\n        depends=['recipients_secondary_pyson'],\n        help=\"The field that contains the secondary recipient(s).\")\n    recipients_secondary_pyson = fields.Char(\n        \"Secondary Recipients\",\n        states={\n            'invisible': Bool(Eval('recipients_secondary')),\n            },\n        depends=['recipients_secondary'],\n        help=\"A PYSON expression that generates a list \"\n        'of secondary recipients with the record represented by \"self\".')\n    recipients_hidden = fields.Many2One(\n        'ir.model.field', \"Hidden Recipients\",\n        states={\n            'invisible': Bool(Eval('recipients_hidden_pyson')),\n            },\n        depends=['recipients_hidden_pyson'],\n        help=\"The field that contains the secondary recipient(s).\")\n    recipients_hidden_pyson = fields.Char(\n        \"Hidden Recipients\",\n        states={\n            'invisible': Bool(Eval('recipients_hidden')),\n            },\n        depends=['recipients_hidden'],\n        help=\"A PYSON expression that generates a list of hidden recipients \"\n        'with the record represented by \"self\".')\n    subject = fields.Char(\"Subject\", translate=True)\n    body = fields.Text(\"Body\", translate=True)\n    reports = fields.Many2Many(\n        'ir.email.template-ir.action.report', 'template', 'report',\n        \"Reports\",\n        domain=[\n            ('model', '=', Eval('model_name')),\n            ],\n        depends=['model_name'])\n\n    model_name = fields.Function(\n        fields.Char(\"Model Name\"), 'on_change_with_model_name')\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        for field in [\n                'recipients',\n                'recipients_secondary',\n                'recipients_hidden',\n                ]:\n            field = getattr(cls, field)\n            field.domain = [\n                ('model', '=', Eval('model')),\n                ['OR',\n                    ('relation', 'in', cls.email_models()),\n                    [\n                        ('model.model', 'in', cls.email_models()),\n                        ('name', '=', 'id'),\n                        ],\n                    ]\n                ]\n            field.depends.add('model')\n        cls.__rpc__.update({\n                'get': RPC(instantiate=0),\n                'get_default': RPC(),\n                })\n\n    @fields.depends('model')\n    def on_change_with_model_name(self, name=None):\n        if self.model:\n            return self.model.model\n\n    @classmethod\n    def validate_fields(cls, templates, field_names):\n        super().validate_fields(templates, field_names)\n        cls.check_subject(templates, field_names)\n        cls.check_body(templates, field_names)\n        cls.check_fields_pyson(templates, field_names)\n\n    @classmethod\n    def check_subject(cls, templates, field_names=None):\n        if field_names and 'subject' not in field_names:\n            return\n        for template in templates:\n            if not template.subject:\n                continue\n            try:\n                TextTemplate(template.subject)\n            except Exception as exception:\n                raise EmailTemplateError(gettext(\n                        'ir.msg_email_template_invalid_subject',\n                        template=template.rec_name,\n                        exception=exception)) from exception\n\n    @classmethod\n    def check_body(self, templates, field_names=None):\n        if field_names and 'body' not in field_names:\n            return\n        for template in templates:\n            if not template.body:\n                continue\n            try:\n                TextTemplate(template.body)\n            except Exception as exception:\n                raise EmailTemplateError(gettext(\n                        'ir.msg_email_template_invalid_body',\n                        template=template.rec_name,\n                        exception=exception)) from exception\n\n    @classmethod\n    def check_fields_pyson(cls, templates, field_names=None):\n        pyson_fields = {\n            'recipients_pyson',\n            'recipients_secondary_pyson',\n            'recipients_hidden_pyson',\n            }\n        if field_names:\n            pyson_fields &= field_names\n        if not pyson_fields:\n            return\n        encoder = PYSONDecoder(noeval=True)\n        for template in templates:\n            for field in pyson_fields:\n                value = getattr(template, field)\n                if not value:\n                    continue\n                try:\n                    pyson = encoder.decode(value)\n                except Exception as exception:\n                    raise EmailTemplateError(\n                        gettext('ir.msg_email_template_invalid_field_pyson',\n                            template=template.rec_name,\n                            field=cls.__names__(field)['field'],\n                            exception=exception)) from exception\n                if not isinstance(pyson, list) and pyson.types() != {list}:\n                    raise EmailTemplateError(gettext(\n                            'ir.msg_email_template_invalid_field_pyson_type',\n                            template=template.rec_name,\n                            field=cls.__names__(field)['field'],\n                            ))\n\n    def get(self, record):\n        pool = Pool()\n        Model = pool.get(self.model.model)\n        record = Model(int(record))\n\n        values = {}\n        for attr, key in [\n                ('recipients', 'to'),\n                ('recipients_secondary', 'cc'),\n                ('recipients_hidden', 'bcc'),\n                ]:\n            field = getattr(self, attr)\n            try:\n                if field:\n                    if field.name == 'id':\n                        value = record\n                    else:\n                        value = getattr(record, field.name, None)\n                    if value:\n                        values[key] = self.get_addresses(value)\n                else:\n                    value = getattr(self, attr + '_pyson')\n                    if value:\n                        value = self.eval(record, value)\n                        if value:\n                            values[key] = self.get_addresses(value)\n            except AccessError:\n                continue\n\n        if self.subject:\n            try:\n                values['subject'] = (TextTemplate(self.subject)\n                    .generate(**self.get_context(record))\n                    .render())\n            except AccessError:\n                pass\n        if self.body:\n            try:\n                values['body'] = (TextTemplate(self.body)\n                    .generate(**self.get_context(record))\n                    .render())\n            except AccessError:\n                pass\n        if self.reports:\n            values['reports'] = [r.id for r in self.reports]\n        return values\n\n    def get_context(self, record):\n        pool = Pool()\n        User = pool.get('res.user')\n        return {\n            'context': Transaction().context,\n            'user': User(Transaction().user),\n            'record': record,\n            'format_date': Report.format_date,\n            'format_datetime': Report.format_datetime,\n            'format_timedelta': Report.format_timedelta,\n            'format_currency': Report.format_currency,\n            'format_number': Report.format_number,\n            }\n\n    def eval(self, record, pyson, _env=None):\n        'Evaluate the pyson with the record'\n        if _env is None:\n            env = {}\n        else:\n            env = _env.copy()\n        env['context'] = Transaction().context\n        env['self'] = EvalEnvironment(record, record.__class__)\n        return PYSONDecoder(env).decode(pyson)\n\n    @classmethod\n    def _get_default_exclude(cls, record):\n        return ['create_uid', 'write_uid']\n\n    @classmethod\n    def get_default(cls, model, record):\n        pool = Pool()\n        Field = pool.get('ir.model.field')\n        Model = pool.get(model)\n        record = Model(int(record))\n        values = {}\n\n        fields = Field.search([\n                ('model.model', '=', model),\n                ('name', 'not in', cls._get_default_exclude(record)),\n                ['OR',\n                    ('relation', 'in', cls.email_models()),\n                    [\n                        ('model.model', 'in', cls.email_models()),\n                        ('name', '=', 'id'),\n                        ],\n                    ],\n                ])\n        addresses = set()\n        for field in fields:\n            try:\n                if field.name == 'id':\n                    value = record\n                else:\n                    value = getattr(record, field.name)\n                addresses.update(cls.get_addresses(value))\n            except AccessError:\n                pass\n        values['to'] = list(addresses)\n\n        try:\n            values['subject'] = '%s: %s' % (\n                Model.__names__()['model'], record.rec_name)\n        except AccessError:\n            pass\n        return values\n\n    @classmethod\n    def email_models(cls):\n        return ['res.user']\n\n    @classmethod\n    def get_addresses(cls, value):\n        if isinstance(value, (list, tuple)):\n            addresses = (cls._get_address(v) for v in value)\n        else:\n            addresses = [cls._get_address(value)]\n        return [\n            _formataddr((name, email))\n            for name, email in filter(None, addresses)\n            if email]\n\n    @classmethod\n    def _get_address(cls, record):\n        pool = Pool()\n        User = pool.get('res.user')\n        if isinstance(record, str):\n            return (None, record)\n        elif isinstance(record, User) and record.email:\n            return (record.name, record.email)\n\n    @classmethod\n    def get_languages(cls, value):\n        pool = Pool()\n        Configuration = pool.get('ir.configuration')\n        Lang = pool.get('ir.lang')\n        if isinstance(value, (list, tuple)):\n            languagues = {cls._get_language(v) for v in value}\n        else:\n            languagues = {cls._get_language(value)}\n        languagues = list(filter(None, languagues))\n        if not languagues:\n            return Lang.search([\n                    ('code', '=', Configuration.get_language()),\n                    ], limit=1)\n        return languagues\n\n    @classmethod\n    def _get_language(cls, record):\n        pool = Pool()\n        User = pool.get('res.user')\n        if isinstance(record, User) and record.language:\n            return record.language\n\n\nclass EmailTemplate_Report(ModelSQL):\n    \"Email Template - Report\"\n    __name__ = 'ir.email.template-ir.action.report'\n\n    template = fields.Many2One(\n        'ir.email.template', \"Template\", required=True, ondelete='CASCADE')\n    report = fields.Many2One(\n        'ir.action.report', \"Report\", required=True, ondelete='CASCADE')\n"
  },
  {
    "path": "trytond/ir/error.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime as dt\nimport functools\nimport logging\n\nfrom trytond.config import config\nfrom trytond.exceptions import UserError, UserWarning\nfrom trytond.model import Index, ModelSQL, ModelView, Workflow, fields\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval\nfrom trytond.tools import firstline\nfrom trytond.transaction import Transaction\n\nlogger = logging.getLogger(__name__)\nclean_days = config.getint('error', 'clean_days', default=90)\n\n\ndef set_user(field):\n    def decorator(func):\n        @functools.wraps(func)\n        def wrapper(cls, records, *args, **kwargs):\n            result = func(cls, records, *args, **kwargs)\n            cls.write(\n                [r for r in records\n                    if not getattr(r, field)], {\n                    field: Transaction().user,\n                    })\n            return result\n        return wrapper\n    return decorator\n\n\ndef reset_user(*fields):\n    def decorator(func):\n        @functools.wraps(func)\n        def wrapper(cls, records, *args, **kwargs):\n            result = func(cls, records, *args, **kwargs)\n            cls.write(records, {f: None for f in fields})\n            return result\n        return wrapper\n    return decorator\n\n\nclass Error(Workflow, ModelView, ModelSQL):\n    \"Error\"\n    __name__ = 'ir.error'\n\n    origin = fields.Reference(\"Origin\", [\n            ('ir.cron', \"Action\"),\n            ('ir.queue', \"Task\"),\n            ], readonly=True)\n    origin_string = origin.translated('origin')\n    message = fields.Text(\"Message\", readonly=True)\n    description = fields.Text(\"Description\", readonly=True)\n    summary = fields.Function(fields.Char(\"Summary\"), 'on_change_with_summary')\n\n    processed_by = fields.Many2One(\n        'res.user', \"Processed by\",\n        states={\n            'readonly': Eval('state').in_(['processing', 'solved']),\n            },\n        depends=['state'])\n    solved_by = fields.Many2One(\n        'res.user', \"Solved by\",\n        states={\n            'readonly': Eval('state').in_(['solved']),\n            },\n        depends=['state'])\n\n    state = fields.Selection([\n            ('open', \"Open\"),\n            ('processing', \"Processing\"),\n            ('solved', \"Solved\"),\n            ], \"State\", readonly=True, sort=False)\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        table = cls.__table__()\n\n        cls._sql_indexes.add(\n            Index(\n                table,\n                (table.state, Index.Equality()),\n                where=table.state.in_(['open', 'processing'])))\n        cls._transitions |= {\n            ('open', 'processing'),\n            ('processing', 'solved'),\n            ('processing', 'open'),\n            }\n        cls._buttons.update({\n                'open': {\n                    'invisible': Eval('state') != 'processing',\n                    'depends': ['state'],\n                    },\n                'process': {\n                    'invisible': Eval('state') != 'open',\n                    'depends': ['state'],\n                    },\n                'solve': {\n                    'invisible': Eval('state') != 'processing',\n                    'depends': ['state'],\n                    },\n                })\n\n    @classmethod\n    def default_state(cls):\n        return 'open'\n\n    @fields.depends('message')\n    def on_change_with_summary(self, name=None):\n        return firstline(self.message or '')\n\n    def get_rec_name(self, name):\n        if self.origin:\n            return \"%s - %s\" % (self.origin_string, self.origin.rec_name)\n        return super().get_rec_name(name)\n\n    @classmethod\n    def log(cls, origin, exception):\n        try:\n            assert isinstance(exception, (UserError, UserWarning))\n            with Transaction().new_transaction(autocommit=True):\n                if not cls.search([\n                            ('origin', '=', str(origin)),\n                            ('message', '=', exception.message),\n                            ('description', '=', exception.description),\n                            ('state', '!=', 'solved'),\n                            ]):\n                    cls.create([{\n                                'origin': str(origin),\n                                'message': exception.message,\n                                'description': exception.description,\n                                }])\n        except Exception:\n            logger.critical(\n                \"failed to store exception %s of %s\", exception, origin,\n                exc_info=True)\n\n    @classmethod\n    def clean(cls, date=None):\n        if date is None:\n            date = (\n                dt.datetime.now() - dt.timedelta(days=clean_days))\n        errors = cls.search([('create_date', '<', date)])\n        cls.delete(errors)\n\n    @classmethod\n    @ModelView.button\n    @Workflow.transition('open')\n    @reset_user('processed_by')\n    def open(cls, errors):\n        pass\n\n    @classmethod\n    @ModelView.button\n    @Workflow.transition('processing')\n    @set_user('processed_by')\n    def process(cls, errors):\n        pass\n\n    @classmethod\n    @ModelView.button\n    @Workflow.transition('solved')\n    @set_user('solved_by')\n    def solve(cls, errors):\n        pool = Pool()\n        Cron = pool.get('ir.cron')\n        Queue = pool.get('ir.queue')\n        for error in errors:\n            if isinstance(error.origin, Cron):\n                Cron.__queue__.run_once([error.origin])\n            elif isinstance(error.origin, Queue):\n                task = error.origin\n                Queue.push(task.name, task.data)\n"
  },
  {
    "path": "trytond/ir/error.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <record model=\"ir.ui.view\" id=\"error_view_list\">\n            <field name=\"model\">ir.error</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">error_list</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"error_view_form\">\n            <field name=\"model\">ir.error</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">error_form</field>\n        </record>\n\n        <record model=\"ir.action.act_window\" id=\"act_error_form\">\n            <field name=\"name\">Errors</field>\n            <field name=\"res_model\">ir.error</field>\n        </record>\n        <record model=\"ir.action.act_window.view\" id=\"act_error_form_view1\">\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"view\" ref=\"error_view_list\"/>\n            <field name=\"act_window\" ref=\"act_error_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\" id=\"act_error_form_view2\">\n            <field name=\"sequence\" eval=\"20\"/>\n            <field name=\"view\" ref=\"error_view_form\"/>\n            <field name=\"act_window\" ref=\"act_error_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.domain\" id=\"act_error_form_domain_open\">\n            <field name=\"name\">Open</field>\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"domain\" eval=\"[('state', '=', 'open')]\" pyson=\"1\"/>\n            <field name=\"count\" eval=\"True\"/>\n            <field name=\"act_window\" ref=\"act_error_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.domain\" id=\"act_error_form_domain_processing\">\n            <field name=\"name\">Processing</field>\n            <field name=\"sequence\" eval=\"20\"/>\n            <field name=\"domain\" eval=\"[('state', '=', 'processing')]\" pyson=\"1\"/>\n            <field name=\"count\" eval=\"True\"/>\n            <field name=\"act_window\" ref=\"act_error_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.domain\" id=\"act_error_form_domain_all\">\n            <field name=\"name\">All</field>\n            <field name=\"sequence\" eval=\"9999\"/>\n            <field name=\"domain\"></field>\n            <field name=\"act_window\" ref=\"act_error_form\"/>\n        </record>\n\n        <menuitem\n            parent=\"ir.menu_scheduler\"\n            action=\"act_error_form\"\n            sequence=\"50\"\n            id=\"menu_error_form\"/>\n\n        <record model=\"ir.model.button\" id=\"error_open_button\">\n            <field name=\"name\">open</field>\n            <field name=\"string\">Open</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.error')]\"/>\n        </record>\n\n        <record model=\"ir.model.button\" id=\"error_process_button\">\n            <field name=\"name\">process</field>\n            <field name=\"string\">Process</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.error')]\"/>\n        </record>\n\n        <record model=\"ir.model.button\" id=\"error_solve_button\">\n            <field name=\"name\">solve</field>\n            <field name=\"string\">Solve</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.error')]\"/>\n        </record>\n    </data>\n\n    <data noupdate=\"1\">\n        <record model=\"ir.cron\" id=\"cron_error_clean\">\n            <field name=\"method\">ir.error|clean</field>\n            <field name=\"interval_number\" eval=\"1\"/>\n            <field name=\"interval_type\">months</field>\n        </record>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/exceptions.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom .lang import DateError as LanguageDateError\nfrom .lang import DeleteDefaultError as LanguageDeleteDefaultError\nfrom .lang import GroupingError as LanguageGroupingError\nfrom .lang import TranslatableError as LanguageTranslatableError\nfrom .module import DeactivateDependencyError\nfrom .sequence import AffixError as SequenceAffixError\nfrom .sequence import MissingError as SequenceMissingError\nfrom .translation import OverriddenError as TranslationOverriddenError\nfrom .trigger import ConditionError as TriggerConditionError\n\n__all__ = [\n    DeactivateDependencyError,\n    LanguageDateError,\n    LanguageDeleteDefaultError,\n    LanguageGroupingError,\n    LanguageTranslatableError,\n    SequenceAffixError,\n    SequenceMissingError,\n    TranslationOverriddenError,\n    TriggerConditionError,\n    ]\n"
  },
  {
    "path": "trytond/ir/export.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\"Exports\"\nfrom trytond.model import ModelSQL, ModelView, fields\nfrom trytond.pool import Pool\nfrom trytond.rpc import RPC\n\n\nclass _ClearCache(ModelSQL):\n    @classmethod\n    def create(cls, vlist):\n        ModelView._view_toolbar_get_cache.clear()\n        return super().create(vlist)\n\n    @classmethod\n    def write(cls, *args):\n        ModelView._view_toolbar_get_cache.clear()\n        super().write(*args)\n\n    @classmethod\n    def delete(cls, records):\n        ModelView._view_toolbar_get_cache.clear()\n        super().delete(records)\n\n\nclass Export(_ClearCache, ModelSQL, ModelView):\n    \"Export\"\n    __name__ = \"ir.export\"\n    name = fields.Char('Name')\n    resource = fields.Char('Resource')\n    header = fields.Boolean(\n        \"Header\",\n        help=\"Check to include field names on the export.\")\n    export_fields = fields.One2Many('ir.export.line', 'export',\n       'Fields')\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        cls.__rpc__.update(\n            update=RPC(instantiate=0, readonly=False))\n\n    @classmethod\n    def default_header(cls):\n        return False\n\n    @classmethod\n    def update(cls, exports, fields):\n        pool = Pool()\n        Line = pool.get('ir.export.line')\n        to_delete = []\n        to_save = []\n        for export in exports:\n            to_delete.extend(export.export_fields)\n            to_save.extend(Line(export=export, name=f) for f in fields)\n        Line.delete(to_delete)\n        Line.save(to_save)\n\n\nclass ExportLine(_ClearCache, ModelSQL, ModelView):\n    \"Export line\"\n    __name__ = 'ir.export.line'\n    name = fields.Char('Name')\n    export = fields.Many2One('ir.export', 'Export', required=True,\n        ondelete='CASCADE')\n"
  },
  {
    "path": "trytond/ir/export.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <record model=\"ir.ui.view\" id=\"export_view_form\">\n            <field name=\"model\">ir.export</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">export_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"export_view_tree\">\n            <field name=\"model\">ir.export</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">export_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_export_form\">\n            <field name=\"name\">Exports</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">ir.export</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_export_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"export_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_export_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_export_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"export_view_form\"/>\n            <field name=\"act_window\" ref=\"act_export_form\"/>\n        </record>\n        <menuitem\n            parent=\"ir.menu_models\"\n            action=\"act_export_form\"\n            sequence=\"50\"\n            id=\"menu_export_form\"/>\n\n        <record model=\"ir.ui.view\" id=\"export_line_view_form\">\n            <field name=\"model\">ir.export.line</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">export_line_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"export_line_view_tree\">\n            <field name=\"model\">ir.export.line</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">export_line_list</field>\n        </record>\n\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/fonts/LICENSE",
    "content": "Copyright 2019 The Karla Project Authors (https://github.com/googlefonts/karla)\n\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\nThis license is copied below, and is also available with a FAQ at:\nhttps://scripts.sil.org/OFL\n\n\n-----------------------------------------------------------\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\n-----------------------------------------------------------\n\nPREAMBLE\nThe goals of the Open Font License (OFL) are to stimulate worldwide\ndevelopment of collaborative font projects, to support the font creation\nefforts of academic and linguistic communities, and to provide a free and\nopen framework in which fonts may be shared and improved in partnership\nwith others.\n\nThe OFL allows the licensed fonts to be used, studied, modified and\nredistributed freely as long as they are not sold by themselves. The\nfonts, including any derivative works, can be bundled, embedded, \nredistributed and/or sold with any software provided that any reserved\nnames are not used by derivative works. The fonts and derivatives,\nhowever, cannot be released under any other type of license. The\nrequirement for fonts to remain under this license does not apply\nto any document created using the fonts or their derivatives.\n\nDEFINITIONS\n\"Font Software\" refers to the set of files released by the Copyright\nHolder(s) under this license and clearly marked as such. This may\ninclude source files, build scripts and documentation.\n\n\"Reserved Font Name\" refers to any names specified as such after the\ncopyright statement(s).\n\n\"Original Version\" refers to the collection of Font Software components as\ndistributed by the Copyright Holder(s).\n\n\"Modified Version\" refers to any derivative made by adding to, deleting,\nor substituting -- in part or in whole -- any of the components of the\nOriginal Version, by changing formats or by porting the Font Software to a\nnew environment.\n\n\"Author\" refers to any designer, engineer, programmer, technical\nwriter or other person who contributed to the Font Software.\n\nPERMISSION & CONDITIONS\nPermission is hereby granted, free of charge, to any person obtaining\na copy of the Font Software, to use, study, copy, merge, embed, modify,\nredistribute, and sell modified and unmodified copies of the Font\nSoftware, subject to the following conditions:\n\n1) Neither the Font Software nor any of its individual components,\nin Original or Modified Versions, may be sold by itself.\n\n2) Original or Modified Versions of the Font Software may be bundled,\nredistributed and/or sold with any software, provided that each copy\ncontains the above copyright notice and this license. These can be\nincluded either as stand-alone text files, human-readable headers or\nin the appropriate machine-readable metadata fields within text or\nbinary files as long as those fields can be easily viewed by the user.\n\n3) No Modified Version of the Font Software may use the Reserved Font\nName(s) unless explicit written permission is granted by the corresponding\nCopyright Holder. This restriction only applies to the primary font name as\npresented to the users.\n\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\nSoftware shall not be used to promote, endorse or advertise any\nModified Version, except to acknowledge the contribution(s) of the\nCopyright Holder(s) and the Author(s) or with their explicit written\npermission.\n\n5) The Font Software, modified or unmodified, in part or in whole,\nmust be distributed entirely under this license, and must not be\ndistributed under any other license. The requirement for fonts to\nremain under this license does not apply to any document created\nusing the Font Software.\n\nTERMINATION\nThis license becomes null and void if any of the above conditions are\nnot met.\n\nDISCLAIMER\nTHE FONT SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\nOTHER DEALINGS IN THE FONT SOFTWARE.\n"
  },
  {
    "path": "trytond/ir/ir.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n\n        <!--\n        lang_en is defined here to be in translation lang selection\n        -->\n        <record model=\"ir.lang\" id=\"lang_en\">\n            <field name=\"code\">en</field>\n            <field name=\"name\">English</field>\n            <field name=\"date\">%m/%d/%Y</field>\n            <field name=\"am\">AM</field>\n            <field name=\"pm\">PM</field>\n            <field name=\"grouping\">[3, 3, 0]</field>\n            <field name=\"decimal_point\">.</field>\n            <field name=\"thousands_sep\">,</field>\n            <field name=\"mon_grouping\">[3, 3, 0]</field>\n            <field name=\"mon_decimal_point\">.</field>\n            <field name=\"mon_thousands_sep\">,</field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"True\"/>\n            <field name=\"n_cs_precedes\" eval=\"True\"/>\n            <field name=\"p_sep_by_space\" eval=\"False\"/>\n            <field name=\"n_sep_by_space\" eval=\"False\"/>\n        </record>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/lang.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport datetime\nfrom ast import literal_eval\nfrom decimal import Decimal\nfrom locale import CHAR_MAX\n\nfrom sql import Table\n\nfrom trytond.cache import Cache\nfrom trytond.exceptions import UserError\nfrom trytond.i18n import gettext\nfrom trytond.model import (\n    Check, DeactivableMixin, ModelSQL, ModelView, Unique, fields)\nfrom trytond.modules import create_graph, load_translations\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval\nfrom trytond.transaction import Transaction\nfrom trytond.wizard import Button, StateTransition, StateView, Wizard\n\nTransaction.cache_keys.add('translate_name')\n\n\nclass GroupingError(UserError):\n    pass\n\n\nclass DateError(UserError):\n    pass\n\n\nclass TranslatableError(UserError):\n    pass\n\n\nclass DeleteDefaultError(UserError):\n    pass\n\n\nclass Lang(DeactivableMixin, ModelSQL, ModelView):\n    \"Language\"\n    __name__ = \"ir.lang\"\n    name = fields.Char('Name', required=True, translate=True)\n    code = fields.Char('Code', required=True, help=\"RFC 4646 tag.\")\n    translatable = fields.Boolean('Translatable', readonly=True)\n    parent = fields.Char(\"Parent Code\", help=\"Code of the exceptional parent\")\n    direction = fields.Selection([\n            ('ltr', 'Left-to-right'),\n            ('rtl', 'Right-to-left'),\n            ], 'Direction', required=True)\n\n    # date\n    date = fields.Char(\"Date\", required=True, strip=False)\n\n    am = fields.Char(\"AM\", strip=False)\n    pm = fields.Char(\"PM\", strip=False)\n\n    # number\n    grouping = fields.Char('Grouping', required=True)\n    decimal_point = fields.Char(\n        \"Decimal Separator\", required=True, strip=False)\n    thousands_sep = fields.Char(\"Thousands Separator\", strip=False)\n\n    # monetary formatting\n    mon_grouping = fields.Char('Grouping', required=True)\n    mon_decimal_point = fields.Char(\n        \"Decimal Separator\", required=True, strip=False)\n    mon_thousands_sep = fields.Char('Thousands Separator')\n    p_sign_posn = fields.Integer('Positive Sign Position', required=True)\n    n_sign_posn = fields.Integer('Negative Sign Position', required=True)\n    positive_sign = fields.Char(\"Positive Sign\", strip=False)\n    negative_sign = fields.Char(\"Negative Sign\", strip=False)\n    p_cs_precedes = fields.Boolean('Positive Currency Symbol Precedes')\n    n_cs_precedes = fields.Boolean('Negative Currency Symbol Precedes')\n    p_sep_by_space = fields.Boolean('Positive Separate by Space')\n    n_sep_by_space = fields.Boolean('Negative Separate by Space')\n\n    pg_text_search = fields.Char(\n        \"PostgreSQL Text Search Configuration\", readonly=True)\n\n    _lang_cache = Cache('ir.lang')\n    _code_cache = Cache('ir.lang.code', context=False)\n\n    @classmethod\n    def __setup__(cls):\n        super(Lang, cls).__setup__()\n\n        table = cls.__table__()\n        cls._sql_constraints += [\n            ('code_unique', Unique(table, table.code),\n                'ir.msg_language_code_unique'),\n            ('check_decimal_point_thousands_sep',\n                Check(table, table.decimal_point != table.thousands_sep),\n                'decimal_point and thousands_sep must be different!'),\n            ]\n        cls._buttons.update({\n                'load_translations': {},\n                'unload_translations': {\n                    'invisible': ~Eval('translatable', False),\n                    },\n                })\n\n    @classmethod\n    def search_rec_name(cls, name, clause):\n        langs = cls.search([('code',) + tuple(clause[1:])], order=[])\n        if langs:\n            langs += cls.search([('name',) + tuple(clause[1:])], order=[])\n            return [('id', 'in', [l.id for l in langs])]\n        return [('name',) + tuple(clause[1:])]\n\n    @classmethod\n    def read(cls, ids, fields_names):\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        Config = pool.get('ir.configuration')\n        res = super(Lang, cls).read(ids, fields_names)\n        if (Transaction().context.get('translate_name')\n                and (not fields_names or 'name' in fields_names)):\n            with Transaction().set_context(\n                    language=Config.get_language(),\n                    translate_name=False):\n                res2 = cls.read(ids, ['id', 'code', 'name'])\n            for record2 in res2:\n                for record in res:\n                    if record['id'] == record2['id']:\n                        break\n                res_trans = Translation.get_ids(cls.__name__ + ',name',\n                        'model', record2['code'], [record2['id']])\n                record['name'] = (res_trans.get(record2['id'], False)\n                    or record2['name'])\n        return res\n\n    @staticmethod\n    def default_translatable():\n        return False\n\n    @staticmethod\n    def default_direction():\n        return 'ltr'\n\n    @staticmethod\n    def default_date():\n        return '%m/%d/%Y'\n\n    @staticmethod\n    def default_grouping():\n        return '[]'\n\n    @staticmethod\n    def default_decimal_point():\n        return '.'\n\n    @staticmethod\n    def default_thousands_sep():\n        return ','\n\n    @classmethod\n    def default_mon_grouping(cls):\n        return '[]'\n\n    @classmethod\n    def default_mon_thousands_sep(cls):\n        return ','\n\n    @classmethod\n    def default_mon_decimal_point(cls):\n        return '.'\n\n    @classmethod\n    def default_p_sign_posn(cls):\n        return 1\n\n    @classmethod\n    def default_n_sign_posn(cls):\n        return 1\n\n    @classmethod\n    def default_negative_sign(cls):\n        return '-'\n\n    @classmethod\n    def default_positive_sign(cls):\n        return ''\n\n    @classmethod\n    def default_p_cs_precedes(cls):\n        return True\n\n    @classmethod\n    def default_n_cs_precedes(cls):\n        return True\n\n    @classmethod\n    def default_p_sep_by_space(cls):\n        return False\n\n    @classmethod\n    def default_n_sep_by_space(cls):\n        return False\n\n    @classmethod\n    @ModelView.button\n    def load_translations(cls, languages):\n        pool = Pool()\n        Module = pool.get('ir.module')\n        codes = set()\n        cls.write(languages, {'translatable': True})\n        for language in languages:\n            code = language.code\n            while code:\n                codes.add(code)\n                code = get_parent_language(code)\n        modules = Module.search([\n                    ('state', '=', 'activated'),\n                    ])\n        modules = [m.name for m in modules]\n        for node in create_graph(modules):\n            load_translations(pool, node, codes)\n\n    @classmethod\n    @ModelView.button\n    def unload_translations(cls, languages):\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        cls.write(languages, {'translatable': False})\n        languages = [l.code for l in languages]\n        Translation.delete(Translation.search([\n                    ('lang', 'in', languages),\n                    ('module', '!=', None),\n                    ]))\n\n    @classmethod\n    def validate_fields(cls, languages, field_names):\n        super().validate_fields(languages, field_names)\n        cls.check_grouping(languages, field_names)\n        cls.check_date(languages, field_names)\n        cls.check_translatable(languages)\n\n    @classmethod\n    def check_grouping(cls, langs, fields_names=None):\n        '''\n        Check if grouping is list of numbers\n        '''\n        if fields_names and not (fields_names & {'grouping', 'mon_grouping'}):\n            return\n        for lang in langs:\n            for grouping in [lang.grouping, lang.mon_grouping]:\n                try:\n                    grouping = literal_eval(grouping)\n                    for i in grouping:\n                        if not isinstance(i, int):\n                            raise\n                except Exception:\n                    raise GroupingError(\n                        gettext('ir.msg_language_invalid_grouping',\n                            grouping=grouping,\n                            language=lang.rec_name))\n\n    @classmethod\n    def check_date(cls, langs, field_names=None):\n        '''\n        Check the date format\n        '''\n        if field_names and 'date' not in field_names:\n            return\n        for lang in langs:\n            date = lang.date\n            try:\n                datetime.datetime.now().strftime(date)\n            except Exception:\n                raise DateError(gettext('ir.msg_language_invalid_date',\n                        format=lang.date,\n                        language=lang.rec_name))\n            if (('%Y' not in lang.date)\n                    or ('%b' not in lang.date\n                        and '%B' not in lang.date\n                        and '%m' not in lang.date\n                        and '%-m' not in lang.date)\n                    or ('%d' not in lang.date\n                        and '%-d' not in lang.date\n                        and '%j' not in lang.date\n                        and '%-j' not in lang.date)\n                    or ('%x' in lang.date\n                        or '%X' in lang.date\n                        or '%c' in lang.date\n                        or '%Z' in lang.date)):\n                raise DateError(gettext(\n                        'ir.msg_language_invalid_date',\n                        format=lang.date,\n                        language=lang.rec_name))\n\n    @classmethod\n    def check_translatable(cls, langs, field_names=None):\n        pool = Pool()\n        Config = pool.get('ir.configuration')\n        if field_names and 'translatable' not in field_names:\n            return\n        # Skip check for root because when languages are created from XML file,\n        # translatable is not yet set.\n        if Transaction().user == 0:\n            return True\n        for lang in langs:\n            if (lang.code == Config.get_language()\n                    and not lang.translatable):\n                raise TranslatableError(\n                    gettext('ir.msg_language_default_translatable',\n                        language=lang.rec_name))\n\n    @staticmethod\n    def check_xml_record(langs, values):\n        return True\n\n    @classmethod\n    def get_translatable_languages(cls):\n        res = cls._lang_cache.get('translatable_languages')\n        if res is None:\n            langs = cls.search([\n                    ('translatable', '=', True),\n                    ])\n            res = [x.code for x in langs]\n            cls._lang_cache.set('translatable_languages', res)\n        return res\n\n    @classmethod\n    def create(cls, vlist):\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        # Clear cache\n        cls._lang_cache.clear()\n        languages = super(Lang, cls).create(vlist)\n        Translation._get_language_cache.clear()\n        _parents.clear()\n        return languages\n\n    @classmethod\n    def write(cls, langs, values, *args):\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        # Clear cache\n        cls._lang_cache.clear()\n        cls._code_cache.clear()\n        super(Lang, cls).write(langs, values, *args)\n        Translation._get_language_cache.clear()\n        _parents.clear()\n\n    @classmethod\n    def delete(cls, langs):\n        pool = Pool()\n        Config = pool.get('ir.configuration')\n        Translation = pool.get('ir.translation')\n        for lang in langs:\n            if lang.code == Config.get_language():\n                raise DeleteDefaultError(\n                    gettext('ir.msg_language_delete_default',\n                        language=lang.rec_name))\n        # Clear cache\n        cls._lang_cache.clear()\n        cls._code_cache.clear()\n        super(Lang, cls).delete(langs)\n        Translation._get_language_cache.clear()\n        _parents.clear()\n\n    @classmethod\n    def get(cls, code=None):\n        \"Return language instance for the code or the transaction language\"\n        if code is None:\n            code = Transaction().language\n        lang_id = cls._code_cache.get(code)\n        if not lang_id:\n            with Transaction().set_context(active_test=False):\n                lang, = cls.search([\n                        ('code', '=', code),\n                        ])\n            cls._code_cache.set(code, lang.id)\n        else:\n            lang = cls(lang_id)\n        return lang\n\n    def _group(self, s, monetary=False):\n        # Code from _group in locale.py\n\n        # Iterate over grouping intervals\n        def _grouping_intervals(grouping):\n            last_interval = 0\n            for interval in grouping:\n                # if grouping is -1, we are done\n                if interval == CHAR_MAX:\n                    return\n                # 0: re-use last group ad infinitum\n                if interval == 0:\n                    while True:\n                        yield last_interval\n                yield interval\n                last_interval = interval\n\n        if monetary:\n            thousands_sep = self.mon_thousands_sep\n            grouping = literal_eval(self.mon_grouping)\n        else:\n            thousands_sep = self.thousands_sep\n            grouping = literal_eval(self.grouping)\n        if not grouping:\n            return (s, 0)\n        if s[-1] == ' ':\n            stripped = s.rstrip()\n            right_spaces = s[len(stripped):]\n            s = stripped\n        else:\n            right_spaces = ''\n        left_spaces = ''\n        groups = []\n        for interval in _grouping_intervals(grouping):\n            if not s or s[-1] not in \"0123456789\":\n                # only non-digit characters remain (sign, spaces)\n                left_spaces = s\n                s = ''\n                break\n            groups.append(s[-interval:])\n            s = s[:-interval]\n        if s:\n            groups.append(s)\n        groups.reverse()\n        return (\n            left_spaces + thousands_sep.join(groups) + right_spaces,\n            len(thousands_sep) * (len(groups) - 1)\n        )\n\n    def format(self, percent, value, grouping=False, monetary=False,\n            *additional):\n        '''\n        Returns the lang-aware substitution of a %? specifier (percent).\n        '''\n        # Code from format in locale.py\n\n        # Strip a given amount of excess padding from the given string\n        def _strip_padding(s, amount):\n            lpos = 0\n            while amount and s[lpos] == ' ':\n                lpos += 1\n                amount -= 1\n            rpos = len(s) - 1\n            while amount and s[rpos] == ' ':\n                rpos -= 1\n                amount -= 1\n            return s[lpos:rpos + 1]\n\n        # this is only for one-percent-specifier strings\n        # and this should be checked\n        if percent[0] != '%':\n            raise ValueError(\"format() must be given exactly one %char \"\n                             \"format specifier\")\n        if additional:\n            formatted = percent % ((value,) + additional)\n        else:\n            formatted = percent % value\n        # floats and decimal ints need special action!\n        if percent[-1] in 'eEfFgG':\n            seps = 0\n            parts = formatted.split('.')\n            if grouping:\n                parts[0], seps = self._group(parts[0], monetary=monetary)\n            if monetary:\n                decimal_point = self.mon_decimal_point\n            else:\n                decimal_point = self.decimal_point\n            formatted = decimal_point.join(parts)\n            if seps:\n                formatted = _strip_padding(formatted, seps)\n        elif percent[-1] in 'diu':\n            seps = 0\n            if grouping:\n                formatted, seps = self._group(formatted, monetary=monetary)\n            if seps:\n                formatted = _strip_padding(formatted, seps)\n        return formatted\n\n    def currency(\n            self, val, currency, symbol=True, grouping=False, digits=None):\n        \"\"\"\n        Formats val according to the currency settings in lang.\n        \"\"\"\n        # Code from currency in locale.py\n\n        # check for illegal values\n        if digits is None:\n            digits = currency.digits\n        if digits == 127:\n            raise ValueError(\"Currency formatting is not possible using \"\n                             \"the 'C' locale.\")\n\n        s = self.format(\n            '%%.%if' % digits, abs(val), grouping, monetary=True)\n        # '<' and '>' are markers if the sign must be inserted\n        # between symbol and value\n        s = '<' + s + '>'\n\n        if symbol:\n            smb = currency.symbol\n            precedes = (val < 0 and self.n_cs_precedes\n                or self.p_cs_precedes)\n            separated = (val < 0 and self.n_sep_by_space\n                or self.p_sep_by_space)\n\n            if precedes:\n                s = smb + (separated and ' ' or '') + s\n            else:\n                s = s + (separated and ' ' or '') + smb\n\n        sign_pos = val < 0 and self.n_sign_posn or self.p_sign_posn\n        sign = val < 0 and self.negative_sign or self.positive_sign\n\n        if sign_pos == 0:\n            s = '(' + s + ')'\n        elif sign_pos == 1:\n            s = sign + s\n        elif sign_pos == 2:\n            s = s + sign\n        elif sign_pos == 3:\n            s = s.replace('<', sign)\n        elif sign_pos == 4:\n            s = s.replace('>', sign)\n        else:\n            # the default if nothing specified;\n            # this should be the most fitting sign position\n            s = sign + s\n\n        return s.replace('<', '').replace('>', '')\n\n    def strftime(self, value, format=None):\n        '''\n        Convert value to a string as specified by the format argument.\n        '''\n        pool = Pool()\n        Month = pool.get('ir.calendar.month')\n        Day = pool.get('ir.calendar.day')\n        if format is None:\n            format = self.date\n            if isinstance(value, datetime.datetime):\n                format += ' %H:%M:%S'\n        format = format.replace('%x', self.date)\n        format = format.replace('%X', '%H:%M:%S')\n        if isinstance(value, datetime.date):\n            for f, i, klass in (('%A', 6, Day), ('%B', 1, Month)):\n                for field, f in [('name', f), ('abbreviation', f.lower())]:\n                    locale = klass.locale(self, field=field)\n                    format = format.replace(f, locale[value.timetuple()[i]])\n        if isinstance(value, datetime.time):\n            time = value\n        else:\n            try:\n                time = value.time()\n            except AttributeError:\n                time = None\n        if time:\n            if time < datetime.time(12):\n                p = self.am or 'AM'\n            else:\n                p = self.pm or 'PM'\n            format = format.replace('%p', p)\n        return value.strftime(format)\n\n    def format_number(self, value, digits=None, grouping=True, monetary=None):\n        if digits is None:\n            d = value\n            if not isinstance(d, Decimal):\n                d = Decimal(repr(value))\n            digits = -int(d.as_tuple().exponent)\n        return self.format(\n            '%.*f', (digits, value), grouping=grouping, monetary=monetary)\n\n    def format_number_symbol(self, value, symbol, digits=None, grouping=True):\n        symbol, position = symbol.get_symbol(value)\n        separated = (\n            value < 0 and self.n_sep_by_space or self.p_sep_by_space)\n        s = self.format_number(value, digits, grouping)\n        if position:\n            s = s + (separated and ' ' or '') + symbol\n        else:\n            s = symbol + (separated and ' ' or '') + s\n        return s\n\n\nclass LangConfigStart(ModelView):\n    \"Configure languages\"\n    __name__ = 'ir.lang.config.start'\n\n    languages = fields.Many2Many('ir.lang', None, None, \"Languages\")\n\n    @classmethod\n    def default_languages(cls):\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        return [x.id for x in Lang.search([('translatable', '=', True)])]\n\n\nclass LangConfig(Wizard):\n    'Configure languages'\n    __name__ = 'ir.lang.config'\n\n    start = StateView('ir.lang.config.start',\n        'ir.lang_config_start_view_form', [\n            Button('Cancel', 'end', 'tryton-cancel'),\n            Button('Load', 'load', 'tryton-ok', default=True),\n            ])\n    load = StateTransition()\n\n    def transition_load(self):\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        Lang.load_translations(list(self.start.languages))\n        untranslated_languages = Lang.search([\n                ('id', 'not in', [l.id for l in self.start.languages]),\n                ('translatable', '=', True),\n                ])\n        Lang.unload_translations(untranslated_languages)\n        return 'end'\n\n\ndef get_parent_language(code):\n    if code not in _parents:\n        # Use SQL because it is used by load_module_graph\n        cursor = Transaction().connection.cursor()\n        lang = Table('ir_lang')\n        cursor.execute(*lang.select(lang.code, lang.parent))\n        _parents.update(cursor)\n    if _parents.get(code):\n        return _parents[code]\n    for sep in ['@', '_']:\n        if sep in code:\n            return code.rsplit(sep, 1)[0]\n\n\n_parents = {}\n"
  },
  {
    "path": "trytond/ir/lang.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <menuitem\n            name=\"Localization\"\n            parent=\"menu_administration\"\n            sequence=\"30\"\n            id=\"menu_localization\"/>\n         <record model=\"ir.lang\" id=\"lang_bg\">\n            <field name=\"code\">bg</field>\n            <field name=\"name\">Bulgarian</field>\n            <field name=\"date\">%d.%m.%Y</field>\n            <field name=\"am\"></field>\n            <field name=\"pm\"></field>\n            <field name=\"grouping\">[3, 3, 0]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\">.</field>\n            <field name=\"mon_grouping\">[3, 3, 0]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\"> </field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"False\"/>\n            <field name=\"n_cs_precedes\" eval=\"False\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_ca\">\n            <field name=\"code\">ca</field>\n            <field name=\"name\">Català</field>\n            <field name=\"date\">%d/%m/%Y</field>\n            <field name=\"am\">a. m.</field>\n            <field name=\"pm\">p. m.</field>\n            <field name=\"grouping\">[3, 3, 0]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\"> </field>\n            <field name=\"mon_grouping\">[3, 3, 0]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\">.</field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"False\"/>\n            <field name=\"n_cs_precedes\" eval=\"False\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_cs\">\n            <field name=\"code\">cs</field>\n            <field name=\"name\">Czech</field>\n            <field name=\"date\">%d.%m.%Y</field>\n            <field name=\"am\"></field>\n            <field name=\"pm\"></field>\n            <field name=\"grouping\">[3, 3, 0]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\"> </field>\n            <field name=\"mon_grouping\">[3, 3, 0]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\"> </field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"False\"/>\n            <field name=\"n_cs_precedes\" eval=\"False\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_de\">\n            <field name=\"code\">de</field>\n            <field name=\"name\">German</field>\n            <field name=\"date\">%d.%m.%Y</field>\n            <field name=\"am\"></field>\n            <field name=\"pm\"></field>\n            <field name=\"grouping\">[3, 3, 0]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\">.</field>\n            <field name=\"mon_grouping\">[3, 3, 0]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\">.</field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"False\"/>\n            <field name=\"n_cs_precedes\" eval=\"False\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <!--\n        lang_en is defined in ir.xml\n        -->\n        <record model=\"ir.lang\" id=\"lang_es\">\n            <field name=\"code\">es</field>\n            <field name=\"name\">Spanish</field>\n            <field name=\"date\">%d/%m/%Y</field>\n            <field name=\"am\"></field>\n            <field name=\"pm\"></field>\n            <field name=\"grouping\">[3, 3, 0]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\">.</field>\n            <field name=\"mon_grouping\">[3, 3, 0]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\">.</field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"False\"/>\n            <field name=\"n_cs_precedes\" eval=\"False\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_es_419\">\n            <field name=\"code\">es_419</field>\n            <field name=\"name\">Spanish (Latin American)</field>\n            <field name=\"date\">%d/%m/%Y</field>\n            <field name=\"am\"></field>\n            <field name=\"pm\"></field>\n            <field name=\"grouping\">[3, 3, 0]</field>\n            <field name=\"decimal_point\">.</field>\n            <field name=\"thousands_sep\">,</field>\n            <field name=\"mon_grouping\">[3, 3, 0]</field>\n            <field name=\"mon_decimal_point\">.</field>\n            <field name=\"mon_thousands_sep\">,</field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"False\"/>\n            <field name=\"n_cs_precedes\" eval=\"False\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_et\">\n            <field name=\"code\">et</field>\n            <field name=\"name\">Estonian</field>\n            <field name=\"date\">%d.%m.%Y</field>\n            <field name=\"grouping\">[3, 3]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\"> </field>\n            <field name=\"mon_grouping\">[3, 3]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\"> </field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"False\"/>\n            <field name=\"n_cs_precedes\" eval=\"False\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_fa\">\n            <field name=\"code\">fa</field>\n            <field name=\"name\">Persian</field>\n            <field name=\"direction\">rtl</field>\n            <field name=\"date\">%Y/%m/%d</field>\n            <field name=\"am\"></field>\n            <field name=\"pm\"></field>\n            <field name=\"grouping\">[3, 0]</field>\n            <field name=\"decimal_point\">.</field>\n            <field name=\"thousands_sep\">,</field>\n            <field name=\"mon_grouping\">[3, 0]</field>\n            <field name=\"mon_decimal_point\">٫</field>\n            <field name=\"mon_thousands_sep\">٬</field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"False\"/>\n            <field name=\"n_cs_precedes\" eval=\"False\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_fi\">\n            <field name=\"code\">fi</field>\n            <field name=\"name\">Finnish</field>\n            <field name=\"date\">%d.%m.%Y</field>\n            <field name=\"grouping\">[3, 3, 0]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\"> </field>\n            <field name=\"mon_grouping\">[3, 3, 0]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\"> </field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"False\"/>\n            <field name=\"n_cs_precedes\" eval=\"False\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_fr\">\n            <field name=\"code\">fr</field>\n            <field name=\"name\">French</field>\n            <field name=\"date\">%d.%m.%Y</field>\n            <field name=\"am\"></field>\n            <field name=\"pm\"></field>\n            <field name=\"grouping\">[3, 0]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\"> </field>\n            <field name=\"mon_grouping\">[3, 0]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\"> </field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"False\"/>\n            <field name=\"n_cs_precedes\" eval=\"False\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_hu\">\n            <field name=\"code\">hu</field>\n            <field name=\"name\">Hungarian</field>\n            <field name=\"date\">%Y-%m-%d</field>\n            <field name=\"am\"></field>\n            <field name=\"pm\"></field>\n            <field name=\"grouping\">[3, 3, 0]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\">.</field>\n            <field name=\"mon_grouping\">[3, 3, 0]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\">.</field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"False\"/>\n            <field name=\"n_cs_precedes\" eval=\"False\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_id\">\n            <field name=\"code\">id</field>\n            <field name=\"name\">Indonesian</field>\n            <field name=\"date\">%d/%m/%Y</field>\n            <field name=\"am\"></field>\n            <field name=\"pm\"></field>\n            <field name=\"grouping\">[3, 3]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\">.</field>\n            <field name=\"mon_grouping\">[3, 3]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\">.</field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"True\"/>\n            <field name=\"n_cs_precedes\" eval=\"True\"/>\n            <field name=\"p_sep_by_space\" eval=\"False\"/>\n            <field name=\"n_sep_by_space\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_it\">\n            <field name=\"code\">it</field>\n            <field name=\"name\">Italian</field>\n            <field name=\"date\">%d/%m/%Y</field>\n            <field name=\"am\"></field>\n            <field name=\"pm\"></field>\n            <field name=\"grouping\">[]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\"></field>\n            <field name=\"mon_grouping\">[3, 3, 0]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\">.</field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"True\"/>\n            <field name=\"n_cs_precedes\" eval=\"True\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_lo\">\n            <field name=\"code\">lo</field>\n            <field name=\"name\">Lao</field>\n            <field name=\"date\">%d/%m/%Y</field>\n            <field name=\"am\">AM</field>\n            <field name=\"pm\">PM</field>\n            <field name=\"grouping\">[3, 3, 0]</field>\n            <field name=\"decimal_point\">.</field>\n            <field name=\"thousands_sep\">,</field>\n            <field name=\"mon_grouping\">[3, 3, 0]</field>\n            <field name=\"mon_decimal_point\">.</field>\n            <field name=\"mon_thousands_sep\">,</field>\n            <field name=\"p_sign_posn\" eval=\"4\"/>\n            <field name=\"n_sign_posn\" eval=\"4\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"True\"/>\n            <field name=\"n_cs_precedes\" eval=\"True\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_lt\">\n            <field name=\"code\">lt</field>\n            <field name=\"name\">Lithuanian</field>\n            <field name=\"date\">%Y-%m-%d</field>\n            <field name=\"am\"></field>\n            <field name=\"pm\"></field>\n            <field name=\"grouping\">[3, 3, 0]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\">.</field>\n            <field name=\"mon_grouping\">[3, 3, 0]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\">.</field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"False\"/>\n            <field name=\"n_cs_precedes\" eval=\"False\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_nl\">\n            <field name=\"code\">nl</field>\n            <field name=\"name\">Dutch</field>\n            <field name=\"date\">%d-%m-%Y</field>\n            <field name=\"am\"></field>\n            <field name=\"pm\"></field>\n            <field name=\"grouping\">[]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\"></field>\n            <field name=\"mon_grouping\">[3, 3, 0]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\"> </field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"2\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"True\"/>\n            <field name=\"n_cs_precedes\" eval=\"True\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_pl\">\n            <field name=\"code\">pl</field>\n            <field name=\"name\">Polish</field>\n            <field name=\"date\">%d.%m.%Y</field>\n            <field name=\"am\"></field>\n            <field name=\"pm\"></field>\n            <field name=\"grouping\">[3, 3, 0]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\"> </field>\n            <field name=\"mon_grouping\">[3, 0, 0]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\"> </field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"False\"/>\n            <field name=\"n_cs_precedes\" eval=\"False\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_pt\">\n            <field name=\"code\">pt</field>\n            <field name=\"name\">Portuguese</field>\n            <field name=\"date\">%d-%m-%Y</field>\n            <field name=\"am\"></field>\n            <field name=\"pm\"></field>\n            <field name=\"grouping\">[]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\"></field>\n            <field name=\"mon_grouping\">[3, 3, 0]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\">.</field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"True\"/>\n            <field name=\"n_cs_precedes\" eval=\"True\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_ro\">\n            <field name=\"code\">ro</field>\n            <field name=\"name\">Romanian</field>\n            <field name=\"date\">%d.%m.%Y</field>\n            <field name=\"am\"></field>\n            <field name=\"pm\"></field>\n            <field name=\"grouping\">[3,3]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\">.</field>\n            <field name=\"mon_grouping\">[3,3]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\">.</field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"True\"/>\n            <field name=\"n_cs_precedes\" eval=\"True\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_ru\">\n            <field name=\"code\">ru</field>\n            <field name=\"name\">Russian</field>\n            <field name=\"date\">%d.%m.%Y</field>\n            <field name=\"am\"></field>\n            <field name=\"pm\"></field>\n            <field name=\"grouping\">[3, 3, 0]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\"> </field>\n            <field name=\"mon_grouping\">[3, 3, 0]</field>\n            <field name=\"mon_decimal_point\">.</field>\n            <field name=\"mon_thousands_sep\"> </field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"False\"/>\n            <field name=\"n_cs_precedes\" eval=\"False\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_sl\">\n            <field name=\"code\">sl</field>\n            <field name=\"name\">Slovenian</field>\n            <field name=\"date\">%d.%m.%Y</field>\n            <field name=\"am\"></field>\n            <field name=\"pm\"></field>\n            <field name=\"grouping\">[]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\"> </field>\n            <field name=\"mon_grouping\">[3, 3, 0]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\"> </field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"False\"/>\n            <field name=\"n_cs_precedes\" eval=\"False\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_tr\">\n            <field name=\"code\">tr</field>\n            <field name=\"name\">Turkish</field>\n            <field name=\"date\">%d-%m-%Y</field>\n            <field name=\"grouping\">[3, 3, 0]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\">.</field>\n            <field name=\"mon_grouping\">[3, 3, 0]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\">.</field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"False\"/>\n            <field name=\"n_cs_precedes\" eval=\"False\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_uk\">\n            <field name=\"code\">uk</field>\n            <field name=\"name\">Ukrainian</field>\n            <field name=\"date\">%d.%m.%Y</field>\n            <field name=\"grouping\">[3, 3]</field>\n            <field name=\"decimal_point\">,</field>\n            <field name=\"thousands_sep\"> </field>\n            <field name=\"mon_grouping\">[3, 3]</field>\n            <field name=\"mon_decimal_point\">,</field>\n            <field name=\"mon_thousands_sep\"> </field>\n            <field name=\"p_sign_posn\" eval=\"1\"/>\n            <field name=\"n_sign_posn\" eval=\"1\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"False\"/>\n            <field name=\"n_cs_precedes\" eval=\"False\"/>\n            <field name=\"p_sep_by_space\" eval=\"True\"/>\n            <field name=\"n_sep_by_space\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.lang\" id=\"lang_zh_CN\">\n            <field name=\"code\">zh_CN</field>\n            <field name=\"name\">Chinese Simplified</field>\n            <field name=\"date\">%Y-%m-%d</field>\n            <field name=\"am\">上午</field>\n            <field name=\"pm\">下午</field>\n            <field name=\"grouping\">[3, 0]</field>\n            <field name=\"decimal_point\">.</field>\n            <field name=\"thousands_sep\">,</field>\n            <field name=\"mon_grouping\">[3, 0]</field>\n            <field name=\"mon_decimal_point\">.</field>\n            <field name=\"mon_thousands_sep\">,</field>\n            <field name=\"p_sign_posn\" eval=\"4\"/>\n            <field name=\"n_sign_posn\" eval=\"4\"/>\n            <field name=\"positive_sign\"></field>\n            <field name=\"negative_sign\">-</field>\n            <field name=\"p_cs_precedes\" eval=\"True\"/>\n            <field name=\"n_cs_precedes\" eval=\"True\"/>\n            <field name=\"p_sep_by_space\" eval=\"False\"/>\n            <field name=\"n_sep_by_space\" eval=\"False\"/>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"lang_view_tree\">\n            <field name=\"model\">ir.lang</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">lang_list</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"lang_view_form\">\n            <field name=\"model\">ir.lang</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">lang_form</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_lang_form\">\n            <field name=\"name\">Languages</field>\n            <field name=\"res_model\">ir.lang</field>\n            <field name=\"context\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_lang_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"lang_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_lang_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_lang_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"lang_view_form\"/>\n            <field name=\"act_window\" ref=\"act_lang_form\"/>\n        </record>\n        <menuitem\n            parent=\"ir.menu_localization\"\n            action=\"act_lang_form\"\n            sequence=\"10\"\n            id=\"menu_lang_form\"/>\n\n        <record model=\"ir.model.button\" id=\"lang_load_translations_button\">\n            <field name=\"name\">load_translations</field>\n            <field name=\"string\">Load translations</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.lang')]\"/>\n            <field name=\"confirm\">Are you sure you want to load languages' translations?</field>\n        </record>\n        <record model=\"ir.model.button\" id=\"lang_unload_translations_button\">\n            <field name=\"name\">unload_translations</field>\n            <field name=\"string\">Unload translations</field>\n            <field name=\"confirm\">Are you sure you want to remove languages' translations?</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.lang')]\"/>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"lang_config_start_view_form\">\n            <field name=\"model\">ir.lang.config.start</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">lang_config_start_form</field>\n        </record>\n\n        <record model=\"ir.action.wizard\" id=\"act_lang_config\">\n            <field name=\"name\">Configure Languages</field>\n            <field name=\"wiz_name\">ir.lang.config</field>\n            <field name=\"window\" eval=\"True\"/>\n        </record>\n\n        <record model=\"ir.module.config_wizard.item\" id=\"config_wizard_item_lang\">\n            <field name=\"action\" ref=\"act_lang_config\"/>\n        </record>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/locale/bg.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Икона\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ключови думи\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"ID на запис\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"Вид\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"Използване\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"Домейн\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Изгледи\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"Стойност на котекст\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"Стойност на домейн\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"Домейн\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Икона\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ключови думи\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"Ограничение\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Име на прикачен файл\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"PySON контекст\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"PySON контекст\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"PySON критерии за търсене\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"ID на запис\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"Критерии за търсене\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"Вид\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"Използване\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Изгледи\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"Домейн\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Име на прикачен файл\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Изглед\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"Ключова дума\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"Директен печат\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"Разширение\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Икона\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ключови думи\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Модул\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Име на прикачен файл\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"ID на запис\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"ID на запис\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"Път\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"Съдържание\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"Съдържание\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"Вътрешно име\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"Разширение на шаблон\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"За превод\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"Вид\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"Използване\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Икона\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ключови думи\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Име на прикачен файл\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"ID на запис\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"Вид\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"URL на действие\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"Използване\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Икона\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ключови думи\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Име на прикачен файл\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"ID на запис\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"Вид\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"Използване\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"Прозорец\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"Име на помощник\"\n\n#, fuzzy\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Данни\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"Размер на данни\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Описание\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Последна промяна\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Последен потребител\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"Препратка\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Име на прикачен файл\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"Обобщено\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"Вид\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"В брой\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Ресурс\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Последна промяна\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Последен потребител\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"Дата\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"Език\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"Дни\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"Часове\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"Номер на интервал\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"Минути\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"Следващ тел. разговор\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"Време\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"Потребител\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"Email\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Име на модел\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Справка\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"Разширение на шаблон\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Описание\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"Използване\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"Създадено от\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Състояние\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"Обобщено\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Полета\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Извличане\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"Код\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Дата\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Десетичен разделител\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"Посока\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Групиране\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Десетичен разделител\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Групиране\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Разделител за хиляди\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Разделител за хиляди\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"За превод\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"Напред\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Полета\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"Информация\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"Име на модел\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Модул\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"Описание на модел\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Описание\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Права за създаване\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Права за изтриване\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Права за четене\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Права за писане\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Clicks\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"Помощ\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Име на прикачен файл\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"Правило\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Бутон\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Бутон\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"ID на запис\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Бутон\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"Условие\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Описание\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID на ресурс\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"Идентификатор от файлова система\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Модул\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"Без обновяване\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Out of Sync\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"Стойности\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"Описание на поле\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"Помощ\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Модул\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"Модел на връзка\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"Вид на поле\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Описание\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Поле\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Права за създаване\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Права за изтриване\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Права за четене\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Права за писане\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Филтър\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"Ниво\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"Деца\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"Зависимости\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"Родители\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"Състояние\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"Версия\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"Модули за обновяване\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"Състояние\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"Процент\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Модул\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"Състояние\"\n\n#, fuzzy\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Последна промяна\"\n\n#, fuzzy\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Последен потребител\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Бележка\"\n\n#, fuzzy\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"Потребител\"\n\n#, fuzzy\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Данни\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"Домейн\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"По подразбиране\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"Глобален\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Права за създаване\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Изтриване на достъп\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Права за четене\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Права за писане\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"Тестове\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Последен времеви маркер\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Име на последователност\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Стойност на увеличаване\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Следващо число\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Следващо число\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Фиксирана дължина (нули)\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Префикс\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Суфикс\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Отместване на времеви маркер\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Закръгление на времеви маркер\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"Вид\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Последен времеви маркер\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Име на последователност\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Стойност на увеличаване\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Следващо число\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Следващо число\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Фиксирана дължина (нули)\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Префикс\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Суфикс\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Отместване на времеви маркер\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Закръгление на времеви маркер\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"Вид\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Име на последователност\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"Ключ\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Данни\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"Неясен\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Език\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Модул\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"Име на поле\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID на ресурс\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"Източник\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"Вид\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"Преведено значение\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"Файл\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"Файл\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Език\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Модул\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Език\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Модул\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Език\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"Условие\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"Макс брой редове\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"При създаване\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"При изтриване\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"В даден момент\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"При запис\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"ID на запис\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Превключвател\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Икона\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Модул\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Име на прикачен файл\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"Път към SVG файл\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"Бърз клавиш на действие\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"Наследници\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"Пълно име\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Икона\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Меню\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"Родителско меню\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Меню\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"Потребител\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"Архитектура на изгледа\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Данни\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"Домейн\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"Наследено поле\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"Наследен изглед\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Модул\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Име на прикачен файл\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"Важност\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"Вид изглед\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"Домейн\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Име на прикачен файл\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"Потребител\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Поле\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Потребител\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"Стойности\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"Изглед\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"Домейн\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"Потребител\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Поле\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"Потребител\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"Ширина\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"Ограничение по подразбиране за изглед със списък\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"Условие за търсене по подразбиране върху изглед със списък \"\n\n#, fuzzy\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\"Оставете празно за същото като шаблона, вижте документацията на unoconv за \"\n\"съвместими формати\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"Стартиране на помощник в нов прозорец\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Python израз изчислен със запис представен със \\\"self\\\"\\n\"\n\"Извиква действието ако е истина.\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Python израз изчислен със запис представен със \\\"self\\\"\\n\"\n\"Извиква действието ако е истина.\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Python израз изчислен със запис представен със \\\"self\\\"\\n\"\n\"Извиква действието ако е истина.\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"Модула в който този модел е зададен\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\"Python израз изчислен със запис представен със \\\"self\\\"\\n\"\n\"Извиква действието ако е истина.\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"ID на записа в базата данни.\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"ID на записа както е записан в файловата система\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"Модул в който този модел е зададен\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\"Въвеждането на регулярен израз на python ще изключи пасващия модел от \"\n\"диаграмата.\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"По подразбиране добавете това правило за всички потребители\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\"Направете правилото глобално\\n\"\n\"така че всеки потребител да го прилага\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"Правилото е удовлетворено ако поне един тест е успешен\"\n\n#, fuzzy\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\"Python израз изчислен със запис представен със \\\"self\\\"\\n\"\n\"Извиква действието ако е истина.\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\"Ограничаване на броя извиквания на \\\"Действие на фунция\\\" по записи.\\n\"\n\"0 - няма ограничение\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"PySON контекст\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Email\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"Email\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"Грешка\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icons\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Configure Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Clicks\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Buttons\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Данни\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Започване на изчакващите инталации/обновявания\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Module Configuration\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Бележки\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"Вид\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Export Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Преводи\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Изчистване на преводи\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Show View\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"Ширина на дърво с изгледи\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Workflow Graph\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Преводи\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"Действие на активния прозорец\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"Изглед на действие на активния на прозорец\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"All\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"Отваряне\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"All\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Out of Sync\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Local\"\n\n#, fuzzy\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Модули\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"Изглед на действие на активния на прозорец\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"Бърз клавиш на действие\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"Справка за сметка\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"URL на действие\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"Помощник за действие\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Прикачен файл\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"В брой\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"Дни\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"Месеци\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"Настройки\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"Планировщик\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Дата\"\n\n#, fuzzy\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"Email\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"Грешка\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Извличане\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"Ред от извличане\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Език\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Bulgarian\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Català\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Czech\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"German\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"English\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Испански\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Spanish (Latin American)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"French\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Български\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italian\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Lao\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Lithuanian\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Dutch\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Polish\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Russian\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Slovenian\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Chinese Simplified\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Активен\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"Името на модула трябва да е уникално!\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"This record is part of the base configuration.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"Името на модула трябва да е уникално!\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"Създадено на\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"Създадено от\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"Бележка\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"Празно\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Дата\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"Дата\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"Домейн\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"Помощ\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Избор\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Избор\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Избор\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Избор\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"Избор\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"Избор\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"Вид\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" exceeds the \"\n\"digits limit of \\\"%(digits)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"The value of the field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not valid according\"\n\" to its domain.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"Създадено на\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"Създадено от\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"Модела трябва да е уникален!\"\n\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"Не може да изтривате модул който инсталиран или ще бъде инсталиран\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Бележки\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"ID на запис\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Syntax error for reference %r in %s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Relation not found: %r in %s\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not in \"\n\"the selection.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Последователност\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Too many relations found: %r in %s\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"You are not allowed to modify this record.\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Модел на достъпа\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"Битон от модел\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"Отваряне\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Начало на изчистване на преводи\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Начало на изчистване на преводи\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Sync\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Mark for Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Show\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"Модел на данни\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"Поле на модел\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"Модел на достъп до поле\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"Печат на графика на модел\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Модул\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"Приключи инсталиране/обновяване на модул\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"Начало на инсталиране/обновяване на модул\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"Помощник за настройка на модук - други\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"Първи помощник на конфигуриране на модул\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"Задаване на помощника да се стартира след инсталиране на модула\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"Помощник за настройка на модук - други\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"Зависимости на модула\"\n\n#, fuzzy\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Бележка\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"Правило\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"Група правила\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Последователност\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Точна последователност\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Вид последователност\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"Сесия\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"Помощник за сесия\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Превод\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Начало на изчистване на преводи\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Изчистване на преводи\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Извличане на превод - файл\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Извличане на превод - файл\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Изчистване на преводи\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Изчистване на преводи\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"Обновяване на превод\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Превключвател\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"Лог на превключвател\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Икона\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"Потребителско меню\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Administration\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Email\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"Грешка\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icons\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"Вид\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Localization\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"Използване\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Buttons\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Данни\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Започване на изчакващите инталации/обновявания\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Бележки\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Scheduler\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Export Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Изчистване на преводи\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"User Interface\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"Ширина на дърво с изгледи\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Изглед\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Показване на изглед\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"Ширина на дърво с изгледи\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"Ширина на дърво с изгледи\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"Ширина на дървовиден изглед\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Избор\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Избор\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"Форма за действие\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"Свързана форма\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"Отваряне на графика\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"Отваряне на дърво\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"Отпечатване на форма\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Избор\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Избор\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Избор\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Данни\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"Препратка\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"Дни\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"Часове\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"Минути\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"Месеци\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"Седмици\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"Изчистването на преводите е успешно!\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"Отваряне\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"Отляво надясно\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"Отдясно наляво\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"За премахване\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"За обновяване\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"Приключен\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"Отваряне\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"За премахване\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"За обновяване\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"Неизвестен\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Десетичен времеви маркер\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Шестнайсетичен времеви маркер\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"Нарастване\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Десетичен времеви маркер\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Шестнайсетичен времеви маркер\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"Нарастване\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Поле\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"Помощ\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Модел\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Справка\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"Избор\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Изглед\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"Бутон на помощник\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"Табло\"\n\n#, fuzzy\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"Управление на календари\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"Форма\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Графика\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"Дърво\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"Основен\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"Основен\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"Основен\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"Основен\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"Основен\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"Последна промяна\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"Следващ тел. разговор\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"Следващ тел. разговор\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"Форматиране на дата\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"Форматиране на числа\"\n\n#, fuzzy\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"Модулите са обновени / инсталирани !\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"Системата ще бъде обновена.\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\"Може да настроите инсталацията си в зависимост от инсталираните модули.\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Отказ от обновяване\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Отбелязване за обновяване\"\n\n#, fuzzy\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Дата\"\n\n#, fuzzy\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"Време\"\n\n#, fuzzy\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"Потребител\"\n\n#, fuzzy\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"Ако не указан тест правилото винаги е удовлетворено ако не е глобално\"\n\n#, fuzzy\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"Правилото е удовлетворено ако поне един тест е успешен\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"${day}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"${month}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"${year}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"Ден:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"Нарастване\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"Легенда (променливи за префикс, суфикс)\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"Месец:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"Дата\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"Година:\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"Изчистване на преводите?\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Синхронизиране на преводите\"\n\n#, fuzzy\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"Превода трябва да е уникален\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отказ\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отказ\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"Печат\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"Добре\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отказ\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"Започване на обновяване\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Активен\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отказ\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"Добре\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"Добре\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отказ\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"Напред\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отказ\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"Празно\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отказ\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"Добре\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"Затваряне\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отказ\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Извличане\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отказване\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"Добре\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отказ\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"Обновяване\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"Затваряне\"\n"
  },
  {
    "path": "trytond/ir/locale/ca.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icona\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Accions de teclat\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"Registres\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"Tipus\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"Ús\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"Dominis\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Vistes\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Acció\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"Context\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"Domini del context\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"Model del context\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"Valor del domini\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"Dominis\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icona\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Accions de teclat\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"Límit\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"Ordre\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"Context PYSON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"Domini PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"Ordre PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"Criteri de cerca PySON\"\n\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"Registres\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"Filtrat\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"Tipus\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"Ús\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Vistes\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Acció\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"Comptador\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domini\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Acció\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Vista\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Acció\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"Acció teclat\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Acció\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"Impressió directa\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"Extensió\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icona\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"Es personalitzat\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Accions de teclat\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Mòdul\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Nom del registre\"\n\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"Registres\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"Ruta\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"Contingut\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"Contingut\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"Contingut HTML\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"Nom del contingut\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"Nom intern\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"Únic\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"Tipus de document\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Traduïble\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"Tipus\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"Ús\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Acció\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icona\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Accions de teclat\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"Registres\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"Tipus\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"Acció Url\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"Ús\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Acció\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icona\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Accions de teclat\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"Registres\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"Tipus\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"Ús\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"Finestra\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"Nom de l'assistent\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Copia als recursos\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Copia als recursos visible\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Dades\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"Mida de les dades\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Descripció\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"Identificador del fitxer\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Última modificació\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Últim usuari\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"Vincle\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"Recurs\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"Sumari\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"Tipus\"\n\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"Memòria cau\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Copia als recursos\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Copia als recursos visible\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"Imatge\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"ID de la imatge\"\n\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Última modificació\"\n\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Últim usuari\"\n\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"Recurs\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"Identificador únic universal\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"Imatge\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"ID de la imatge\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"Mida\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"Data-hora\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Abreviació\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"Índex\"\n\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Abreviació\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"Índex\"\n\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"Nom del servidor\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"idioma\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"Dia\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"Hora\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"Número d'interval\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"Tipus d'interval\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"Mètode\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"Minut\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"Següent execució\"\n\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"Zona horària\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"Dia de la setmana\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"Adreces\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"El\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"Missatge\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"Destinataris\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Destinataris ocults\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Destinataris secundaris\"\n\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"Recurs\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"Asumpte\"\n\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"Usuari\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"Adreça\"\n\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"Correu electrònic\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"Missatge\"\n\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Nom del model\"\n\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"Destinataris\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Destinataris ocults\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Destinataris ocults\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"Destinataris\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Destinataris secundaris\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Destinataris secundaris\"\n\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Informes\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"Asumpte\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Informe\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"Plantilla\"\n\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Descripció\"\n\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"Missatge\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"Origen\"\n\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"Processat per\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"Resolt per\"\n\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Estat\"\n\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"Resum\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Camps\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"Capçalera\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"Recurs\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Exporta\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"AM\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"Codi\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Separador decimal\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"Direcció\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Agrupació\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Separador decimal\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Agrupació\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Separador de milers\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"El signe negatiu va davant\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"Signe negatiu separat per espai\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"Posició del signe negatiu\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"Signe negatiu\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"El signe positiu va davant\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"Signe positiu separat per espai\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"Posició del signe positiu\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"Codi del pare\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"Configuració de la cerca de text PostgreSQL\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"PM\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"Signe positiu\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Separador de milers\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Traduïble\"\n\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Idiomes\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"Text\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Camps\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"Cerca global\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"Informació\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Mòdul\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"Descripció model\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Descripció\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Permís per crear\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Permís per eliminar\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Permís per llegir\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Permís per modificar\"\n\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Clics\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"Confirmació\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"Ajuda\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"Reinicia\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"Reiniciat per\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"Regles\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"Etiqueta\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Botó\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"Botó amb regla\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Botó\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"Identificador del registre\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Botó\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"Condició\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Descripció\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"Número d'usuaris\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"Identificador del recurs\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"Identificador en el sistema de fitxers\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"Valors en sistema de fitxers\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Mòdul\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"No actualitzat\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Sense sincronitzar\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"Valors\"\n\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Accés\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"Descripció del camp\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"Ajuda\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Mòdul\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"Relació model\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"Tipus de camp\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Descripció\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Camp\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Permís per crear\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Permís per eliminar\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Permís per llegir\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Permís per modificar\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Filtre\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"Nivell\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"Fills\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"Dependències\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"Pares\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"Estat\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"Versió\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"Mòduls a actualitzar\"\n\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Mòduls\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Acció\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"Estat\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"Percentatge\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Mòdul\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"Estat\"\n\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Copia als recursos\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Copia als recursos visible\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Última modificació\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Últim usuari\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"Missatge\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"Missatge\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"Recurs\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"No llegida\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Nota\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"Usuari\"\n\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Dades\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"Tret de la cua el\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"Afegit a la cua el\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"Prevista pel\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"Finalitzat el\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"Programat el\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domini\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"Defecte\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"Global\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Permís per crear\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Permís per eliminar\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Permís per llegir\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Permís per modificar\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"Condicions\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Última data-hora\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nom de la seqüència\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Número de increments\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Següent número\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Següent número\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Emplenat del número\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Prefix\"\n\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Tipus de seqüència\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Sufix\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Desfasament de data-hora\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Arrodoniment de data-hora\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"Tipus\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Última data-hora\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nom de la seqüència\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Número de increments\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Següent número\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Següent número\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Emplenat del número\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Prefix\"\n\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Tipus de seqüència\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Sufix\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Desfasament de data-hora\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Arrodoniment de data-hora\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"Tipus\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nom de la seqüència\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"Tecla\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Dades\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"Dubtosa\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Mòdul\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"Nom del camp\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"Mòdul anul·lant\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"Identificador del recurs\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"Original\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"Tipus\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"Traducció\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"Fitxer\"\n\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"Nom del fitxer\"\n\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Mòdul\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Mòdul\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Acció\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"Condició\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"Número límit\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"Retard mínim\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"Al crear\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"A l'eliminar\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"Al moment\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"Al modificar\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"Identificador del registre\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Disparador\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icona\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Mòdul\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"Ruta SVG\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Acció\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"Accions de teclat\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"Fills\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"Nom complet\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"Favorit\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icona\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Menú\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"Menú pare\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menú\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"Usuari\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"Arquitectura de la vista\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Dades\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domini\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"Camp fills\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"Vista heretada\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Mòdul\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"Prioritat\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"Tipus de vista\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domini\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"Usuari\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Camp\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Usuari\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"Valor\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"ID de la vista\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"Nom del fill\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domini\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"Nodes expandits\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"Nodes seleccionats\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"Usuari\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Camp\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"Usuari\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"Amplada\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Els registres sobre els que s'executa l'acció.\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"La part del domini que s'avaluarà cada vegada que es refresqui.\"\n\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"Límit per defecte en la vista de llista.\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Els registres sobre els que s'executa l'acció.\"\n\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"Criteri de cerca per defecte en la vista de llista.\"\n\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\"Deixeu-lo buit per mantenir el mateix que a la plantilla, consulteu la \"\n\"documentació del LibreOffice per conèixer els formats compatibles.\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\"Una expressió de Genshi per calcular el nom mitjançant 'registre'.\\n\"\n\"Deixar en blanc pel nom predeterminat.\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Els registres sobre els que s'executa l'acció.\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"Marqueu si la plantilla funciona només per un sol registre.\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"Desmarca per desactivar les traduccions d'aquest informe.\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Els registres sobre els que s'executa l'acció.\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Els registres sobre els que s'executa l'acció.\"\n\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"Executa l'assistent en una nova finestra.\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"El camp que conté el recipient(s).\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"El camp que conté el recipient(s) secundaris.\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Una expressió PYSON que genera una llista de destinataris ocults amb el \"\n\"registre representat per \\\"self\\\".\"\n\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Una expressió PYSON que genera la llista de recipients del registre \"\n\"representat per \\\"self\\\".\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"El camp que conté el recipient(s) secundaris.\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Una expressió PYSON que genera una llista de destinataris secundaris amb el \"\n\"regsitre representat per \\\"self\\\".\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"Marca per incloure els noms dels camps a la exportació.\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"Etiqueta RFC 4646.\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"Codi del pare excepcional\"\n\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"Mòdul en què es defineix aquest model.\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"El text que s'utilitzarà per demanar confirmació al clicar el botó.\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"Botó que hauria de reiniciar les regles.\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\"Una expressió PYSON avaluada amb el registre representat per \\\"self\\\"\\n\"\n\"Activa la regla si és certa.\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"L'id del registre de la base de dades.\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"L'id del registre com es coneix al sistema de fitxers.\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\"Si es marca, els permisos d'accés al model del camp també es comproven a la \"\n\"relació del camp.\"\n\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"Mòdul en el qual es defineix aquest camp.\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"Una expressió regular de Python per excloure models de les gràfiques.\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"Quan s'ha de realitzar la data.\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"Quan la tasca pot ser iniciada.\"\n\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\"El domini s'avalua amb un context PYSON que conté:\\n\"\n\"- \\\"user\\\" és l'usuari actual\\n\"\n\"- \\\"groups\\\" una llista dels ids dels grups de l'usuario actual\"\n\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"Afegeix aquesta regla a tots els usuaris per defecte.\"\n\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\"Fes la regla global \\n\"\n\"per tant tots els usuari hauran de complir aquesta regla.\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\"Es mostra als usuaris quan es produeix un error d'accés per aquesta regla.\"\n\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"La regla es compleix si almenys una condició és certa.\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\"Una expressió PYSON avaluada amb el registre representat per \\\"self\\\"\\n\"\n\"Dispara l'acció si és certa.\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\"Limita el número de crides a la \\\"Funció de l'acció\\\" per registres.\\n\"\n\"Poseu un 0 per indicar que no hi ha límit.\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\"Indica un temps mínim de retard entre crides a la \\\"Funció de l'acció\\\" per al mateix registre.\\n\"\n\"Deixeu-lo buit si no hi ha retard.\"\n\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"El domini PYSON.\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Acció\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Accions de finestra\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Informes\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Assistents\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Adjunts\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Assistent de configuració\"\n\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Accions\"\n\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Correus electrònics\"\n\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"Arxius de correu electrònic\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"Plantilles de correu electrònic\"\n\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"Errors\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exportacions\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icones\"\n\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Configura els idiomes\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Idiomes\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menú\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Menú\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"Missatge\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Accés models\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Accés\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Clics\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Botons\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Dades\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Permisos dels camps\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Accés\"\n\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Camps\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Realitza activacions/actualitzacions pendents\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Configura els mòduls\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Configuració dels mòduls\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Mòduls\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Regles dels registres\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Seqüències\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Seqüències estrictes\"\n\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"Tipus\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Neteja traduccions\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Exporta traduccions\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Traduccions\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Traduccions\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Defineix traduccions\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Sincronitza traduccions\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Disparadors\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Vistes\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"Cerques preferides\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Mostrar vista\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"Opcionals vista d'arbre\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Estat de l'arbre\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"Amplada vista d'arbre\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Gràfica\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Gràfica\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Gràfica dels estats\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Traduccions\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"Accions de finestra\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"Domini acció de finestra\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Tot\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"Obert\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"En procés\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Tot\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Sense sincronitzar\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Local\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Mòduls\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"Vista acció de finestra\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"Accions de teclat\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"Acció informe\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"Acció URL\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"Acció assistent\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Adjunts\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"Memòria cau de l'avatar\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"Memòria cau\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"Div\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"Dl\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"Ds\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"Dg\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"Dj\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"Dt\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"Dc\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"Dia\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"Divendres\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"Dilluns\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"Dissabte\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"Diumenge\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"Dijous\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"Dimarts\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"Dimecres\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"Abr\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"Ag\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"Des\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"Febr\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"Gen\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"Jul\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"Juny\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"Març\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"Maig\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"Nov\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"Oct\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"Set\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"Mes\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"Abril\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"Agost\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"Desembre\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"Febrer\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"Gener\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"Juliol\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"Juny\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"Març\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"Maig\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"Novembre\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"Octubre\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"Setembre\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"Configuració\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"Planificador de tasques\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"Correu electrònic\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"Adreça correu electrònic\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"Plantilla de correu electrònic\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"Plantilla de correu electrònic - Informe\"\n\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"Error\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Exporta\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"Exporta línia\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Búlgar\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Català\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Txec\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"Alemany\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"Anglès\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Castellà\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Castellà (llatinoamericà)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"Estonià\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"Persa\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"Finés\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"Francès\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Hongarès\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"Indonesi\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italià\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Laosià\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Lituà\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Holandès\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Polonès\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"Portuguès\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"Romanés\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Rus\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Eslovè\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"Turc\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Xinès simplificat\"\n\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Configurar els idiomes\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"Missatge\"\n\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"La crida al botó \\\"%(button)s\\\" de \\\"%(model)s\\\" no està permesa.\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"No teniu permisos per accedir a \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"No teniu permisos per accedir a \\\"%(model)s.%(field)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"No teniu permisos per executar l'assitent \\\"%(wizard)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"No teniu permisos per executar l'assistent \\\"%(wizard)s\\\" al model \"\n\"\\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"El context \\\"%(context)s\\\" de l'acció \\\"%(action)s\\\" és invàlid.\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\"El domini o el criteri de cerca \\\"%(domain)s\\\" de l'acció \\\"%(action)s\\\" es \"\n\"invàlid.\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"La vista \\\"%(view)s\\\" de l'acció \\\"%(action)s\\\" es invàlida.\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"El model d'assistent és incorrecte per l'acció de teclat \\\"%(name)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Actiu\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"Desmarca per eliminar l'ús en el futur.\"\n\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Adjunts\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"Només es permet un avatar per recurs.\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"La mida d'un avatar ha de ser única.\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"URL de l’avatar\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"Avatars\"\n\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"Aquest registre es part de la configuració inicial.\"\n\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"El nom del botó ha de ser únic per model.\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"No podeu crear registres a \\\"%(model)s\\\" perquè no compleixen almenys alguna d'aquestes regles:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"Creat el\"\n\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"Creat per\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"No podeu eliminar els registres \\\"%(ids)s\\\" de \\\"%(model)s\\\" per alguna de les següents regles:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"No podeu eliminar aquest registre.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"No\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"Booleà\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"Text\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"Data i hora\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"Dígits\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"Domini\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"Numèric coma flotant\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"Ajuda\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Ajuda de la selecció\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"La clau seguida per la cadena d'ajuda seperada per \\\":\\\", una per línia.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Ajuda de la selecció JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"Enter\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"Domini invalid en el esquema \\\"%(schema)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Ajuda de la selecció invàlida en el esquema \\\"%(schema)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Domini invàlid en el esquema \\\"%(schema)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Selecció múltiple\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"Numèric\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Selecció\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"Una parella de clau i valor separats per \\\":\\\" a cada línia.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"Selecció JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"Selecció ordenada\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"Si cal ordenar la selecció per l'etiqueta.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"Etiqueta\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"Tipus\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"Si\"\n\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"El nombre de dígits del valor \\\"%(value)r\\\" del camp \\\"%(field)s\\\" del \"\n\"registre \\\"%(record)s\\\" de \\\"%(model)s\\\" excedeix el seu límit de \"\n\"\\\"%(digits)i\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"El valor del camp \\\"%(field)s\\\" del registre \\\"%(record)s\\\" de \\\"%(model)s\\\"\"\n\" no és correcte segons el seu domini.\"\n\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"Editat el\"\n\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"Editat per\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Missatge invalid a la plantill de correu electrònic \\\"%(template)s\\\" amb \"\n\"l'excepció \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Expressió PYSON incorrecta \\\"%(field)s\\\" a la plantilla de correu electrònic\"\n\" \\\"%(template)s\\\" amb l'excepció \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\"La expressió PYSON \\\"%(field)s\\\" de la plantilla de correu electrònic \"\n\"\\\"%(template)s\\\" ha de generar una llista.\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Asumbte invàlid a la plantilla de correu electrònic \\\"%(template)s\\\" amb \"\n\"l'excepció \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"%(field)s (nom del model)\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\\\"%(field)s (cadena)\"\n\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"El valor \\\"%(value)s\\\" del camp \\\"%(field)s\\\" del registre \\\"%(record)s\\\" de\"\n\" \\\"%(model)s\\\" conté caràcters invàlids \\\"%(chars)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Els registres no s'han pogut eliminar perquè s'utilitzen en el camp \"\n\"\\\"%(field)s\\\" de \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"El valor \\\"%(value)s\\\" del camp \\\"%(field)s\\\" de \\\"%(model)s\\\" no existeix.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"No s'ha pogut desar, si us plau torna-ho a intentar.\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"L'ID ha de ser positiu.\"\n\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"El codi del idioma ha de ser únic.\"\n\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"L'idioma per defecte \\\"%(language)s\\\" ha de ser traduïble.\"\n\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"L'idioma per defecte \\\"%(language)s\\\" no es pot eliminar.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"El format de data \\\"%(format)s\\\" de l'idioma \\\"%(language)s\\\" és invàlid.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"L'agrupació \\\"%(grouping)s\\\" de l'idioma \\\"%(language)s\\\" es invàlida.\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\"La condició \\\"%(condition)s\\\" de la regla del botó \\\"%(rule)s\\\" no és una \"\n\"expressió PYSON vàlida.\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\"Alguns modules activats depenen dels mòduls que esteu intentant desactivar:\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"No podeu eliminar un mòdul que està activat o serà activat.\"\n\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\"Esteu intentant llegir els registres \\\"%(ids)s\\\" del model \\\"%(model)s\\\" que\"\n\" ja no existeixen.\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"No podeu llegir els registres \\\"%(ids)s\\\" de \\\"%(model)s\\\" per almenys una d'aquestes regles:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Nom del registre\"\n\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Error de recursivitat: El registre \\\"%(rec_name)s\\\" amb el pare \"\n\"\\\"%(parent_rec_name)s\\\" s'ha configurat com a pare de si mateix.\"\n\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Error de sintaxi per a la referència: \\\"%(value)r\\\" a \\\"%(field)s\\\" de \"\n\"\\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"No s'ha trobat la relació: \\\"%(value)r\\\" a \\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"\"\n\"La definició del correu electrònic sobre l'informe \\\"%(name)s\\\", és \"\n\"invàlida.\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"La definició del nom de registre no és vàlida per a l'informe \\\"%(report)s\\\"\"\n\" amb l'excepció \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Es requereix un valor pel camp \\\"%(field)s\\\" de \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Es requereix un valor pel camp \\\"%(field)s\\\" del registre \\\"%(record)s\\\" de \"\n\"\\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"Els recursos als que s'ha de copiar aquest registre.\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"La regla del domini \\\"%(name)s\\\" es invàlida.\"\n\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Falta la funció de cerca del camp \\\"%(field)s\\\" a \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"El valor \\\"%(value)s\\\" del camp \\\"%(field)s\\\" del registre \\\"%(record)s \\\"de\"\n\" \\\"%(model)s\\\" no és un dels seus valors permesos.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Seqüència\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\"No es pot canviar el tipus de seqüència d'una seqüència. Heu de crear una \"\n\"nova seqüència.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"El \\\"Número d'increment\\\" (%(number_increment)s) o el \\\"Següent número\\\" \"\n\"(%(number_next)s) és invalid amb l'excepció \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"El prefix \\\"%(prefix)s\\\" de la seqüència \\\"%(sequence)s\\\" es invàlid.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"El sufix \\\"%(affix)s\\\" de la seqüència \\\"%(sequence)s\\\" es invàlid.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"L'última data-hora no pot ser en el futur per la seqüència \\\"%s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"No s'ha trobat la seqüència.\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Falta funció d'escriptura del camp \\\"%(field)s\\\" a \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"El valor del camp \\\"%(field)s\\\" del registre \\\"%(record)s\\\" de \\\"%(model)s\\\"\"\n\" es massa llarg (%(size)i > %(max_size)i).\"\n\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"El valor del camp \\\"%(field)s\\\" del registre \\\"%(record)s\\\" de \\\"%(model)s\\\"\"\n\" es massa llarg (%(size)i > %(max_size)i).\"\n\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"El valor de temps \\\"%(value)s\\\" del camp %(field)s\\\" del registre \"\n\"\\\"%(record)s\\\" de \\\"%(model)s\\\" no és vàlid.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"M\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"A\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"d\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"h\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"m\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"s\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"S\"\n\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"S'han trobat massa relacions: \\\"%(value)r\\\" en \\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\"No podeu exportar la traducció \\\"%(name)\\\"s perquè s'ha sobreescrit en el \"\n\"mòdul \\\"%(overriding_module)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\"La condició \\\"%(condition)s\\\" no és una expressió PYSON vàlida pel \"\n\"disparador \\\"%(trigger)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Error de sintaxis per al valor: %(value)r\\\" en \\\"%(field)s\\\" de \"\n\"\\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"El XML de la vista \\\"%(name)s\\\" és invàlid.\"\n\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\"El domini o el criteri de cerca \\\"%(domain)s\\\" de l'acció \\\"%(action)s\\\" es \"\n\"invàlid.\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\"Esteu intentant escriure als registres \\\"%(ids)s\\\" del model \\\"%(model)s\\\" \"\n\"que ja no existeixen.\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"No podeu modificar els registres \\\"%(ids)s\\\" de \\\"%(model)s\\\" per almenys una d'aquestes regles:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"No podeu modificar aquest registre.\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Error de sintaxis per l'ID de XML: %(value)r\\\" en \\\"%(field)s\\\" de \"\n\"\\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Accés model\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"Esteu segurs que voleu carregar les traduccions dels idiomes?\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"Esteu segurs que voleu eliminar les traduccions dels idiomes?\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"Botó model\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Executa una vegada\"\n\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"Obre\"\n\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Processa\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"Resoldre\"\n\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Carrega traduccions\"\n\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Elimina traduccions\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Sincronitza\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Marca per activar\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel·la activació\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Marca per desactivar (beta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel·la desactivació\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Marca per actualitzar\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel·la actualització\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Mostra\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"Reinicis botó de model\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"Clics botó de model\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"Regla botó del model\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"Dades del model\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"Camp model\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"Permís camp del model\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"Imprimeix gràfica del model\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Mòdul\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"Finalització de l'activació/actualització de mòduls\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"Inici activació/actualització mòdul\"\n\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Configurar els mòduls\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"Finalització de l'assistent de configuració de mòduls\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"Inicialització de l'assistent de configuració del mòdul\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"Assistent configuració després d'activar un mòdul\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"Un altre assistent de configuració del mòdul\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"Dependències del mòdul\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Nota\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"Nota llegida\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"Cua\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"Regla\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"Regla grup\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Seqüència\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Seqüències estrictes\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Tipus de seqüència\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"Sessions\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"Assistent sessions\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Traducció\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Neteja traducció\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Neteja traducció\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Exporta traducció\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Exporta traducció\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Defineix traduccions\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Defineix traduccions\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"Actualització traduccions\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Disparador\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"Historial disparadors\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Icona\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"UI menú\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Accions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Accions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Accions de finestra\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Informes\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Assistents\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Administració\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Adjunts\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Assistents de configuració\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Accions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Correus electrònics\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"Plantilles de correu electrònic\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"Errors\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exportacions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icones\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"Tipus\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Idiomes\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Localització\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menú\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"Missatge\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Accés model\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Botons\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Dades\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Accés camps\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Realitza activacions/actualitzacions pendents\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Mòduls\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Mòduls\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Regles dels registres\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Planificador de tasques\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Seqüències\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Seqüències estrictes\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Seqüències\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Neteja traduccions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Exporta traduccions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Traduccions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Defineix traduccions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Sincronitza traduccions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Disparadors\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"Interfície de l'usuari\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Vistes\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"Cerques preferides\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"Opcionals vista d'arbre\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Estat de l'arbre\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"Amplada vista d'arbre\"\n\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Camps\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"Menú favorit\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Vista\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Mostrar vista\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"Cerques preferides\"\n\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"Opcionals vista d'arbre\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"Estat de la vista arbre\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"Amplada vista d'arbre\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"Llistats\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Seleccionats\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"Llistats\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Seleccionats\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"Acció formulari\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"Formulari relacionat\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"Obrir gràfica\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"Obrir arbre\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"Imprimir formulari\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"Llistats\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Seleccionats\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"Llistats\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Seleccionats\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"Llistats\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Seleccionats\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Dades\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"Vincle\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"Dies\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"Hores\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"Minuts\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"Mes\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"Setmanes\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"Netejar errors\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"Neteja la cua de tasques\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"Executa disparadors de temps\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Acció\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"Tasca\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"Obert\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"En procés\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"Resolt\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"D'esquerra a dreta\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"De dreta a esquerra\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"Activat\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Desactivat\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"Per ser activat\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"Per eliminar\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Per actualitzar\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"Finalitzat\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"Pendent\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"Activat\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Desactivat\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"Per ser activat\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"Per eliminar\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Per actualitzar\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"No es coneix\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Data-hora decimal\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Data-hora hexadecimal\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"Incremental\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Data-hora decimal\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Data-hora hexadecimal\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"Incremental\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Camp\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"Ajuda\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Informe\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"Selecció\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Vista\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"Botó de l'assistent\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"Taulell\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"Calendari\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"Formulari\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Gràfica\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"Llista formulari\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"Arbre\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"General\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"Edita\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"General\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"General\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"General\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"General\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"Document\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"Hora última modificació\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"A\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"Cada\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"Data següent execució\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"Hora següent execució\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Executa una vegada\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"Destinataris ocults:\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"Destinataris:\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"Destinataris secundaris:\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"Origen\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"Ara podeu carregar traduccions addicionals als sistema.\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"Format data\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"Format de la moneda\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"Format dels números\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"Els mòduls han estat actualitzats/activats.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"Tingueu en compte que aquesta operació pot trigar uns minuts.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"El seu sistema serà actualitzat.\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"Ara podeu activar mòduls addicionals al sistema.\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"La configuració s'ha realitzat correctament.\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\"Heu de configurar la vostra instal·lació segons els mòduls que heu \"\n\"instal·lat.\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel·la activació\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel·la desactivació\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel·la actualització\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Marca per activar\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Marca per desactivar (beta)\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Per actualitzar\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"Hora\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"Usuari\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\"Si no hi ha un test definit, la regla es compleix sempre si no és global.\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"La regla es compleix si almenys un test és cert.\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"${day}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"${month}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"${year}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"Dia:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"Increment\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"Llegenda (marcadors per prefix, sufix)\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"Mes:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"Data-hora\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"Any:\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"Neteja traduccions?\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"Les traduccions s'han netejat correctament.\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Voleu sincronitzar les traduccions?\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"Les traduccions s'han establert correctament.\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancel·la\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"Carrega\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancel·la\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"Imprimir\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"D'acord\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancel·la\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"Inicia actualització\"\n\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Activa\"\n\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancel·la\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"D'acord\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"D'acord\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancel·la\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"Següent\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancel·la\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"Neteja\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancel·la\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"D'acord\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"Tanca\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancel·la\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Exporta\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancel·la\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"Defineix\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"D'acord\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancel·la\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"Actualitza\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"Tanca\"\n"
  },
  {
    "path": "trytond/ir/locale/cs.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"Languages\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Models Access\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Reports\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Tree State\"\n\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Exports\"\n\n#, fuzzy\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Clicks\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Buttons\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Buttons\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Buttons\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Out of Sync\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Fields\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Notes\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Triggers\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Fields\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"Views\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Fields\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icons\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Clicks\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Buttons\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Perform Pending Activation/Upgrade\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Module Configuration\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Clean Translations\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Export Translations\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Set Translations\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Show View\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Workflow Graph\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"All\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"All\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Out of Sync\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Local\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Attachments\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Exports\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Languages\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Bulgarian\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Català\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Czech\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"German\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"English\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Spanish\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Spanish (Latin American)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"French\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Hungarian\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italian\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Lao\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Lithuanian\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Dutch\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Polish\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Russian\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Slovenian\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Chinese Simplified\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"This record is part of the base configuration.\"\n\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Scheduled Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" exceeds the \"\n\"digits limit of \\\"%(digits)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"The value of the field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not valid according\"\n\" to its domain.\"\n\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Syntax error for reference %r in %s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Relation not found: %r in %s\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not in \"\n\"the selection.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Sequences\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Too many relations found: %r in %s\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"You are not allowed to modify this record.\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Models Access\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Clean Translations\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Sync\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Mark for Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Show\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Sequences\"\n\n#, fuzzy\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Sequences Strict\"\n\n#, fuzzy\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Export Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Export Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Set Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Set Translations\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Triggers\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Administration\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icons\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Localization\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Buttons\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Perform Pending Activation/Upgrade\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Scheduler\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Clean Translations\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Export Translations\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Set Translations\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"User Interface\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Show View\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\n#, fuzzy\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Fields\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Reports\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Views\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel Upgrade\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Mark for Upgrade\"\n\n#, fuzzy\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"Clean Translations\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Synchronize Translations\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Actions\"\n\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Exports\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"\"\n"
  },
  {
    "path": "trytond/ir/locale/de.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icon\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Schlüsselwörter\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"Datensätze\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"Gebrauch\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"Wertebereiche (Domains)\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Sichten\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Aktion\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"Kontext\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"Kontext des Wertebereichs\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"Kontextmodell\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"Wertebereich (Domain)\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"Wertebereiche (Domains)\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icon\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Schlüsselwörter\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"Limit\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"Wert Reihenfolge\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"PySON Kontext\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"PySON Wertebereich (Domain)\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"Reihenfolge PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"PySON Suchkriterien\"\n\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"Datensätze\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"Suchkriterien\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"Gebrauch\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Sichten\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Aktion\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"Anzahl\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"Wertebereich (Domain)\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Aktion\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Sicht\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Aktion\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"Schlüsselwort\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Aktion\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"Direktdruck\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"Dokumententyp\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icon\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"Ist personalisiert\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Schlüsselwörter\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Bezeichnung des Datensatzes\"\n\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"Datensätze\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"Pfad\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"Inhalt\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"Inhalt\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"HTML-Inhalt\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"Inhalt Name\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"Interner Name\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"Einzeln\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"Erweiterung Vorlage\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Übersetzbar\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"Gebrauch\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Aktion\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icon\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Schlüsselwörter\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"Datensätze\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"URL\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"Gebrauch\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Aktion\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icon\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Schlüsselwörter\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"Datensätze\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"Gebrauch\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"Separates Fenster\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"Assistentenname\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Kopieren zu Ressourcen\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Kopieren zu Ressourcen Sichtbar\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Daten\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"Größe\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Beschreibung\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"Datei ID\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Letzte Änderung\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Letzter Benutzer\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"Verknüpfung\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ressource\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"Kurzbeschreibung\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Kopieren zu Ressourcen\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Kopieren zu Ressourcen Sichtbar\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"Bild\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"Bild ID\"\n\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Letzte Änderung\"\n\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Letzter Benutzer\"\n\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ressource\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"UUID\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"Bild\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"Bild ID\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"Größe\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"Zeitstempel\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Abkürzung\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"Index\"\n\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Abkürzung\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"Index\"\n\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"Hostname\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"Sprache\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"Tag\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"Stunde(n)\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"Intervallanzahl\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"Intervall-Typ\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"Methode\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"Minute(n)\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"Nächster Aufruf\"\n\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"Zeitzone\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"Wochentag\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"Adressen\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"Um\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"Textkörper\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"Empfänger\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Versteckte Empfänger\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Sekundäre Empfänger\"\n\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ressource\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"Betreff\"\n\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"Adresse\"\n\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"E-Mail\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"Textkörper\"\n\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Modellname\"\n\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"Empfänger\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Versteckte Empfänger\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Versteckte Empfänger\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"Empfänger\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Sekundäre Empfänger\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Sekundäre Empfänger\"\n\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Berichte\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"Betreff\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Bericht\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"Vorlage\"\n\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Beschreibung\"\n\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"Nachricht\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"Herkunft\"\n\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"Bearbeitet von\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"Behoben von\"\n\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Status\"\n\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"Kurzbeschreibung\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Export ID\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"Kopfzeile\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Name Export\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ressource\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Export\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Feldname\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"AM\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"Code\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Datum\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Dezimalpunkt\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"Richtung\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Gruppierung\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Dezimalpunkt\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Gruppierung\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Tausendertrennzeichen\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"Negativer Wert mit führendem Symbol\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"Negativer Wert durch Leerzeichen getrennt\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"Position negatives Vorzeichen\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"Negatives Vorzeichen\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"Positiver Wert mit führendem Symbol\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"Positiver Wert durch Leerzeichen getrennt\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"Position positives Vorzeichen\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"Code des Elterndatensatzes\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"PostgreSQL Textsuche Einstellungen\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"PM\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"Positives Vorzeichen\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Tausendertrennzeichen\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Übersetzbar\"\n\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Sprachen\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"Text\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Felder\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"Globale Suche\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"Information\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"Modellname\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"Modell Beschreibung\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Beschreibung\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppe\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Erstellen\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Löschen\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Lesen\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Schreiben\"\n\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Klicks\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"Bestätigen\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"Hilfe\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"Zurücksetzen\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"Zurückgesetzt durch\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"Datensatzregeln\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"Etikett (Label)\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Anzahl\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"Gesteuerter Button\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Button\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"Datensatz ID\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Button\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"Bedingung\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Beschreibung\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"Benutzeranzahl\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID Ressource\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"Identifikator im Dateisystem\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"Werte im Dateisystem\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"Kein Update\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Nicht synchronisiert\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"Werte\"\n\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Zugriff\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"Beschreibung\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"Hilfe\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"Beziehung Modell\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"Feldtyp\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Beschreibung\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Feld\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppe\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Erstellen\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Löschen\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Lesen\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Schreiben\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Filter\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"Ebene\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"Untergeordnet (Module)\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"Abhängigkeiten\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"Übergeordnet (Module)\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"Status\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"Version\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"Zu aktualisierende Module\"\n\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Aktion\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"Status\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"Prozentsatz\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"Status\"\n\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Kopieren zu Ressourcen\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Kopieren zu Ressourcen Sichtbar\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Letzte Änderung\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Letzter Benutzer\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"Nachricht\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"Nachricht\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ressource\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"Ungelesen\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Notiz\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Daten\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"Aus der Warteschlange entfernt um\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"In die Warteschlange eingefügt um\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"Erwartet um\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"Beendet um\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"Geplant um\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"Wertebereich (Domain)\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Gruppe\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"Standard\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"Global\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Erstellen\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Löschen\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Lesen\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Schreiben\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"Tests\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Letzter Zeitstempel\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Name Nummernkreis\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Schrittweite\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Nächste Nummer\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Nächste Nummer\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Feste Länge (Vornullen)\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Präfix\"\n\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Nummernkreistyp\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Suffix\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Zeitstempel Versatz\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Zeitstempel Rundung\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Letzter Zeitstempel\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Name Nummernkreis\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Schrittweite\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Nächste Nummer\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Nächste Nummer\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Feste Länge (Vornullen)\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Präfix\"\n\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Nummernkreistyp\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Suffix\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Zeitstempel Versatz\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Zeitstempel Rundung\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Name Nummernkreis\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"Schlüssel\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Daten\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"Fuzzy\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Sprache\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"Feldname\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"Überschreibendes Modul\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID Ressource\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"Quelle\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"Übersetzung\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"Datei\"\n\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"Dateiname\"\n\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Sprache\"\n\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Sprache\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Sprache\"\n\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Aktion\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"Bedingung\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"Limit Durchläufe\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"Minimalverzögerung\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"Bei der Erstellung\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"Beim Löschen\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"Zeitgesteuert\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"Beim Schreiben\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"Datensatz ID\"\n\n# https://de.wikipedia.org/wiki/Datenbanktrigger\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Trigger\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icon\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"Pfad\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Aktion\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"Aktionsschlüsselwörter\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"Untergeordnet (Menüs)\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"Vollständiger Name\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"Favorit\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icon\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Menü\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"Übergeordnet (Menü)\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menü\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"Architektur Sicht\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Daten\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"Wertebereich (Domain)\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"Untergeordnetes Feld\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"Vererbte Sicht\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"Priorität\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"Sichtentyp\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"Wertebereich (Domain)\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Feld\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"Wert\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"Sicht ID\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"Name untergeordnetes Element\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"Wertebereich (Domain)\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"Expandierte Knoten\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"Ausgewählte Knoten\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Feld\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"Breite\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Auf diese Datensätze wird die Aktion angewendet.\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"Teil des Wertebereichs der bei jeder Aktualisierung ausgewertet wird.\"\n\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"Standardobergrenze für die Listenansicht.\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Auf diese Datensätze wird die Aktion angewendet.\"\n\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"Standardsuchwerte in der Listenansicht.\"\n\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\"Leer lassen für dasselbe Format wie in 'Erweiterung Vorlage', siehe unoconv-\"\n\"Dokumentation für kompatible Formate.\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\"Ein Genshi-Ausdruck um den Berichtsnamen für den Datensatz (repräsentiert durch \\\"record\\\") berechnet.\\n\"\n\"Leer lassen, um den Standardnamen des Berichts zu verwenden.\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Auf diese Datensätze wird die Aktion angewendet.\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"\"\n\"Aktivieren falls das Modell nur mit einem einzelnen Datensatz funktioniert.\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"Deaktivieren um Übersetzungen dieses Berichts zu verhindern.\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Auf diese Datensätze wird die Aktion angewendet.\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Auf diese Datensätze wird die Aktion angewendet.\"\n\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"Assistent in separatem Fenster ausführen.\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"Das Feld das den/die Empfänger enthält.\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"Das Feld das die sekundären Empfänger enthält.\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Ein PYSON-Ausdruck, der mit dem Datensatz (repräsentiert durch \\\"self\\\") \"\n\"ausgewertet wird und eine Liste von versteckten Empfängern generiert.\"\n\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Ein PYSON-Ausdruck, der mit dem Datensatz (repräsentiert durch \\\"self\\\") \"\n\"ausgewertet wird und eine Liste von Empfängern generiert.\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"Das Feld das den/die sekundären Empfänger enthält.\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Ein PYSON-Ausdruck, der mit dem Datensatz (repräsentiert durch \\\"self\\\") \"\n\"ausgewertet wird und eine Liste von sekundären Empfängern generiert.\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"Aktivieren, um die Feldnamen in den Export aufzunehmen.\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"RFC 4646 Tag.\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"Code des außerordentlichen Elternsatzes\"\n\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"Modul, in dem dieses Modell definiert ist.\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\"Der Text der zur Benutzerbestätigung beim Button-Klick erscheinen soll.\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"Button zum Zurücksetzen der Regeln.\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\"Ein PYSON-Ausdruck, der mit dem Datensatz (repräsentiert durch \\\"self\\\") ausgewertet wird.\\n\"\n\"Die Aktion wird ausgelöst, wenn der Ausdruck zutrifft (Wahr ist).\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"Die ID des Datensatzes in der Datenbank.\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"Die ID des Datensatzes wie im Dateisystem bekannt.\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\"Bei Aktivierung werden die Berechtigungen für das Modell des Feldes auch \"\n\"gegen die Relation des Feldes geprüft.\"\n\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"Modul, in dem dieses Feld definiert ist.\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\"Die Eingabe eines Python Regulären Ausdrucks wird passende Modelle vom \"\n\"Diagramm ausschließen.\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"Wann die Aufgabe erledigt werden soll.\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"Wann die Aufgabe gestartet werden kann.\"\n\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\"Wertebereich (Domain) wird ausgewertet mit einem PYSON Kontext, der enthält:\\n\"\n\"- \\\"user\\\" als der aktuelle Benutzer\\n\"\n\"- \\\"groups\\\" als Liste von IDs der Gruppen des aktuellen Benutzers\"\n\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"Diese Regel als Standardregel für alle Benutzer festlegen.\"\n\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\"Regel global setzen\\n\"\n\"damit jeder Benutzer die Regel befolgen muss.\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\"Wird dem Benutzer angezeigt, wenn Zugriffsfehler für diese Regel ausgelöst \"\n\"wird.\"\n\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\"Die Regel wird gültig bewertet, wenn wenigstens ein Test positiv (True) ist.\"\n\n# https://de.wikipedia.org/wiki/Datenbanktrigger\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\"Ein PYSON-Ausdruck, der mit dem Datensatz (repräsentiert durch \\\"self\\\") ausgewertet wird.\\n\"\n\"Die Aktion wird ausgelöst, wenn der Ausdruck zutrifft (Wahr ist).\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\"Begrenzung der Anzahl von Aufrufen von \\\"Aktion Funktion\\\" durch Datensätze.\\n\"\n\"0 bedeutet kein Limit.\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\"Einen Minimalzeitraum setzen für den Aufruf von 'Aktionsfunktion' für denselben Datensatz.\\n\"\n\"Leer bedeutet keine Verzögerung.\"\n\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"PYSON Wertebereich (Domain).\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Aktion\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Aktionen des Fensters\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Aktionen\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Berichte\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Assistenten\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Anhänge\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Elemente des Konfigurationsassistenten\"\n\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Aktionen\"\n\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"E-Mails\"\n\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"E-Mail Archiv\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"E-Mail Vorlagen\"\n\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"Fehler\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exporte\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icons\"\n\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Sprachen konfigurieren\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Sprachen\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menü\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Menü\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"Nachricht\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Berechtigungen für Modelle\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Zugriff\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Klicks\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Knöpfe\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Daten\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Zugriffsberechtigungen Felder\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Zugriff\"\n\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Felder\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Modelle\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Vorgemerkte Aktivierungen / Aktualisierungen durchführen\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Module konfigurieren\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Modulkonfiguration\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Module\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notizen\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Datensatzregeln\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Nummernkreise\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Strikte Nummernkreise\"\n\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"Typen\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Übersetzungen bereinigen\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Übersetzungen exportieren\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Übersetzungen\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Übersetzungen\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Übersetzungen aktualisieren\"\n\n# Übersetzungen eingeben ist IMHO passender, weil hier tatsächlich eine\n# Spreche angegeben wird in der dann übersetzt werden soll.\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Übersetzungen eingeben\"\n\n# https://de.wikipedia.org/wiki/Datenbanktrigger\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Trigger\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Sichten\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"Suchansicht\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Sicht anzeigen\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"Optionale Listen-/Baumansicht\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Status Menübaum\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"Spaltenbreiten der Baumansichten\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Diagramm\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Diagramm\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Workflow Diagramm\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Übersetzungen\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"Aktion aktives Fenster\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"Wertebereich Aktion Aktuelles Fenster\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Alle\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"Offen\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"In Bearbeitung\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Alle\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Nicht synchron\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Lokal\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Module\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"Aktion aktives Fenster Sicht\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"Aktion Schlüsselwort\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"Aktion Bericht\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"Aktion URL\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"Aktion Assistent\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Anhang\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"Avatar Cache\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"Fr\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"Mo\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"Sa\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"So\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"Do\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"Di\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"Mi\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"Tag\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"Freitag\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"Montag\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"Samstag\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"Sonntag\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"Donnerstag\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"Dienstag\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"Mittwoch\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"Apr\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"Aug\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"Dez\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"Feb\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"Jan\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"Jul\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"Jun\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"Mär\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"Mai\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"Nov\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"Okt\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"Sep\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"Monat\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"April\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"August\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"Dezember\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"Februar\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"Januar\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"Juli\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"Juni\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"März\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"Mai\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"November\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"Oktober\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"September\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"Einstellungen\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"Zeitplaner\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Datum\"\n\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"E-Mail\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"E-Mail Adresse\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"E-Mail Vorlage\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"E-Mail Vorlage - Bericht\"\n\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"Fehler\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Export\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"Export Zeile\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Sprache\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Bulgarisch\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Katalanisch\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Tschechisch\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"Deutsch\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"Englisch\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Spanisch\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Spanisch (Lateinamerikanisch)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"Estnisch\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"Persisch\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"Finnisch\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"Französisch\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Ungarisch\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"Indonesisch\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italienisch\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Laotisch\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Litauisch\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Niederländisch\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Polnisch\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"Portugiesisch\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"Rumänisch\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Russisch\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Slowenisch\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"Türkisch\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Chinesisch (Vereinfacht)\"\n\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Sprachen konfigurieren\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"Nachricht\"\n\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"Der Aufruf von Button \\\"%(button)s\\\" auf \\\"%(model)s\\\" ist nicht erlaubt.\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"Keine Zugriffsberechtigung für \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"Keine Zugriffsberechtigung für \\\"%(model)s.%(field)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"Keine Berechtigung zum Ausführen von Assistent \\\"%(wizard)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Keine Berechtigung zum Ausführen von Assistent \\\"%(wizard)s\\\" auf \"\n\"\\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Ungültiger Kontext \\\"%(context)s\\\" in Aktion \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\"Ungültiger Wertebereich (Domain) oder ungültige Suchkriterien \\\"%(domain)s\\\"\"\n\" in Aktion \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Ungültige Sicht \\\"%(view)s\\\" für Aktion \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"Falsches Assistentenmodell in Schlüsselwort-Aktion \\\"%(name)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Aktiv\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"Deaktivieren um die zukünftige Nutzung zu verhindern.\"\n\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Anhänge\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"Es kann nur einen Avatar pro Ressource geben.\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"Die Größe des Avatars muss eindeutig sein.\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"Avatar URL\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"Avatare\"\n\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"Dieser Datensatz ist Teil der Basiskonfiguration.\"\n\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"Der Name des Buttons muss pro Modell eindeutig sein.\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Sie sind nicht berechtigt Datensätze vom Typ \\\"%(model)s\\\" zu erstellen, da sie gegen mindestens eine der folgenden Regeln verstoßen:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"Erstellungsdatum\"\n\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"Erstellt durch\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Sie sind aufgrund mindestens einer der folgenden Regeln nicht berechtigt die Datensätze \\\"%(ids)s\\\" vom Typ \\\"%(model)s\\\" zu löschen:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"Sie sind nicht berechtigt, diesen Datensatz zu löschen.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"Nein\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"Boolescher Ausdruck\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"Zeichenfolge\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Datum\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"Zeitpunkt\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"Nachkommastellen\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"Wertebereich (Domain)\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"Fließkommazahl\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"Hilfe\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Hilfetext Auswahl\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\"Je Zeile eine durch \\\":\\\" getrennte Kombination aus Schlüssel und Hilfetext.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Auswahl Hilfetext JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"Ganzzahl\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"Ungültiger Wertebereich (Domain) in Schema \\\"%(schema)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Ungültige Hilfetextauswahl in Schema \\\"%(schema)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Ungültige Auswahl in Schema \\\"%(schema)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Mehrfachauswahl\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"Numerisch\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Auswahl\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\"Je Zeile eine durch \\\":\\\" getrennte Kombination aus Schlüssel und Feldname.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"Auswahl JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"Auswahl Sortiert\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"Aktivieren, wenn die Auswahl nach Feldname sortiert werden soll.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"Zeichenkette\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"Ja\"\n\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"Die Anzahl der Nachkommastellen im Wert \\\"%(value)s\\\" für Feld \\\"%(field)s\\\"\"\n\" von \\\"%(model)s\\\" überschreitet das Limit von \\\"%(digits)i\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"Der Wert \\\"%(value)s\\\" des Feldes \\\"%(field)s\\\" in \\\"%(record)s\\\" von \"\n\"\\\"%(model)s\\\" liegt nicht im gültigen Wertebereich (Domain).\"\n\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"Bearbeitet um\"\n\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"Bearbeitet von\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Ungültiger Textköper in E-Mail-Vorlage \\\"%(template)s\\\" mit Fehler \"\n\"\\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Ungültiger PYSON-Ausdruck \\\"%(field)s\\\" in E-Mail Vorlage \\\"%(template)s mit\"\n\" Fehler \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\"Der PYSON-Ausdruck %(field)s in E-Mail Vorlage \\\"%(template)s\\\" muss eine \"\n\"Liste generieren.\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Ungültiger Betreff in E-Mail-Vorlage \\\"%(template)s\\\" mit Fehler \"\n\"\\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"%(field)s (Modellname)\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"%(field)s (Zeichenkette)\"\n\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"Der Wert \\\"%(value)s\\\" für Feld \\\"%(field)s\\\" in \\\"%(record)s\\\" von \"\n\"\\\"%(model)s\\\" enthält die ungültigen Zeichen \\\"%(chars)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Die Datensätze konnten nicht gelöscht werden, weil sie im Feld \\\"%(field)s\\\"\"\n\" von \\\"%(model)s\\\" genutzt werden.\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"Der Wert \\\"%(value)s\\\" des Feldes \\\"%(field)s\\\" in \\\"%(model)s\\\" existiert nicht.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"Speichern fehlgeschlagen, bitte erneut versuchen.\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"ID muss positiv sein.\"\n\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"Der Code einer Sprache muss eindeutig sein.\"\n\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"Die Standardsprache \\\"%(language)s\\\" muss übersetzbar sein.\"\n\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"Die Standardsprache \\\"%(language)s\\\" kann nicht gelöscht werden.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Ungültiges Datumsformat \\\"%(format)s\\\" in Sprache \\\"%(language)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Ungültige Gruppierung \\\"%(grouping)s\\\" in Sprache \\\"%(language)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\"Die Bedingung \\\"%(condition)s\\\" für Button-Regel \\\"%(rule)s\\\" ist kein \"\n\"gültiger PYSON-Ausdruck.\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\"Einige aktivierte Module hängen von jenen ab, die deaktiviert werden sollen:\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"\"\n\"Ein bereits aktiviertes oder für die Aktivierung vorgemerktes Modul kann \"\n\"nicht entfernt werden.\"\n\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Notizen\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\"Leseversuch von nicht mehr vorhandenen Datensätzen \\\"%(ids)s\\\". \"\n\"(Dokumententyp: \\\"%(model)s\\\").\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Die sind aufgrund mindestens einer der folgenden Regeln nicht berechtigt, die Datensätze \\\"%(ids)s\\\" vom Typ \\\"%(model)s\\\" zu lesen:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Bezeichnung des Datensatzes\"\n\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Rekursionsfehler: Datensatz \\\"%(rec_name)s\\\" mit übergeordnetem Datensatz \"\n\"\\\"%(parent_rec_name)s\\\" wurde als sein eigener Vorgänger definiert.\"\n\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Syntaxfehler für Referenz: %(value)r in \\\"%(field)s\\\" von \\\"%(model)s\\\" \"\n\"(%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Beziehung nicht gefunden: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"Ungültige Definition für E-Mail in Bericht \\\"%(name)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Ungültige Definition für den Berichtsnamen von Bericht \\\"%(report)s\\\" mit \"\n\"Fehler \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Für das Feld \\\"%(field)s\\\" von \\\"%(model)s\\\" ist ein Wert erforderlich.\"\n\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Für das Feld \\\"%(field)s\\\" in \\\"%(record)s\\\" von \\\"%(model)s\\\" ist ein Wert \"\n\"erforderlich.\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"Die Ressourcen zu denen dieser Datensatz kopiert werden muss.\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"Ungültiger Wertebereich (Domain) in Regel \\\"%(name)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Fehlende Suchfunktion für Feld \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"Der Wert \\\"%(value)s\\\" von Feld \\\"%(field)s\\\" in \\\"%(record)s\\\" von \"\n\"\\\"%(model)s\\\" ist nicht in der Auswahl enthalten.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Reihenfolge\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\"Der Typ eines Nummernkreises kann nicht geändert werden. Es sollte \"\n\"stattdessen ein neuer Nummernkreis erstellt werden.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Ungültige \\\"Schrittweite\\\" (%(number_increment)s) oder \\\"Nächste Nummer\\\" \"\n\"(%(number_next)s) mit Fehler \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Ungültiger Präfix \\\"%(affix)s\\\" in Nummernkreis \\\"%(sequence)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Ungültiger Suffix \\\"%(affix)s\\\" in Nummernkreis \\\"%(sequence)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"\"\n\"Der \\\"Letzte Zeitstempel\\\" für Nummernkreis \\\"%s\\\" darf nicht in der Zukunft\"\n\" liegen.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"Fehlender Nummernkreis.\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Fehlende Setter-Funktion für das Feld \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"Der Wert \\\"%(value)s\\\" für Feld \\\"%(field)s\\\" in \\\"%(model)s\\\" ist zu lang \"\n\"(%(size)i > %(max_size)i).\"\n\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"Der Wert \\\"%(value)s\\\" für Feld \\\"%(field)s\\\" in \\\"%(record)s\\\" von \"\n\"\\\"%(model)s\\\" ist zu lang (%(size)i > %(max_size)i).\"\n\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"Der Wert der Zeit \\\"%(value)s\\\" für Feld \\\"%(field)s\\\" in \\\"%(record)s\\\" von\"\n\" \\\"%(model)s\\\" ist ungültig.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"m\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"J\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"d\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"h\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"m\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"s\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"w\"\n\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Zu viele Beziehungen gefunden: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\"Übersetzung %(name)s kann nicht exportiert werden, weil sie durch Modul \"\n\"%(overriding_module)s überschrieben wurde.\"\n\n# https://de.wikipedia.org/wiki/Datenbanktrigger\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\"Bedingung \\\"%(condition)s\\\" für Trigger \\\"%(trigger)s\\\" ist kein gültiger \"\n\"PYSON-Ausdruck.\"\n\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Syntaxfehler für Wert: %(value)r in \\\"%(field)s\\\" von \\\"%(model)s\\\" \"\n\"(%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"Ungültige XML-Daten für Sicht \\\"%(name)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\"Ungültiger Wertebereich (Domain) oder ungültige Suchkriterien \\\"%(domain)s\\\"\"\n\" für Suche \\\"%(search)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\"Schreibversuch auf nicht mehr vorhandene Datensätze \\\"%(ids)s\\\". \"\n\"(Dokumententyp: \\\"%(model)s\\\").\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Sie sind aufgrund mindestens einer der folgenden Regeln nicht dazu berechtigt, die Datensätze \\\"%(ids)s\\\" vom Typ \\\"%(model)s\\\" zu verändern:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"Keine Berechtigung für die Änderung dieses Datensatzes.\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Syntaxfehler für XML-ID: %(value)r in \\\"%(field)s\\\" von \\\"%(model)s\\\" \"\n\"(%(column)s).\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Modell Zugriff\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"Übersetzungen der Sprachen laden?\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"Übersetzungen der Sprachen wirklich entfernen?\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"Modell Button\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Einmalig ausführen\"\n\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"Öffnen\"\n\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Bearbeiten\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"Beheben\"\n\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Übersetzungen laden\"\n\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Übersetzungen löschen\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Synchronisation\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Für Aktivierung vormerken\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Aktivierung abbrechen\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Für Deaktivierung vormerken (beta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Deaktivierung abbrechen\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Für die Aktualisierung vormerken\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Vormerkung für Aktualisierung aufheben\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Anzeigen\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"Button Zurücksetzen\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"Modell Button Klick\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"Modell Button Regel\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"Modell Daten\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"Modell Feld\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"Modell Feld Zugriffsberechtigung\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"Modelldiagramm drucken\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"Modulaktivierung/-aktualisierung Erledigt\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"Modulaktivierung/-aktualisierung Start\"\n\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Module konfigurieren\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"Modulkonfigurationsassistent Erledigt\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"Modulkonfigurationsassistent Erster Schritt\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"Konfigurationsassistent nach Modulaktivierung\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"Modulkonfigurationsassistent Weiterer Schritt\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"Modulabhängigkeit\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Notiz\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"Notiz gelesen\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"Warteschlange\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"Regel\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"Regel Gruppe\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Nummernkreis\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Strikter Nummernkreis\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Nummernkreistyp\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"Session\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"Session Assistent\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Übersetzung\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Übersetzung Säuberung\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Übersetzung bereinigen\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Export Übersetzung\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Export Übersetzung\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Übersetzung aktualisieren\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Übersetzung aktualisieren\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"Übersetzung Aktualisierung\"\n\n# https://de.wikipedia.org/wiki/Datenbanktrigger\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Trigger\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"Trigger Protokoll\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Icon\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"Programmoberfläche Menü\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Aktionen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Aktionen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Fensteraktionen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Berichte\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Assistenten\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Verwaltung\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Anhänge\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Konfigurationsassistenten-Elemente\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Aktionen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"E-Mails\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"E-Mail Vorlagen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"Fehler\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exporte\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icons\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"Typen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Sprachen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Lokalisierung\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menü\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"Nachricht\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Berechtigungen für Modelle\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Knöpfe\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Daten\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Zugriffsberechtigungen Felder\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Modelle\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Modelle\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Vorgemerkte Aktivierungen / Aktualisierungen durchführen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Module\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Module\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notizen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Datensatzregeln\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Zeitplaner\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Nummernkreise\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Strikte Nummernkreise\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Nummernkreise\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Übersetzungen bereinigen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Übersetzungen exportieren\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Übersetzungen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Übersetzungen aktualisieren\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Übersetzungen synchronisieren\"\n\n# https://de.wikipedia.org/wiki/Datenbanktrigger\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Trigger\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"Programmoberfläche\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Sichten\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"Suchansicht\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"Optionale Listen-/Baumansicht\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Status Baumansicht\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"Spaltenbreiten Baumansicht\"\n\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Felder\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"Favorit\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Sicht\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Sicht anzeigen\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"Suchansicht\"\n\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"Optionale Listen-/Baumansicht\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"Sicht Baumansicht\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"Spaltenbreiten Sicht\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"Aufgelistete\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Ausgewählte\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"Aufgelistete\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Ausgewählte\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"Formularaktion\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"Bezugsformular\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"Diagramm öffnen\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"Baum öffnen\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"Formular drucken\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"Aufgelistete\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Ausgewählte\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"Aufgelistete\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Ausgewählte\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"Aufgelistete\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Ausgewählte\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Daten\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"Verknüpfung\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"Tag(e)\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"Stunde(n)\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"Minute(n)\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"Monat(e)\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"Woche(n)\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"Fehler bereinigen\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"Task Warteschlange bereinigen\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"Auslösung durch zeitgesteuerte Trigger\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Aktion\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"Aufgabe\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"Offen\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"In Bearbeitung\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"Behoben\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"Links-nach-Rechts\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"Rechts-nach-Links\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"Aktiviert\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Nicht aktiviert\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"Zu aktivieren\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"Für die Deinstallation vorgesehen\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Für die Aktualisierung vorgesehen\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"Erledigt\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"Offen\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"Aktiviert\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Nicht aktiviert\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"Zu aktivieren\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"Für die Deinstallation vorgesehen\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Für die Aktualisierung vorgesehen\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"Unbekannt\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Zeitstempel Dezimal\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Zeitstempel Hexadezimal\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"Inkrementell\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Zeitstempel Dezimal\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Zeitstempel Hexadezimal\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"Inkrementell\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Feld\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"Hilfe\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Modell\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Bericht\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"Auswahl\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Sicht\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"Assistenten-Button\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"Infoseite\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"Kalender\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"Formular\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Diagramm\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"Listenformular\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"Baum\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"Allgemein\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"Bearbeiten\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"Allgemein\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"Allgemein\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"Allgemein\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"Allgemein\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"Dokument\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"Letzte Änderung\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"Um\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"Alle\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"Nächstes Aufrufdatum\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"Nächste Aufrufzeit\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Einmalig ausführen\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"Versteckte Empfänger:\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"Empfänger:\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"Sekundäre Empfänger:\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"Herkunft\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"Es können nun zusätzliche Übersetzungen in das System geladen werden.\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"Format Datum\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"Währungsformat\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"Zahlenformat\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"Die Module wurden installiert bzw. aktiviert.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"Dieser Vorgang kann einige Zeit in Anspruch nehmen.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"Das System wird aktualisiert.\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"Es können nun zusätzliche Module im System aktiviert werden.\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"Die Konfiguration ist beendet.\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"Sie können jetzt die neu installierten Module einrichten.\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Aktivierung abbrechen\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Deaktivierung abbrechen\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Vormerkung für Aktualisierung aufheben\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Für Aktivierung vormerken\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Für Deaktivierung vormerken (beta)\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Für die Aktualisierung vormerken\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Datum\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"Zeit\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\"Wenn kein Test erfasst und die Regel auch nicht als global gekennzeichnet \"\n\"wurde, wird die Regel immer als gültig bewertet.\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\"Die Regel wird als gültig bewertet, wenn wenigstens ein Test positiv (True) \"\n\"ist.\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"${day}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"${month}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"${year}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"Tag:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"Inkrementell\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"Legende (Platzhalter für Präfix, Suffix)\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"Monat:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"Zeitstempel\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"Jahr:\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"Übersetzung bereinigen?\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"Übersetzungen erfolgreich bereinigt.\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Übersetzungen aktualisieren?\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"Übersetzungen erfolgreich aktualisiert.\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Abbrechen\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"Laden\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Abbrechen\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"Drucken\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Abbrechen\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"Aktualisierung starten\"\n\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Aktivieren\"\n\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Abbrechen\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"Abbrechen\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"Weiter\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"Abbrechen\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"Bereinigen\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Abbrechen\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"Schließen\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Abbrechen\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Export\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Abbrechen\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"Aktualisieren\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Abbrechen\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"Eingeben\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"Schließen\"\n"
  },
  {
    "path": "trytond/ir/locale/es.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icono\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Acciones de teclado\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"Registros\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"Dominios\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Vistas\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Acción\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"Valor del contexto\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"Dominio del contexto\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"Modelo del contexto\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"Valor del dominio\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"Dominios\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icono\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Acciones de teclado\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"Límite\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"Valor ordenación\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"Contexto PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"Dominio PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"Orden PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"Criterio de búsqueda PySON\"\n\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"Registros\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"Criterio de búsqueda\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Vistas\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Acción\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"Contador\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"Dominio\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Acción\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Vista\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Acción\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"Acción de teclado\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Acción\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"Impresión directa\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"Extensión\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icono\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"Es personalizado\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Acciones de teclado\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Nombre del registro\"\n\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"Registros\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"Ruta\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"Contenido\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"Contenido\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"Contenido HTML\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"Nombre del contenido\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"Nombre interno\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"Único\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"Tipo documento\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Traducible\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Acción\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icono\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Acciones de teclado\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"Registros\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"Acción de URL\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Acción\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icono\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Acciones de teclado\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"Registros\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"Ventana\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"Nombre del asistente\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Copiar a los recursos\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Copiar a recursos visible\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Datos\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"Tamaño de los datos\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Descripción\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"Identificador del fichero\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Última modificación\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Último usuario\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"Enlace\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"Recurso\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"Resumen\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"Caché\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Copiar a los recursos\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Copiar a los recursos visible\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"Imagen\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"ID de la Imagen\"\n\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Última modificación\"\n\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Último usuario\"\n\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"Recurso\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"Identificador único universal\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"Imagen\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"ID de la Imagen\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"Tamaño\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"Fecha-hora\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Abreviación\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"Índice\"\n\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Abreviación\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"Índice\"\n\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"Nombre del servidor\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"idioma\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"Día\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"Hora\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"Número de intervalos\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"Tipo de intervalo\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"Método\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"Minuto\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"Siguiente llamada\"\n\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"Zona horaria\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"Día de la semana\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"Direcciones\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"El\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"Mensaje\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"Destinatarios\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Destinatarios ocultos\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Destinatarios secundarios\"\n\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"Recurso\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"Asunto\"\n\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"Dirección\"\n\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"Correo electrónico\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"Mensaje\"\n\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Nombre del modelo\"\n\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"Destinatarios\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Destinatarios ocultos\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Destinatarios ocultos\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"Destinatarios\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Destinatarios secundarios\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Destinatarios secundarios\"\n\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Informes\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"Asunto\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Informe\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"Plantilla\"\n\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Descripción\"\n\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"Mensaje\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"Origen\"\n\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"Procesado por\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"Resuelto por\"\n\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Estado\"\n\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"Resumen\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Campos\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"Encabezado\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"Recurso\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Exportar\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"AM\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"Código\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Fecha\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Separador decimal\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"Dirección\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Agrupación\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Separador decimal\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Agrupación\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Separador de miles\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"El signo negativo va delante\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"Signo negativo separado por espacio\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"Posición del signo negativo\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"Signo negativo\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"El signo positivo va delante\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"Signo positivo separado por espacio\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"Posición del signo positivo\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"Código del padre\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"Configuración de búsqueda de texto de PostgreSQL\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"PM\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"Signo positivo\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Separador de miles\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Traducible\"\n\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Idiomas\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"Texto\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Campos\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"Búsqueda global\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"Información\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"Descripción modelo\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Descripción\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Permiso para crear\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Permiso para eliminar\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Permiso para leer\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Permiso para modificar\"\n\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Clics\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"Confirmación\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"Ayuda\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"Reiniciar\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"Reiniciado por\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"Reglas\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"Etiqueta\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Botón\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"Botón con regla\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Botón\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"Identificador del registro\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Botón\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"Condición\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Descripción\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"Número de usuarios\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID del recurso\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"Identificador en el sistema de archivos\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"Valores en sistema de ficheros\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"No actualizar\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Sin sincronizar\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"Valores\"\n\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Acceso\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"Descripción campo\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"Ayuda\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"Relación del modelo\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"Tipo de campo\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Descripción\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Campo\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Permiso para crear\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Permiso para eliminar\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Permiso para leer\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Permiso para modificar\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Filtro\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"Nivel\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"Hijos\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"Dependencias\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"Padres\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"Estado\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"Versión\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"Módulos a actualizar\"\n\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Módulos\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Acción\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"Estado\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"Porcentaje\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"Estado\"\n\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Copiar a los recursos\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Copiar a recursos visible\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Última modificación\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Último usuario\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"Mensaje\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"Mensaje\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"Recurso\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"No leída\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Nota\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Datos\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"Sacado de la cola el\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"Encolado el\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"Previsto para el\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"Terminado el\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"Programado el\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"Dominio\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"Por defecto\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"Global\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Permiso para crear\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Permiso para eliminar\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Permiso para leer\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Permiso para modificar\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"Condiciones\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Última fecha-hora\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nombre de la secuencia\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Cantidad a incrementar\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Siguiente número\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Siguiente número\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Relleno del número\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Prefijo\"\n\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Tipo de secuencia\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Sufijo\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Desfase de fecha-hora\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Redondeo de fecha-hora\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Última fecha-hora\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nombre de la secuencia\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Cantidad a incrementar\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Siguiente número\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Siguiente número\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Relleno del número\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Prefijo\"\n\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Tipo de secuencia\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Sufijo\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Desfase de fecha-hora\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Redondeo de fecha-hora\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nombre de la secuencia\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"Clave\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Datos\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"Revisión\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"Nombre del campo\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"Módulo principal\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID del recurso\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"Original\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"Traducción\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"Archivo\"\n\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"Nombre del archivo\"\n\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Acción\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"Condición\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"Número límite\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"Retraso mínimo\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"Al crear\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"Al eliminar\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"Por tiempo\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"Al modificar\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"ID del registro\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Disparador\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icono\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"Ruta SVG\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Acción\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"Acciones de teclado\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"Hijos\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"Nombre completo\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"Favorito\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icono\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Menú\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"Menú padre\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menú\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"Arquitectura de la vista\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Datos\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"Dominio\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"Campo hijos\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"Vista heredada\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"Prioridad\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"Tipo de vista\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"Dominio\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Campo\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"Valor\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"ID de la vista\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"Nombre del hijo\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"Dominio\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"Expandir nodos\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"Seleccionar nodos\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Campo\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"Ancho\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Los registros sobre los que se ejecuta la acción.\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"La parte del dominio que se va a evaluar cada vez que se refresque.\"\n\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"Límite por defecto en la vista de lista.\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Los registros sobre los que se ejecuta la acción.\"\n\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"Criterio de búsqueda por defecto en la vista de lista.\"\n\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\"Dejarlo vacío para el mismo tipo que la plantilla. Consultar la \"\n\"documentación LibreOffice para conocer los formatos compatibles.\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\"Una expresión de Genshi para calcular el nombre usando 'registro'.\\n\"\n\"Dejar en blanco para el nombre predeterminado.\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Los registros sobre los que se ejecuta la acción.\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"Marcar si la plantilla funciona solo para un registro.\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"Desmarcar para deshabilitar las traducciones de este informe.\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Los registros sobre los que se ejecuta la acción.\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Los registros sobre los que se ejecuta la acción.\"\n\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"Ejecuta el asistente en una nueva ventana.\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"El campo que contiene el/los destinatario/s.\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"El campo que contiene el/los destinatario/s secundario/s.\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Una expresión PYSON que genera una lista de destinatarios ocultos con el \"\n\"registro representado por \\\"self\\\".\"\n\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Una expresión PYSON que genera una lista de destinatarios con el registro \"\n\"representado por \\\"self\\\".\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"El campo que contiene el/los destinatario/s secundario/s.\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Una expresión PYSON que genera una lista de destinatarios secundarios con el\"\n\" registro representado por \\\"self\\\".\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"Marcar para incluir los nombres de los campos en la exportación.\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"Etiqueta RFC 4646.\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"Código del padre excepcional\"\n\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"Módulo donde se define este modelo.\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\"El texto que se va a utilizar para pedir confirmación al ciclar el botón.\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"Botón que debe reiniciar las reglas.\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\"Una expresión PYSON evaluada con el registro representado por \\\"self\\\"\\n\"\n\"Dispara la regla si es cierta.\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"El id del registro en la base de datos.\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"El id del registro que se conoce en el sistema de archivos.\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\"Si se marca, los permisos de acceso al modelo del campo también se \"\n\"comprueban en la relación del campo.\"\n\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"Módulo donde se define este campo.\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\"Una expresión regular de Python para excluir del gráfico modelos que \"\n\"concuerden.\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"Cuando se debe realizar la tarea.\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"Cuando se puede iniciar la tarea.\"\n\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\"El dominio se evalua con PYSON dónde el contexto contiene:\\n\"\n\"- \\\"user\\\" es el usuario actual\\n\"\n\"- \\\"groups\\\" una lista de los ids de los grupos del usuario actual\"\n\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"Añade esta regla a todos los usuarios por defecto.\"\n\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\"Haz esta regla global\\n\"\n\"de esta forma todos los usuarios debe satisfacer esta regla.\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\"Se muestra a los usuarios cuando se produce un error de acceso para esta \"\n\"regla.\"\n\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"La regla es correcta si al menos una condición es cierta.\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\"Una expresión PYSON evaluada con el registro representado por \\\"self\\\"\\n\"\n\"Dispara la acción si es cierta.\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\"Número límite de llamadas a la \\\"Función de la acción\\\".\\n\"\n\"0 para no límite.\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\"Indica un tiempo mínimo de retraso entre llamadas a la \\\"Función de la acción\\\" para el mismo registro.\\n\"\n\"Dejarlo vacío si no hay retraso.\"\n\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"Dominio PYSON.\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Acción\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Acciones de ventana\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Acciones\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Informes\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Asistentes\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Adjuntos\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Asistente de configuración\"\n\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Acciones\"\n\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Correos electrónicos\"\n\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"Archivos de correo electrónico\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"Plantillas de correo electrónico\"\n\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"Errores\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exportaciones\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Iconos\"\n\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Configurar idiomas\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Idiomas\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menú\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Menú\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"Mensaje\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Acceso modelos\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Acceso\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Clics\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Botones\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Datos\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Permisos de los campos\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Acceso\"\n\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Campos\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Modelos\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Realizar activaciones/actualizaciones pendientes\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Configurar los módulos\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Configuración de los módulos\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Módulos\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notas\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Reglas de los registros\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Secuencias\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Secuencias estrictas\"\n\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"Tipos\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Limpiar traducciones\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Exportar traducciones\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Traducciones\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Traducciones\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Definir traducciones\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Sincronizar traducciones\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Disparadores\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Vistas\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"Búsquedas favoritas\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Mostrar vista\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"Opcionales vista lista\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Estado del árbol\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"Ancho de la vista de árbol\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Gráfico\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Gráfico\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Grafo de los estados\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Traducciones\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"Acción de ventana\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"Dominio acción de ventana\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Todo\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"Abierto\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"En proceso\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Todo\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Sin sincronizar\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Local\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Módulos\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"Acción vista de ventana\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"Acción de teclado\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"Acción de informe\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"Acción de URL\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"Acción de asistente\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Adjunto\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"Caché de avatar\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"Caché\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"Vie\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"Lun\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"Sab\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"Dom\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"Jue\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"Mar\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"Mie\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"Día\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"Viernes\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"Lunes\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"Sábado\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"Domingo\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"Jueves\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"Martes\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"Miércoles\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"Abr\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"Ago\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"Dic\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"Feb\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"Ene\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"Jul\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"Jun\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"Mar\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"May\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"Nov\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"Oct\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"Sep\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"Mes\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"Abril\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"Agosto\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"Diciembre\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"Febrero\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"Enero\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"Julio\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"Junio\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"Marzo\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"Mayo\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"Noviembre\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"Octubre\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"Septiembre\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"Configuración\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"Planificador de tareas\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Fecha\"\n\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"Correo electrónico\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"Dirección de correo electrónico\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"Plantilla de correo electrónico\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"Plantilla de correo electrónico - Informe\"\n\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"Error\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Exportar\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"Exportar línea\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Búlgaro\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Catalán\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Checo\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"Alemán\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"Inglés\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Español\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Español (latinoamericano)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"Estonio\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"Persa\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"Finlandés\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"Francés\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Húngaro\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"Indonesio\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italiano\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Laosiano\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Lituano\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Holandés\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Polaco\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"Portugués\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"Rumano\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Ruso\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Esloveno\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"Turco\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Chino simplificado\"\n\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Configurar idiomas\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"Mensaje\"\n\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"La llamada al botón \\\"%(button)s\\\" de \\\"%(model)s\\\" no está permitida.\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"No tiene permisos para acceder a \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"No tiene permisos para acceder a \\\"%(model)s.%(field)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"No tiene permisos para ejecutar el asistente \\\"%(wizard)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"No tiene permisos para ejecutar el asistente \\\"%(wizard)s\\\" en el modelo \"\n\"\\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"El contexto \\\"%(context)s\\\" de la acción \\\"%(action)s\\\" es invalido.\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\"El dominio o el criterio de búsqueda \\\"%(domain)s\\\" de la acción \"\n\"\\\"%(action)s\\\" es invalido.\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"La vista \\\"%(view)s\\\" para la acción \\\"%(action)s\\\" es invalida.\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"\"\n\"El modelo de asistente es incorrecto en la acción de teclado \\\"%(name)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Activo\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"Desmarcar para eliminar el uso en el futuro.\"\n\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Adjuntos\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"Solo es permitido un avatar por recurso.\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"El tamaño de un avatar debe ser único.\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"URL del avatar\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"Avatares\"\n\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"Este registro es parte de la configuración inicial.\"\n\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"El nombre del botón debe ser único por cada modelo.\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"No puede crear registros de \\\"%(model)s\\\" porque incumplen alguna de estas reglas:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"Creado el\"\n\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"Creado por\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"No puede eliminar los registros \\\"%(ids)s\\\" de \\\"%(model)s\\\" debido a alguna de estas reglas:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"No está autorizado para eliminar este registro.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"No\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"Booleano\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"Texto\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Fecha\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"Fecha i hora\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"Dígitos\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"Dominio\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"Númerico coma flotante\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"Ayuda\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Ayuda de la selección\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\"La llave seguida por el texto de ayuda separado por un \\\":\\\", una por línea.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Ayuda de selección JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"Entero\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"Dominio inválido en el esquema \\\"%(schema)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Ayuda de la selección invalida en el esquema \\\"%(schema)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Selección inválida en el esquema \\\"%(schema)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Selección múltiple\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"Numérico\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Selección\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"Una pareja de claves i valores separados por \\\":\\\" en cada línea.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"Selección JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"Selección ordenada\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"Si la selección debe estar ordenada por la etiqueta.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"Etiqueta\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"Sí\"\n\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"El número de dígitos en el valor \\\"%(value)r\\\" del campo \\\"%(field)s\\\" en el\"\n\" registro \\\"%(record)s\\\" de \\\"%(model)s\\\" excede el límite de \"\n\"\\\"%(digits)i\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"El valor \\\"%(value)s\\\" del campo \\\"%(field)s\\\" del registro \\\"%(record)s\\\" \"\n\"de \\\"%(model)s\\\" no es correcto según su dominio.\"\n\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"Editado el\"\n\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"Editado por\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Mensaje invalido en la plantilla de correo electrònico \\\"%(template)s\\\" con \"\n\"la excepción \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Expresión PYSON incorrecta \\\"%(field)s\\\" en la plantilla de correo \"\n\"electrónico \\\"%(template)s\\\" con la excepción \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\"La expresión PYSON \\\"%(field)s\\\" en la plantilla de correo electrónico \"\n\"\\\"%(template)s\\\" debe generar una lista.\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Asunto invalido en la plantilla de correo electrònico \\\"%(template)s\\\" con \"\n\"la excepción \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"%(field)s (nombre del modelo)\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"%(field)s (cadena)\"\n\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"El valor \\\"%(value)s\\\" para el campo \\\"%(field)s\\\" del registro \"\n\"\\\"%(record)s\\\" en \\\"%(model)s\\\" contiene algunos caracteres inválidos \"\n\"\\\"%(chars)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Los registros no pueden eliminarse porque se utilizan en el campo \"\n\"\\\"%(field)s\\\" de \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"El valor \\\"%(value)s\\\" del campo \\\"%(field)s\\\" de \\\"%(model)s\\\" no existe.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"Error al guardar, por favor inténtelo de nuevo.\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"El ID debe ser positivo.\"\n\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"El código del idioma debe ser único.\"\n\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"El idioma por defecto \\\"%(language)s\\\" debe ser traducible.\"\n\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"El idioma por defecto \\\"%(language)s\\\" no se puede eliminar.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"El formato de la fecha \\\"%(format)s\\\" de \\\"%(language)s\\\" es invalido.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"La agrupación \\\"%(grouping)s\\\" del idioma \\\"%(language)s\\\" es invalida.\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\"La condición \\\"%(condition)s\\\" no es una expresión PYSON válida para la \"\n\"regla de botón \\\"%(rule)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\"Algunos módulos activados dependen de los módulos que estas intentando \"\n\"desactivar:\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"No puede eliminar un módulo que está activado o será activado.\"\n\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Notas\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\"Está intentando leer los registros \\\"%(ids)s\\\" del modelo \\\"%(model)s\\\" que \"\n\"ya no existen.\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"No tiene permitido leer los registros \\\"%(ids)s\\\" para \\\"%(model)s\\\" debido a una de las reglas :\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Nombre del registro\"\n\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Error de recursividad: El registro \\\"%(rec_name)s\\\" con el padre \"\n\"\\\"%(parent_rec_name)s\\\" se ha configurado como padre de si mismo.\"\n\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Error de sintaxis para la referencia: \\\"%(value)r\\\" en \\\"%(field)s\\\" de \"\n\"\\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Relación no encontrada: \\\"%(value)r\\\" en \\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"\"\n\"La definición de correo electrónico sobre el informe \\\"%(name)s\\\" es \"\n\"invalida.\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"La definición del nombre de registro no és válida en el informe \"\n\"\\\"%(report)s\\\" con la excepción \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Se requiere un valor para el campo \\\"%(field)s\\\" de \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Se requiere un valor para el campo \\\"%(field)s\\\" en el registro \"\n\"\\\"%(record)s\\\" de \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"Los recursos a los que se debe copiar este registro.\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"El dominio de la regla \\\"%(name)s\\\" no es valido.\"\n\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Falta la función de búsqueda del campo \\\"%(field)s\\\" a \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"El valor \\\"%(value)s\\\" del campo \\\"%(field)s\\\" del registro \\\"%(record)s\\\" \"\n\"en \\\"%(model)s\\\" no es uno de sus valores permitidos.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Secuencia\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\"No puedes cambiar el tipo de secuencia de una secuencia. Crea una nueva \"\n\"secuencia en su lugar.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"El \\\"Número de incremento\\\" (%(number_increment)s) o el \\\"Siguiente Numero\\\"\"\n\" (%(number_next)s) son inválidos con la excepción \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"El prefijo \\\"%(prefix)s\\\" de la secuencia \\\"%(sequence)s\\\" es inválido.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"El sufijo \\\"%(affix)s\\\" de la secuencia \\\"%(sequence)s\\\" es invlido.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"La última fecha-hora no puede ser del futuro para la secuencia \\\"%s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"No se ha encontrado la secuencia.\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Falta la función de escritura para el campo \\\"%(field)s\\\" en \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"El valor del campo \\\"%(field)s\\\" del registro \\\"%(model)s\\\" en \\\"%(model)s\\\"\"\n\" es demasiado largo (%(size)i > %(max_size)i).\"\n\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"El valor del campo \\\"%(field)s\\\" del registro \\\"%(record)s\\\" en \"\n\"\\\"%(model)s\\\" es demasiado largo (%(size)i > %(max_size)i).\"\n\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"El valor del tiempo \\\"%(value)s\\\" del campo \\\"%(field)s\\\" del registro \"\n\"\\\"%(record)s\\\" de \\\"%(model)s) no es valido.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"M\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"A\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"d\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"h\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"m\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"s\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"S\"\n\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"\"\n\"Demasiadas relaciones encontradas: \\\"%(value)r\\\" en \\\"%(model)s\\\" \"\n\"(%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\"No puede exportar la traducción %(name)s porque es una traducción \"\n\"sobreescrita por el módulo %(overriding_module)s.\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\"La condición \\\"%(condition)s\\\" no es una expresión PYSON correcta valida \"\n\"para el disparador \\\"%(trigger)s\\\" .\"\n\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Error de sintaxis para el valor: %(value)r\\\" en \\\"%(field)s\\\" de \"\n\"\\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"El XML de la vista \\\"%(name)s\\\" es invalido.\"\n\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\"El dominio o el criterio de búsqueda \\\"%(domain)s\\\" de la acción \"\n\"\\\"%(action)s\\\" es invalido.\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\"Está intentando escribir en los registros \\\"%(ids)s\\\" de \\\"%(model)s\\\" que \"\n\"ya no existen.\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"No puede modificar los registros \\\"%(ids)s\\\" de \\\"%(model)s\\\" debido a alguna de estas reglas:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"No podéis modificar este registro.\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Error de sintaxis para el id de XML: %(value)r\\\" en \\\"%(field)s\\\" de \"\n\"\\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Acceso modelo\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"¿Está seguro que desea cargar las traducciones de los idiomas?\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"¿Está seguro que desea eliminar las traducciones de los idiomas?\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"Botón modelo\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Ejecutar una vez\"\n\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"Abierto\"\n\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Procesar\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"Resolver\"\n\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Cargar traducciones\"\n\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Eliminar traducciones\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Sincronizar\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Marcar para activar\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancelar activación\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Marcar para desactivar (beta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancelar desactivación\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Marcar para actualizar\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancelar actualización\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Mostrar\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"Restablecer botón de modelo\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"Clic botón de modelo\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"Regla botón de modelo\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"Datos del modelo\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"Campo modelo\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"Acceso campo modelo\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"Imprimir gráfico de modelos\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"Finalización activación/actualización de módulos\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"Iniciar la activación/actualización de módulos\"\n\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Configurar los módulos\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"Finalización asistente de configuración de módulos\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"Asistente de configuración del módulo - Primero\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"Asistente de configuración después de instalar un módulo\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"Otro asistente de configuración del módulo\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"Dependencias del módulo\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Nota\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"Nota leída\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"Cola\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"Regla\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"Grupo de reglas\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Secuencia\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Secuencia estricta\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Tipo de secuencia\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"Sesión\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"Sesión de asistente\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Traducción\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Limpiar traducción\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Limpiar traducción\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Exportar traducción\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Exportar traducción\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Definir traducciones\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Definir traducciones\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"Actualizar traducción\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Disparador\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"Historial disparadores\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Icono\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"Menú UI\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Acciones\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Acciones\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Acciones de ventana\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Informes\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Asistentes\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Administración\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Adjuntos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Asistentes de configuración\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Acciones\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Correos electrónicos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"Plantillas de correo electrónico\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"Errores\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exportaciones\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Iconos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"Tipos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Idiomas\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Localización\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menú\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"Mensaje\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Acceso modelos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Botones\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Datos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Acceso campos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Modelos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Modelos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Realizar activaciones/actualizaciones pendientes\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Módulos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Módulos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notas\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Reglas de los registros\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Programador de tareas\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Secuencias\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Secuencias estrictas\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Secuencias\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Limpiar traducciones\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Exportar traducciones\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Traducciones\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Definir traducciones\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Sincronizar traducciones\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Disparadores\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"Interfaz de usuario\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Vistas\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"Búsquedas favoritas\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"Opcionales vista lista\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Estado de árbol\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"Ancho vista de árbol\"\n\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Campos\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"Menú favorito\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Vista\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Mostrar vista\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"Búsqueda favorita\"\n\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"Opcionales vista lista\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"Estado vista árbol\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"Ancho vista de árbol\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"Listados\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Seleccionados\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"Listados\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Seleccionados\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"Acción de formulario\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"Formulario relacionado\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"Abrir gráfico\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"Abrir árbol\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"Imprimir formulario\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"Listados\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Seleccionados\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"Listados\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Seleccionados\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"Listados\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Seleccionados\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Datos\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"Enlace\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"Días\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"Horas\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"Minutos\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"Meses\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"Semanas\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"Limpiar errores\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"Limpia la cola de tareas\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"Ejecutar disparadores de tiempo\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Acción\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"Tarea\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"Abierto\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"En proceso\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"Resuelto\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"De izquierda a derecha\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"De derecha a izquierda\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"Activado\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Desactivado\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"Para ser activado\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"Para eliminar\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Para actualizar\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"Finalizado\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"Pendiente\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"Activado\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Desactivado\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"Para ser activado\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"Para eliminar\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Para actualizar\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"Desconocido\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Fecha-hora decimal\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Fecha-hora hexadecimal\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"Incremental\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Fecha-hora decimal\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Fecha-hora hexadecimal\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"Incremental\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Campo\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"Ayuda\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Informe\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"Selección\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Vista\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"Botón asistente\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"Tablero\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"Calendario\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"Formulario\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Gráfico\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"Lista formulario\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"Árbol\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"General\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"Editar\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"General\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"General\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"General\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"General\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"Documento\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"Hora última modificación\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"El\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"Cada\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"Fecha siguiente llamada\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"Hora siguiente llamada\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Ejecutar una vez\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"Destinatarios ocultos:\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"Destinatarios:\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"Destinatarios secundarios:\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"Origen\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"Ahora puede cargar traducciones adicionales al sistema.\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"Formato fecha\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"Formato de la moneda\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"Formato de los números\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"Los módulos han sido actualizados/activados.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"Tenga en cuenta que esta operación puede tardar unos minutos.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"Su sistema será actualizado.\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"Ahora puede activar módulos adicionales al sistema.\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"La configuración se ha realizado correctamente.\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\"Deberá configurar su instalación según los módulos que haya instalado.\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancelar activación\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancelar desactivación\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancelar actualización\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Marcar para activar\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Marcar para desactivar (beta)\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Marcar para actualizar\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Fecha\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"Hora\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\"Si no hay ningún test definido, la regla es correcta siempre si no es \"\n\"global.\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"La regla se satisface si al menos una condición es cierta.\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"${day}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"${month}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"${year}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"Día:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"Incremental\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"Leyenda (marcadores para prefijo/sufijo)\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"Mes:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"Fecha-hora\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"Año:\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"¿Limpiar las traducciones?\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"Las traducciones se han limpiado correctamente.\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"¿Sincronizar las traducciones?\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"Las traducciones se han establecido correctamente.\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"Cargar\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"Imprimir\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"Aceptar\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"Iniciar actualización\"\n\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Activar\"\n\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"Aceptar\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"Aceptar\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"Siguiente\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"Limpiar\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"Aceptar\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"Cerrar\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Exportar\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"Definir\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"Aceptar\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"Actualizar\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"Cerrar\"\n"
  },
  {
    "path": "trytond/ir/locale/es_419.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Views\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Acceso a modelos\"\n\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Modificado por usuario\"\n\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Acceso a modelos\"\n\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"Creado por usuario\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Acceso a modelos\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Fields\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Fields\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Modificado por usuario\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"Views\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Fields\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Acciones de ventana\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Elementos del asistente de configuración\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Acciones de ventana\"\n\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Acceso a modelos\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Permisos de acceso a campos\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Perform Pending Installation/Upgrade\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"Ancho de la vista de árbol\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"Ancho de la vista de árbol\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"Creado por usuario\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"Creado por usuario\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"Creado por usuario\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"Creado por usuario\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Acceso a modelos\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Acceso a modelos\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Acciones de ventana\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Elementos del asistente de configuración\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Acciones de ventana\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Acceso a modelos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Permisos de acceso a campos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Perform Pending Installation/Upgrade\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"Ancho de la vista de árbol\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"Ancho de la vista de árbol\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Vista\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"Ancho de la vista de árbol\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"Ancho de la vista de árbol\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Acciones de ventana\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Fields\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Views\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"\"\n"
  },
  {
    "path": "trytond/ir/locale/et.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikoon\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Märksõnad\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Nimetus\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"Kirje ID\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"Tüüp\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"Kasutus\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"Domeenid\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Vaated\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Toiming\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"Konteksti väärtus\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"Konteksti domeen\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"Konteksti mudel\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"Domeeni väärtus\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"Domeenid\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikoon\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Märksõnad\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"Limiit\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Nimetus\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"Tellimuse väärtus\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"PySON kontekst\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"PySON domeen\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"PySON tellimus\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"PySON otsingukriteerium\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"Kirje ID\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"Otsingukriteerium\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"Tüüp\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"Kasutus\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Vaated\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Toiming\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"Loendus\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domeen\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Nimetus\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Toiming\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Vaade\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Toiming\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"Märksõna\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Toiming\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"Otsetrükk\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"Laiendus\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikoon\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"On kohandatud\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Märksõnad\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Moodul\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Kirje nimi\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"Kirje ID\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"Tee\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"Sisu\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"Sisu\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"Sisu HTML\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"Sisu nimetus\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"Sisemine nimi\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"Üksik\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"Malli laiendus\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Tõlgitav\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"Tüüp\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"Kasutatavus\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Toiming\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikoon\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Märksõnad\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"Kirje ID\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"Tüüp\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"Toimingu URL\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"Kasutatavus\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Toiming\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikoon\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Märksõnad\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"Kirje ID\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"Tüüp\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"Kasutatavus\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"Aken\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"Nõustaja nimi\"\n\n#, fuzzy\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Ressurss\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Andmed\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"Andmete maht\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Kirjeldus\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"Faili ID\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Viimati muudetud\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Viimane kasutaja\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"Link\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ressurss\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"Kokkuvõte\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"Tüüp\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"Vahemälu\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Ressurss\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Ressurss\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Viimati muudetud\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Viimane kasutaja\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ressurss\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"Ajatempel\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Lühend\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"Indeks\"\n\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Lühend\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"Indeks\"\n\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"Hostinimi\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"keel\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"Päev\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"Tund\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"Intervalli number\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"Intervalli tüüp\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"Meetod\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"Minut\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"Järgmine kutsung\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"Aeg\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"Nädalapäev\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"Kuupäeval\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ressurss\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"Kasutaja\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"E-kiri\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Mudeli nimi\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Nimetus\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Aruanded\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Aruanne\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"Malli laiendus\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Kirjeldus\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"Sõnum\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"Looja\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Olek\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"Kokkuvõte\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Väljad\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ressurss\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Eksport\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"EL\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"Kood\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Kuupäev\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Kümnendkoha eraldaja\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"Suund\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Grupeerimine\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Kümnendkoha eraldaja\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Grupeerimine\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Tuhandete eraldaja\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"Sümbol, mis eelneb negatiivsele valuutaväärtusele\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"Eralda negatiivne tühikuga\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"Negatiivse märgi positsioon\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"Negatiivne märk\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"Sümbol, mis eelneb positiivsele valuutaväärtusele\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"Eralda positiivne tühikuga\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"Positiivse märgi positsioon\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"Ülemkood\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"PL\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"Positiivne märk\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Tuhandete eraldaja\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Tõlgitav\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Keeled\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"Tekst\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Väljad\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"Üldine otsind\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"Informatsioon\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"Mudeli nimi\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Moodul\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"Mudeli kirjeldus\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Kirjeldus\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Grupp\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Loomisõigus\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Kustutamisõigus\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Lugemisõigus\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Kirjutamisõigus\"\n\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Klikid\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"Kinnita\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"Abi\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"Reset\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"Resettija\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"Reeglid\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"Silt\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Nupp\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Nupp\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"Kirje ID\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Nupp\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"Tingimus\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Kirjeldus\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"Kasutaja number\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"Ressursi ID\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"Failisüsteemi identifikaator\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"Failisüsteemi väärtused\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Moodul\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"Ei ole uuendatud\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Sünkroonist väljas\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"Väärtused\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Ligipääs\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"Välja kirjeldus\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"Abi\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Moodul\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"Mudeli seos\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"Välja tüüp\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Kirjeldus\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Väli\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Grupp\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Loomisõigus\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Kustutamisõigus\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Lugemisõigus\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Kirjutamisõigus\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Filter\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"Tase\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"Alamjaotused\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"Sõltuvused\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"Ülemjaotused\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"Olek\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"Versioon\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"Uuendatavad moodulid\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Moodulid\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Toiming\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"Olek\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"Protsent\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Moodul\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"Olek\"\n\n#, fuzzy\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Ressurss\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Viimane muudatus\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Viimane kasutaja\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"Sõnum\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"Sõnum\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ressurss\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"Mitteloetud\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Märge\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"Kasutaja\"\n\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Andmed\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"Oosatud kuupäev\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"Valmib kuupäeval\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"Planeeritud kuupäeval\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domeen\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Grupp\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"Vaikimisi\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"Globaalne\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Loomisõigus\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Kustutamisõigus\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Lugemisõigus\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Kirjutamisõigus\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"Testid\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Viimane ajatempel\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Järjesutse nimi\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Suurendav arv\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Järgmine number\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Järgmine number\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Eesliide\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Järjestuste tüübid\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Järelliide\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Ajatempli nihe\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Ajatempli ümardus\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"Tüüp\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Viimane ajatempel\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Järjestuse nimi\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Suurendav arv\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Järgmine number\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Järgmine number\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Eesliide\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Järjestuste tüübid\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Järellliide\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Ajatempli nihe\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Ajatempli ümardus\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"Tüüp\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Järjestuse nimi\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"Võti\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Andmed\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"Hägune\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Keel\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Moodul\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"Välja nimi\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"Kirjuta moodul üle\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"Ressursi ID\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"Allikas\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"Tüüp\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"Tõlkeväärtus\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"Fail\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"Fail\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Keel\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Moodul\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Keel\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Moodul\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Keel\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Toiming\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"Tingimus\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"Piirväärtus\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"Minimaalne viide\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"Loomisel\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"Kustutamisel\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"Õigeaegselt\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"Kirjutamisel\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"Kirje ID\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Päästik\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikoon\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Moodul\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"SVG asukoht\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Toiming\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"Toimingu märksõnad\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"Alamjaotus\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"Täielik nimi\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"Lemmik\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikoon\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Menüü\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"Ülemmenüü\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menüü\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"Kasutaja\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"Vaata arhitektuuri\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Andmed\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domeen\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"Alamväli\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"Päritud vaade\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Moodul\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"Prioriteet\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"Vaate tüüp\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domeen\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"Kasutaja\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Väli\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Kasutaja\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"Väärtused\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"Vaade\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"Alamjaotise nimi\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domeen\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"Laiendatud sõlmed\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"Valitud sõlmed\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"Kasutaja\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Väli\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"Kasutaja\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"Laius\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"Nimekirja vaate vaikimisi piir\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"Nimekirja vaate vaikimisi otsingutingimus\"\n\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"Jäta tühjaks, kui vorm rakendub ainult ühele kirjele\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"Eemalda märgistus, et eemaldada kirje tõlkimine\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"Käivita viisard uues aknas\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"Moodul, milles mudel on defineeritud\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"Kasutaja kinnitus, kui vajutatakse nupule.\"\n\n#, fuzzy\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"Nupp, mis taastab reeglite algseaded\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"Kirje ID andmebaasis\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"Moodul, milles väli on defineeritud\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"Millal peaks ülesanne olema täidetud\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"Millal saab ülesandega alustada.\"\n\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"Lisa see reegel kõikidele kasutajatele vaikimisi\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\"Tee reegel üldiseks \\n\"\n\"kõik kasutajad peavad reeglit järgima\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"Näidatakse kasutajale kui rakendub ligipääsu vea reegel\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"Reegli nõuded on täidetud, kui vähemalt üks test on õige\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"PYSON domeen\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Toiming\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Akna toiming\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Toimingud\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Aruanded\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URLid\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Nõustajad\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Manused\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Seadistusnõustaja elemendid\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Toimingud\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"E-kiri\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"E-kiri\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Ekspordid\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Ikoonid\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Moodulite seadistus\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Keeled\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menüü\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Menüü\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"Sõnum\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Mudeli ligipääs\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Ligipääs\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Klikid\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Nupud\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Andmed\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Välja ligipääs\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Ligipääs\"\n\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Väljad\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Mudelid\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Teosta ootel aktiveerimine/uuendus\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Moodulite seadistus\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Mooduli seadistus\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Moodulid\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Märkmed\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Kirje reeglid\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Järjestused\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Järjestuste rangus\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"Tüüp\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Eemalda tõlked\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Ekspordi tõlked\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Tülked\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Tõlked\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Seadista tõlked\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Sünkrooni tõlked\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Päästikud\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Vaated\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"Vaate otsing\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Näita vaadet\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"Vaata puu olekut\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Puu olek\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"Näita puu laiust\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graafik\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graafik\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Töövoo graafik\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Tõlked\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"Toimingu aken\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"Toimingu akna domeen\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Kõik\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"Ava\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Kõik\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Sünkroonist väljas\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Kohalik\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Moodulid\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"Toimingu akna vaade\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"Toimingu märksõna\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"Toimingu aruanne\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"Toimingu URL\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"Toimingu nõustaja\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Manus\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"Vahemälu\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"Reede\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"Esmaspäev\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"Laupäev\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"Pühapäev\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"Neljapäev\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"Teisipäev\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"Kolmapäev\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"Päev\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"Reede\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"Esmaspäev\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"Laupäev\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"Pühapäev\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"Neljapäev\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"Teisipäev\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"Kolmapäev\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"Apr\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"Aug\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"Dets\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"Veebr\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"Jaan\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"Juul\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"Juun\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"Mär\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"Mai\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"Nov\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"Okt\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"Sept\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"Kuu\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"Aprill\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"August\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"Detsember\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"Veebruar\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"Jaanuar\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"Juuli\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"Juuni\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"Märts\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"Mai\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"November\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"Oktoober\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"Semtember\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"Seadistus\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"Cron\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Kuupäev\"\n\n#, fuzzy\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"E-kiri\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Eksport\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"Ekspordi rida\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Keel\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Bulgaaria\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Katalaani\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Tšehhi\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"Saksa\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"Inglise\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Hispaania\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Hispaania (Ladina Ameerika)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"Pärsia\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"Valmib kuupäeval\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"Prantsuse\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Ungari\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Itaalia\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Lao\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Leedu\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Taani\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Poola\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"Portugali\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Vene\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Sloveenia\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Lihtsustatud Hiina\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Moodulite seadistus\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"Sõnum\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"Nupu \\\"%(button)s väljakutse mudelis \\\"%(model)s\\\" on keelatud.\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"Puudub ligipääs mudelile (mudelitele).\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"Puudub ligipääs mudeli(te) välja(de)le\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"Puudub ligipääs mudelile (mudelitele).\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"Puudub ligipääs mudelile (mudelitele).\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Toimingu \\\"%(action)s\\\" jaoks keelatud kontekst \\\"%(context)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Toimingu \\\"%(action)s\\\" jaoks keelatud vaade \\\"%(view)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Aktiivne\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"Tühista valik, et välistada tulevast kasutust.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Manused\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"Kirje on algseadistuste osa\"\n\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"Loomise kuupäev\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"Looja\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"Kirje kustutamine on keelatud\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"Nov\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"Puhasta\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Kuupäev\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"Kuupäev\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"Domeen\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"Abi\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Valim\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Valim\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Valim\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Nimetus\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Valim\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"Valim\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"Valim\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"Tüüp\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"Väärtust \\\"%(value)s\\\" väljale \\\"%(field)s\\\" mudelis \\\"%(model)s\\\" ei eksisteeri.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"Selles domeenis ei ole välja \\\"%(field)s\\\" väärtus mudelis \\\"%(model)s\\\" \"\n\"lubatud.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"Oosatud kuupäev\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"Muuda\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Toimingu \\\"%(action)s\\\" jaoks keelatud kontekst \\\"%(context)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Toimingu \\\"%(action)s\\\" jaoks keelatud kontekst \\\"%(context)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Toimingu \\\"%(action)s\\\" jaoks keelatud kontekst \\\"%(context)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"Väärtust \\\"%(value)s\\\" väljale \\\"%(field)s\\\" mudelis \\\"%(model)s\\\" ei eksisteeri.\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Kirjeid ei saa kustutada, kuna väljad \\\"%(field)s\\\" on kasutusel \"\n\"\\\"%(model)s\\\" poolt.\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"Väärtust \\\"%(value)s\\\" väljale \\\"%(field)s\\\" mudelis \\\"%(model)s\\\" ei eksisteeri.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"Salvestamine nurjus, palun proovi uuesti\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"ID peab olema positiivne\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"Vaikimisi keel peab olema tõlgitav.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"Vaikimisi keel peab olema tõlgitav.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"Vaikimisi keelt ei saa kustutada.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\\\"%(language)s\\\" keele jaoks vale kuupäeva formaat \\\"%(format)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Keele \\\"%(language)s\\\" jaoks keelatud grupeerimine \\\"%(grouping)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\"Mõned aktiveeritud moodulid on sõltuvad sellest (nendest) mida püüad \"\n\"deaktiveerida\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"\"\n\"Ei saa eemaldada moodulit mis on aktiveeritud või aktiveeritakse peatselt\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Märkmed\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\"Ei saa lugeda kirjeid \\\"%(ids)s\\\" mudelist \\\"%(model)s\\\", mida enam ei \"\n\"eksisteeri.\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Kirje nimi\"\n\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Süntaksi viga viitele: \\\"%(value)r\\\" in \\\"%(field)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Seost ei leitud: \\\"%(value)r\\\" in \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Toimingu \\\"%(action)s\\\" jaoks keelatud kontekst \\\"%(context)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Mudeli \\\"%(model)s\\\" välja \\\"%(field)s\\\" jaoks on väärtus nõutud.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"Mudeli \\\"%(model)s\\\" välja \\\"%(field)s\\\" jaoks on väärtus nõutud.\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Välja \\\"%(field)s\\\" jaoks puudub ostingufunktsioon mudelis \\\"%(model)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"Väärtust \\\"%(value)s\\\" väljale \\\"%(field)s\\\" mudelis \\\"%(model)s\\\" ei eksisteeri.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Järjestus\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"Toimingu \\\"%(action)s\\\" jaoks keelatud kontekst \\\"%(context)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Lubamatu eesliide \\\"%(affix)s\\\" järjestusele \\\"%(sequence)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Lubamatu järelliide \\\"%(affix)s\\\" järjestusele \\\"%(sequence)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"\\\"Viimane ajatempel\\\" ei saa järjestuse \\\"%s\\\" jaoks olla tulevikus.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"Puudub jada\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Välja \\\"%(field)s\\\" jaoks puudub setter funktsioon mudelis \\\"%(model)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"Väärtus on mudeli \\\"%(model)s\\\" välja \\\"%(field)s\\\" jaoks liiga pikk \"\n\"(%(size)i > %(max_size)i).\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"Väärtus on mudeli \\\"%(model)s\\\" välja \\\"%(field)s\\\" jaoks liiga pikk \"\n\"(%(size)i > %(max_size)i).\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"Väärtust \\\"%(value)s\\\" väljale \\\"%(field)s\\\" mudelis \\\"%(model)s\\\" ei eksisteeri.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"EL\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Leitud on liiga palju seoseid: \\\"%(value)r\\\" in \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\"Ei saa eksportida tõlkeid \\\"%(name)s\\\", kuna need on kirjutatud üle mooduli \"\n\"\\\"%(overriding_module)s\\\" poolt.\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"XML süntaksi viga: \\\"%(value)r\\\" in \\\"%(field)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"Vaate \\\"%(name)s\\\" jaoks sobimatu XML.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"Lubamatu eesliide \\\"%(affix)s\\\" järjestusele \\\"%(sequence)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\"Ei saa salvestada kirjeid \\\"%(ids)s\\\" mudelisse \\\"%(model)s\\\", mida enam ei \"\n\"eksisteeri.\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"Puudub õigus kirje muutmiseks\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"XML süntaksi viga: \\\"%(value)r\\\" in \\\"%(field)s\\\".\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Mudeli ligipääs\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"Mudeli nupp\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Käivita üks kord\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"Ava\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Ligipääs\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Eemalda tõlge\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Eemalda tõlge\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Sünkroniseeri\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Märgista aktiveerimiseks\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Tühista aktiveerimine\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Märgista deaktiveerimiseks (beeta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Tühista deaktiveerimine\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Märgi uuendamiseks\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Tühista uuendus\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Näita\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"Mudeli nupu algseadistamine\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"Mudeli nupu vajutus\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"Mudeli nupu reegel\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"Mudeli andmed\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"Mudeli väli\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"Mudeli välja ligipääs\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"Prindi mudeli graafik\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Moodul\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"Mooduli aktiveerimise uuendus lõpetatud\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"Mooduli aktiveerimise uuendus alustatud\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Moodulite seadistus\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"Mudeli seadistamise viisard valmis\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"Mudeli seadistamise viisard esimene\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"Seadista viisard, et käivitada peale mooduli aktiveerimist\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"Mudeli seadistamise viisard, muu\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"Mooduli sõltuvus\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Märkus\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"Lugemata\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"Järjekorras\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"Reegel\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"Reegligrupp\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Jada\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Järjestuste rangus\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Jada tüüp\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"Sessioon\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"Sessiooni viisard\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Tõlge\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Eemalda tõlge\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Eemalda tõlge\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Ekspordi tõlge\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Ekspordi tõlge\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Määra tõlge\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Määra tõlge\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"Uuenda tõlge\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Päästik\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"Päästiku logi\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Ikoon\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"Kasutajaliidese menüü\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Toimingud\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Toimingud\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Akna toimingud\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Aruanded\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URLid\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Viisard\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Administreerimine\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Manused\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Seadistusnõustaja elemendid\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Toimingud\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"E-kiri\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Ekspordid\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Ikoonid\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"Tüüp\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Keeled\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Asukohamäärang\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menüü\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"Sõnum\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Mudeli ligipääs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Nupud\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Andmed\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Välja ligipääs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Mudelid\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Mudelid\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Teosta ootel aktiveerimine/uuendus\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Moodulid\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Moodulid\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Märkused\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Kirje reeglid\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Planeerija\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Jadad\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Jadade rangus\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Jadad\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Eemalda tõlked\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Ekspordi tõlked\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Tõlked\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Määra tõlked\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Sünkroniseeri tõlked\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Päästikud\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"Kaustajaliides\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Vaated\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"Vaate otsing\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"Vaata puu olekut\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Puu olek\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"Näita puu laiust\"\n\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Väljad\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"Menüü lemmik\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Vaade\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Näita vaadet\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"Vaate otsing\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"Vaata puu olekut\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"Vaata puu olekut\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"Näita puu laiust\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Valitud sõlmed\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Valitud sõlmed\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"Tegevuse vorm\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"Vormi seos\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"Ava graafik\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"Ava puu\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"Prindi vorm\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Valitud sõlmed\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Valitud sõlmed\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Valitud sõlmed\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Andmed\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"Link\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"Päev\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"Tunnid\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"Minutid\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"Kuud\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"Nädalad\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"Tõlgete tühistamine õnnestus!\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"Käivita päästikud määratud ajal\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Toiming\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"Ava\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"Vasakult paremale\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"Paremalt vasakule\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"Aktiveeritud\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Aktiveerimata\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"Aktiveeritakse\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"Eemaldatakse\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Uuendatakse\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"Valmis\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"Ava\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"Aktiveeritud\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Aktiveerimata\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"Aktiveeritakse\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"Eemaldatakse\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Uuendatakse\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"Määramata\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"Kasvav\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"Kasvav\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Väli\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"Abi\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Mudel\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Aruanne\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"Valim\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Vaade\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"Viisardi nupp\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"Kalender\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"Vorm\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Graafik\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"Vormi nimekiri\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"Puu\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"Üldine\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"Muuda\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"Üldine\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"Üldine\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"Üldine\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"Üldine\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"Viimati muudetud\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"Kuupäeval\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"Iga\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"Järgmine kutsung\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"Järgmine kutsung\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Käivita korra\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"Kuupäeva formaat\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"Rahaväärtuse formaat\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"Numbriväärtuse formaat\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"Moodulid on uuendatud / aktiveeritud.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"Selle toimingu teostamisele võib kuluda mitu minutit.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"Süsteem uuendatakse.\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"Seadistamine on lõpetatud.\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Tühista aktiveerimine\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Tühista deaktiveerimine\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Tühista uuendus\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Märgi aktiveerimiseks\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Märgi deaktiveerimiseks (beta)\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Märgi uuendatavaks\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Kuupäev\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"Aeg\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"Kasutaja\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"Reegel kehtib, kui vähemasti üks test õnnestub.\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"${day}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"${month}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"${year}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"Päev:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"Kasvav\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"Kuu:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"Ajatempel\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"Aasta:\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"Eemaldada tõlked?\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Sünkroonida tõlked?\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Tühista\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Tühista\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"Prindi\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Tühista\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"Alusta uuendamist\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Aktiveeritud\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Tühista\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"Tühista\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"Järgmine\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"Tühista\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"Puhasta\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Tühista\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"Sulge\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Tühista\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Eksport\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Tühista\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Tühista\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"Uuenda\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"Sulge\"\n"
  },
  {
    "path": "trytond/ir/locale/fa.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"آیکون\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"کلیدواژه‌ها\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"شناسه رکورد\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"نوع\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"استفاده\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"دامنه ها\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"مشاهدات\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"اقدام\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"ارزش مفاد\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"دامنه مفاد\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"مدل مفاد\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"ارزش دامنه\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"دامنه ها\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"آیکون\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"کلیدواژه‌ها\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"محدود\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"ارزش سفارش\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"مفاد PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"دامنه PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"دستور PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"معیار جستجوی PySON\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"شناسه رکورد\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"معیارهای جستجوی\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"نوع\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"استفاده\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"مشاهدات\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"اقدام\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"شمارش\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"دامنه\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"اقدام\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"مشاهده\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"اقدام\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"کلمه کلیدی\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"اقدام\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"چاپ مستقیم\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"توسعه\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"آیکون\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"سفارشی است\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"کلیدواژه‌ها\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"ماژول\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"نام پرونده\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"شناسه رکورد\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"مسیر\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"محتوا\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"محتوا\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"نام محتوا\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"نام داخلی\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"مجرد\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"الگوی افزونه ها\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"قابل ترجمه\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"نوع\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"استفاده\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"اقدام\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"آیکون\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"کلیدواژه‌ها\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"شناسه رکورد\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"نوع\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"نشانی اینترنتی اقدام\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"استفاده\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"اقدام\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"آیکون\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"کلیدواژه‌ها\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"شناسه رکورد\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"نوع\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"استفاده\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"پنجره\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"نام دستیار\"\n\n#, fuzzy\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"منبع\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"داده\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"سایز اطلاعات\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"شرح\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"کد فایل\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"آخرین به روز رسانی\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"آخرین کاربر\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"پیوند\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"منبع\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"خلاصه\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"نوع\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"کش\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"منبع\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"منبع\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"آخرین به روز رسانی\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"آخرین کاربر\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"منبع\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"برچسب زمان\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"نام میزبان\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"زبان\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"روزها\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"ساعات\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"شماره فاصله\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"دقایق\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"تماس بعدی\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"زمان\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"منبع\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"کاربر\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"ایمیل\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"نام مدل\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"گزارش ها\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"گزارش\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"الگوی افزونه ها\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"شرح\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"پیام\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"کاربر ایجاد کننده\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"وضعیت\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"خلاصه\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"فیلدها\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"منبع\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"صادرات\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"کد\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"تاریخ\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"جداکننده دهگان\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"جهت\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"گروه بندی\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"جداکننده دهگان\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"گروه بندی\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"جداکننده هزاراگان\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"علامت منفی ارز قبل از عدد وارد شود\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"منفی را با فضای خالی جدا کنید\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"موقعیت علامت منفی\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"علامت منفی\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"نماد مثبت ارز قبل از عدد وارد شود\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"مثبت را با فضای خالی جدا کنید\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"موقعیت نشانۀ مثبت\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"کد مرجع\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"علامت مثبت\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"جداکننده هزاراگان\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"قابل ترجمه\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"زبان ها\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"متن\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"فیلدها\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"جستجوی سراسری\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"اطلاعات\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"نام مدل\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"ماژول\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"شرح مدل\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"شرح\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"گروه\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"دسترسی ایجاد کردن\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"دسترسی حذف کردن\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"دسترسی خواندن\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"دسترسی نوشتن\"\n\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"کلیک ها\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"تایید\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"کمک\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"تنظیم مجدد\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"تنظیم مجدد براساس\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"قوانین\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"برچسب\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"دکمه\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"دکمه فشرده شده\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"دکمه\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"شناسه رکورد\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"دکمه\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"شرط\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"شرح\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"تعداد کاربر\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"شناسه مرجع\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"شناسه در سیستم فایل\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"مقادیر در سیستم فایل\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"ماژول\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"بدون بروزرسانی\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"خارج از همگام سازی\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"مقادیر\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"دسترسی\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"فیلد توضیحات\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"کمک\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"ماژول\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"رابطه مدل\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"نوع فیلد\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"شرح\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"فیلد\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"گروه\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"دسترسی ایجاد کردن\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"دسترسی حذف کردن\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"دسترسی خواندن\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"دسترسی نوشتن\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"فیلتر\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"سطح\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"زیرمجموعه ها\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"وابستگی ها\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"مراجع\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"وضعیت\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"نسخه\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"ماژول ها برای بروزرسانی\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"ماژول ها\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"اقدام\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"وضعیت\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"درصد\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"ماژول\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"وضعیت\"\n\n#, fuzzy\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"منبع\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"آخرین اصلاحیه\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"آخرین کاربر\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"پیام\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"پیام\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"منبع\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"خوانده نشده\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"توجه\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"کاربر\"\n\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"داده\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"رد شده در\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"جذب شده در\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"پذیرفته شده در\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"پایان یافته در\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"برنامه ریزی شده در\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"دامنه\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"گروه\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"پیش فرض\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"سراسری\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"دسترسی ایجاد کردن\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"دسترسی حذف کردن\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"دسترسی خواندن\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"دسترسی نوشتن\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"آزمایشات\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"آخرین برچسب زمان\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"نام توالی\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"شماره افزایش\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"شماره بعدی\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"شماره بعدی\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"تعداد پدینگ\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"پیشوند\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"انواع ادامه\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"پسوند\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"فاصله برچسب زمانی\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"دوران برچسب زمانی\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"نوع\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"آخرین برچسب زمان\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"نام توالی\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"شماره افزایش\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"شماره بعدی\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"شماره بعدی\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"تعداد پدینگ\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"پیشوند\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"انواع ادامه\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"پسوند\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"فاصله برچسب زمانی\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"دوران برچسب زمانی\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"نوع\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"نام توالی\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"کلید\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"داده\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"نامانوس\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"زبان\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"ماژول\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"نام فیلد\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"بازنویسی کردن ماژول\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"شناسه مرجع\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"منبع\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"نوع\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"ارزش ترجمه\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"فایل\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"فایل\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"زبان\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"ماژول\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"زبان\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"ماژول\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"زبان\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"اقدام\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"شرط\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"شماره محدود\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"حداقل تاخیر\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"درایجاد\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"درحذف\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"در زمان\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"در نوشتن\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"شناسه پرونده\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"تریگر\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"آیکون\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"ماژول\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"مسیر SVG\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"اقدام\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"کلید واژه های اقدام\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"زیر مجموعه\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"نام کامل\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"مورد علاقه\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"آیکون\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"منو\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"منو مادر\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"منو\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"کاربر\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"نمای معماری\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"داده\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"دامنه\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"فیلد زیرمجموعه\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"نمای ارث بری\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"ماژول\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"اولویت\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"نوع نمایش\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"دامنه\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"کاربر\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"فیلد\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"کاربر\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"مقادیر\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"مشاهده\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"نام فرزند\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"دامنه\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"گره های گسترش یافته\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"گره های انتخاب شده\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"کاربر\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"فیلد\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"کاربر\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"عرض\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"بخشی از دامنه که در هر تازه سازی باید ارزیابی شود\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"محدودیت پیش فرض برای لیست نمایش\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"معیارهای جستجوی پیش فرض برای لیست نمایش\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\"برای همان قالب، خالی بگذارید،اسناد LibreOffice را برای فرمت سازگار مشاهده \"\n\"کنید\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"اگر قالب تنها برای یک پرونده کار می کند، تیک بزنید .\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"برای غیرفعال کردن ترجمه های این گزارش، علامت را بردارید.\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"اجرای دستیار در پنجره جدید\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"یک حکم PYSON ارزیابی شده با رکورد ارائه شده توسط \\\"خود\\\"\\n\"\n\"این قانون اگر درست باشد فعال می شود.\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\"یک حکم PYSON ارزیابی شده با رکورد ارائه شده توسط \\\"خود\\\"\\n\"\n\"این قانون اگر درست باشد فعال می شود.\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"یک حکم PYSON ارزیابی شده با رکورد ارائه شده توسط \\\"خود\\\"\\n\"\n\"این قانون اگر درست باشد فعال می شود.\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"کد منبع استثنایی\"\n\n#, fuzzy\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"ماژولی که این مدل در آن تعریف شده است\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"متن برای دریافت تایید کاربر هنگام کلیک کردن بر روی دکمه.\"\n\n#, fuzzy\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"دکمه ای که باید قوانین را بازنشانی کند\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\"یک حکم PYSON ارزیابی شده با رکورد ارائه شده توسط \\\"خود\\\"\\n\"\n\"این قانون اگر درست باشد فعال می شود.\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"شناسه پرونده در پایگاه داده.\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"شناسه پرونده در سیستم فایل شناخته شده است.\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"ماژولی که این فیلد در آن تعریف شده است\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\"وارد کردن عبارات منظم پایتون، مدلهای تطبیقی را از نمودار حذف خواهد کرد.\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"وقتی کار باید انجام شود.\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"وقتی کار شروع می شود.\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\"دامنه ارزیابی شده با یک متن PYSON حاوی :\\n\"\n\"- \\\"کاربر\\\" بعنوان کاربر جاری\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"این قانون را به صورت پیش فرض برای همه کاربران اضافه کنید\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\"ساختن قانون سراسری\\n\"\n\"بنابراین هر کاربر باید این قانون را دنبال کند\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"اگر حداقل یک آزمون درست باشد،این قانون راضی کننده است\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\"یک حکم PYSON ارزیابی شده با رکورد ارائه شده توسط \\\"خود\\\"\\n\"\n\"اگر درست باشد این اقدامات پیگیری میشود.\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\"محدودیت تعداد تماس هابرای \\\"عملکرد اقدام\\\" بوسیله پرونده.\\n\"\n\"0 برای نامحدود.\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\"تنظیم حداقل تاخیر زمانی بین تماس به \\\"عملکرد اقدام\\\" برای یک رکورد مشابه.\\n\"\n\"خالی برای بدون تأخیر.\"\n\n#, fuzzy\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"دامنه PySON\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"اقدام\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"پنجره اقدامات‌\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"اقدامات\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"گزارش ها\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"آدرس های اینترنتی\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"دستیارها\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"پیوست ها\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"تنظیم گزینه های دستیار\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"اقدامات\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"ایمیل\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"ایمیل\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"خطا\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"صادرات\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"آیکون ها\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"پیکربندی ماژول ها\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"زبان ها\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"منو\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"منو\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"پیام\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"مدل های دسترسی\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"دسترسی\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"کلیک ها\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"دکمه ها\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"داده\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"دسترسی فیلدها\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"دسترسی\"\n\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"فیلدها\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"مدل ها\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"انجام در انتظار فعال سازی / ارتقاء\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"پیکربندی ماژول ها\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"پیکربندی ماژول\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"ماژول ها\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"یادداشت ها\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"پرونده قوانین\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"ادامه ها\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"دنباله های سخت\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"نوع\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"پاک کردن ترجمه ها\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"صادرکردن ترجمه ها\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"ترجمه ها\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"ترجمه ها\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"تنظیمات ترجمه ها\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"همگام سازی ترجمه ها\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"تریگرها\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"بازدید\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"دیدن جستجو\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"مشاهده نمایش\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"نمایش حالت درختی\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"حالت درختی\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"عرض نمایش درختی\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"نمودار\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"نمودار\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"نمودار جریان کار\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"ترجمه ها\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"پنجره اقدامات‌ درحال اجرا\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"دامنه پنجره اقدامات‌ درحال اجرا\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"همه\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"باز\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"همه\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"خارج از همگام سازی\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"محلی\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"ماژول ها\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"نمایش پنجره اقدامات‌ درحال اجرا\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"کلیدواژه اقدامات\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"اجرای گزارش\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"آدرس اینترنتی اقدام\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"اجرای دستیار\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"پیوست\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"کش\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"روزها\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"ماه ها\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"پیکربندی\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"برنامه وظایف\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"تاریخ\"\n\n#, fuzzy\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"ایمیل\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"خطا\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"صادرات\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"خط صادرات\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"زبان\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"بلغاری\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"کاتالانیا\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"چک\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"آلمانی\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"انگلیسی\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"اسپانیایی\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"اسپانیایی (آمریکای لاتین)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"پارسی\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"پایان یافته در\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"فرانسوی\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"مجارستانی\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"ایتالیایی\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"لائوای\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"لیتوانیایی\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"هلندی\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"لهستانی\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"پرتغالی\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"روسی\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"اسلوونیایی\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"چینی Simplified\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"پیکربندی ماژول ها\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"پیام\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"شناسه\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"دکمه تماس :\\\"%(button)s\\\" در :\\\"%(model)s\\\" مجاز نیست.\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"شما مجاز به دسترسی به \\\"%(model)s\\\" نیستید.\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"شما مجاز به دسترسی به \\\"%(model)s\\\" \\\"%(field)s\\\" نیستید.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"شما مجاز به دسترسی به \\\"%(model)s\\\" نیستید.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"شما مجاز به دسترسی به \\\"%(model)s\\\" نیستید.\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"مفاد : \\\"%s\\\" در اقدام : \\\"%s\\\" نامعتبر است.\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"نام دامنه یا معیارهای جستجوی: \\\"%s\\\" در اقدام: \\\"%s\\\" معتبر نیست.\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"مشاهده: \\\"%s\\\" از اقدام: \\\"%s\\\" معتبر نمیباشد.\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"اشتباه دستیارمدل در کلیدواژه اقدام \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"فعال\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"برای خارج کردن از استفاده در آینده، تیک را بردارید.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"پیوست ها\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"نام مدل باید منحصر به فرد باشد!\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"این پرونده بخشی از پیکره بندی پایه میباشد.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"نام مدل باید منحصر به فرد باشد!\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"تاریخ ایجاد\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"کاربر ایجاد کننده\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"شما اجازه حذف این پرونده را ندارید.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"توجه\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"پاک‌سازی\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"تاریخ\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"تاریخ\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"دامنه\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"کمک\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"انتخاب\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"انتخاب\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"دامنه نامعتبر در طرح \\\"%(schema)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"دامنه نامعتبر در طرح \\\"%(schema)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"دامنه نامعتبر در طرح \\\"%(schema)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"انتخاب\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"انتخاب\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"انتخاب\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"انتخاب\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"نوع\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"تعداد ارقام در مقدار:\\\"%(value)s\\\" برای فیلد :\\\"%(field)s\\\" در \\\"%(model)s\\\"\"\n\" بیش از حد \\\"%(digits)i\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"مقدار فیلد: \\\"%s\\\" در مدل: \\\"%s\\\" باتوجه به دامنه آن معتبر نیست.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"پذیرفته شده در\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"پذیرفته شده در\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"مفاد : \\\"%s\\\" در اقدام : \\\"%s\\\" نامعتبر است.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"مفاد : \\\"%s\\\" در اقدام : \\\"%s\\\" نامعتبر است.\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"مفاد : \\\"%s\\\" در اقدام : \\\"%s\\\" نامعتبر است.\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"مقدار زمان: \\\"%s\\\" برای فیلد : \\\"%s\\\" در مدل : \\\"%s\\\" معتبر نیست.\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"پرونده ها را نمی توان حذف کرد زیرا آنها توسط فیلد :\\\"%(field)s\\\" از \"\n\"\\\"%(model)s\\\" استفاده می شوند.\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"مقدار: \\\"%s\\\" فیلد: \\\"%s\\\" در مدل: \\\"%s\\\" ایجاد نشده است.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"شناسه باید مثبت باشد.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"مدل باید منحصر به فرد باشد!\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"زبان پیش فرض باید قابل ترجمه باشد.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"زبان پیش فرض قابل حذف نیست.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"فرمت تاریخ : \\\"%s\\\" در زبان : \\\"%s\\\" معتبر نیست.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"گروه بندی : \\\"%s\\\" در زبان : \\\"%s\\\" معتبر نیست.\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"شرط : \\\"%s\\\" یک عبارت PYSON معتبر نیست در قانون دکمه :\\\"%s\\\" .\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"تعداد ماژول های فعال بستگی دارد به آن هایی که غیرفعال می کنید:\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"شما نمیتوانید یک ماژول فعال شده یا در دست فعال سازی را حذف کنید.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"یادداشت ها\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"شما تلاش می کنید پرونده ی :\\\"%(model)s\\\" را بخوانید، که دیگر وجود ندارد.\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"نام پرونده\"\n\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"توابع بازگشتی خطا: پرونده: \\\"%s\\\" با مرجعیت: \\\"%s\\\" به عنوان والد خود \"\n\"پیکربندی شده است.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"خطای نحو برای مرجع :\\\"%(value)r\\\" در \\\"%(field)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"رابطه :\\\"%(value)r\\\" در \\\"%(model)s\\\" یافت نشد.\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"ایمیل تعریف شده برای گزارش : \\\"%s\\\" معتبر نمیباشد.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"مفاد : \\\"%s\\\" در اقدام : \\\"%s\\\" نامعتبر است.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"یک مقدار برای فیلد :\\\"%(field)s\\\" در\\\"%(model)s\\\" مورد نیاز است.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"یک مقدار برای فیلد :\\\"%(field)s\\\" در\\\"%(model)s\\\" مورد نیاز است.\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"نام دامنه در قانون: \\\"%s\\\" معتبر نیست.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"عملکرد جستجو برای فیلد \\\"٪ s\\\" گم شده است.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"مقدار : \\\"%s\\\" برای فیلد : \\\"%s\\\" در مدل : \\\"%s\\\" یکی از گزینه های مجاز نیست.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"ادامه\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"مفاد : \\\"%s\\\" در اقدام : \\\"%s\\\" نامعتبر است.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"پیشوند: \\\"%s\\\" در ادامه: \\\"%s\\\" نامعتبر است.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"پسوند: \\\"%s\\\" در ادامه: \\\"%s\\\" نامعتبر است.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"آخرین برچسب زمان نباید در آینده دنباله : \\\"%s\\\" باشد.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"دنباله گمشده.\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"مقدار فیلد :\\\"%(field)s\\\" در \\\"%(model)s\\\" خیلی طولانی است (%(size)i > \"\n\"%(max_size)i).\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"مقدار فیلد :\\\"%(field)s\\\" در \\\"%(model)s\\\" خیلی طولانی است (%(size)i > \"\n\"%(max_size)i).\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"مقدار زمان: \\\"%s\\\" برای فیلد : \\\"%s\\\" در مدل : \\\"%s\\\" معتبر نیست.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"روابط بسیار زیادی :\\\"%(value)r\\\" در \\\"%(model)s\\\" پیدا شد.\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\"شما نمیتوانید ترجمه: \\\"%s\\\" را صادر کنید، چراکه آن توسط ماژول: \\\"%s\\\" لغو \"\n\"شده است.\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"شرط : \\\"%s\\\" یک عبارت PYSON معتبر برای ماشه :\\\"%(trigger)s\\\" نیست.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"خطای نحوی برای شناسه xml :\\\"%(value)r\\\" در \\\"%(field)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"XML غیرمعتبر برای مشاهده \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"نام دامنه یا معیارهای جستجوی: \\\"%s\\\" در اقدام: \\\"%s\\\" معتبر نیست.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\"شما در حال تلاش برای نوشتن روی اسناد :\\\"%(model)s\\\" که دیگر وجود ندارد، می \"\n\"باشید.\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"شما مجاز به تغییر این پرونده نیستید.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"خطای نحوی برای شناسه xml :\\\"%(value)r\\\" در \\\"%(field)s\\\".\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"دسترسی به مدل\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"مدل دکمه\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"باز\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"دسترسی\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"پاک کردن ترجمه\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"پاک کردن ترجمه\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Sync\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Mark for Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Show\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"تنظیم مجدد مدل دکمه\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"مدل کلیک دکمه\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"مدل قانون دکمه\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"مدل داده\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"مدل فیلد\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"مدل دسترسی فیلد\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"چاپ مدل نمودار\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"ماژول\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"فعال سازی و ارتقاء ماژول انجام شد\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"شروع فعال سازی و ارتقاء ماژول\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"پیکربندی ماژول ها\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"دستیار پیکره بند ماژول انجام شد\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"دستیار پیکره بند ماژول نخست\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"دستیار پیکربندی پس از فعال کردن یک ماژول اجرا می شود\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"دستیار پیکره بند ماژول سایر\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"وابستگی ماژول\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"توجه\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"یاداشت خوانده شد\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"صف\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"قانون\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"گروه قوانین\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"ادامه\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"دنباله های سخت\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"نوع ادامه\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"جلسه\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"دستیار جلسه\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"ترجمه\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"پاک کردن ترجمه\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"پاک کردن ترجمه\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"صادرکردن ترجمه\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"صادرکردن ترجمه\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"تنظیمات ترجمه\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"تنظیمات ترجمه\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"بروزرسانی ترجمه\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"تریگر\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"تریگر لاگ\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"آیکون\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"منوی رابط کاربر\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"اقدامات\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"اقدامات\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"پنجره اقدامات‌\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"گزارش ها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"آدرس های اینترنتی\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"دستیارها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"مدیریت\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"پیوست ها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"گزینه های دستیارپیکره بندی\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"اقدامات\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"ایمیل\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"خطا\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"صادرات\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"آیکون ها\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"نوع\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"زبان ها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"بومی سازی\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"منو\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"پیام\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"مدل های دسترسی\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"دکمه ها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"داده\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"دسترسی فیلدها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"مدل ها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"مدل ها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"انجام در انتظار فعال سازی / ارتقاء\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"ماژول ها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"ماژول ها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"یادداشت ها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"پرونده قوانین\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"زمان بندی\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"ادامه ها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"دنباله های سخت\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"ادامه ها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"پاک کردن ترجمه ها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"صادرکردن ترجمه ها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"ترجمه ها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"تنظیمات ترجمه ها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"همگام سازی ترجمه ها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"تریگرها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"رابط کاربری\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"مشاهدات\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"دیدن جستجو\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"نمایش حالت درختی\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"حالت درختی\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"عرض نمایش درختی\"\n\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"فیلدها\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"منو مورد علاقه ها\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"مشاهده\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"نمایش مشاهده\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"دیدن جستجو\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"نمایش حالت درختی\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"نمایش حالت درختی\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"عرض نمایش درختی\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"گره های انتخاب شده\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"گره های انتخاب شده\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"فرم اقدام\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"فرم ارتباط\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"بازکردن نمودار\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"باز کردن درخت\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"چاپ فرم\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"گره های انتخاب شده\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"گره های انتخاب شده\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"گره های انتخاب شده\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"داده\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"پیوند\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"روزها\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"ساعات\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"دقایق\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"ماه ها\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"هفته ها\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"پاک کردن ترجمه ها باموفقیت!\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"اقدام\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"باز\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"چپ به راست\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"راست به چپ\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"فعال شده\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"فعال نشده\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"باید فعال شود\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"باید حذف شود\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"باید ارتقاء یابد\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"انجام شد\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"باز\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"فعال شده\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"فعال نشده\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"باید فعال شود\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"باید حذف شود\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"باید ارتقاء یابد\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"نامعلوم\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"برچسب زمان دسیمال\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"برچسب زمان هگزادسیمال\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"افزایشی\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"برچسب زمان دسیمال\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"برچسب زمان هگزادسیمال\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"افزایشی\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"فیلد\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"کمک\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"مدل\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"گزارش\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"انتخاب\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"مشاهده\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"دکمه دستیار\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"برد\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"تقویم\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"فرم\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"نمودار\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"درخت\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"عمومی\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"عمومی\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"عمومی\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"عمومی\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"عمومی\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"زمان آخرین تغییرات\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"تماس بعدی\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"تماس بعدی\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"یکبار اجرا\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"قالب بندی تاریخ\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"قالب بندی الزامی\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"قالب بندی اعداد\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"ماژول ها فعال شده / ارتقاء یافته هستند.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"توجه داشته باشید که این عملیات ممکن است چند دقیقه طول بکشد.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"سیستم شما به روز رسانی خواهد شد.\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"پیکره بندی انجام شد.\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\"شما می توانید نصب خود را بسته به ماژول هایی که نصب کرده اید پیکربندی کنید.\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"لغو فعال سازی\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"لغو غیر فعال سازی\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"لغو ارتقاء\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"علامت برای فعال سازی\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"علامت برای غیرفعال سازی (beta)\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"علامت برای ارتقاء\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"تاریخ\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"زمان\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"کاربر\"\n\n#, fuzzy\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\"اگر هیچ آزمایشی تعریف نشده باشد، قانون همیشه راضی کننده است اگر سراسری نباشد\"\n\n#, fuzzy\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"اگر حداقل یک آزمون درست باشد،این قانون راضی کننده است\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"${day}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"${month}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"${year}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"روز:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"افزایشی\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"افسانه (متغیرهایی برای پیشوند، پسوند)\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"ماه:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"برچسب زمان\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"سال:\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"پاک کردن ترجمه؟\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"همگام سازی ترجمه ها؟\"\n\n#, fuzzy\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"ترجمه باید منحصر به فرد باشد\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"انصراف\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"انصراف\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"چاپ\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"قبول\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"انصراف\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"شروع ارتقاء\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"فعال شده\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"انصراف\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"قبول\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"قبول\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"انصراف\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"بعدی\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"انصراف\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"پاک‌سازی\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"انصراف\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"قبول\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"بسته\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"انصراف\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"صادرات\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"انصراف\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"تنظیم\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"قبول\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"انصراف\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"بروزرسانی\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"بسته\"\n"
  },
  {
    "path": "trytond/ir/locale/fi.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"Languages\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Models Access\"\n\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Reports\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Tree State\"\n\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Exports\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Clicks\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Buttons\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Buttons\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Buttons\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Out of Sync\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Fields\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Notes\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Triggers\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Fields\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"Views\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Fields\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icons\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Clicks\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Buttons\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Perform Pending Activation/Upgrade\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Module Configuration\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Clean Translations\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Export Translations\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Set Translations\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Show View\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Workflow Graph\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"All\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"All\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Out of Sync\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Local\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Attachments\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Exports\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Languages\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Bulgarian\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Català\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Czech\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"German\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"English\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Spanish\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Spanish (Latin American)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"French\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Hungarian\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italian\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Lao\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Lithuanian\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Dutch\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Polish\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Russian\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Slovenian\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Chinese Simplified\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"This record is part of the base configuration.\"\n\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" exceeds the \"\n\"digits limit of \\\"%(digits)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"The value of the field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not valid according\"\n\" to its domain.\"\n\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Syntax error for reference %r in %s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Relation not found: %r in %s\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not in \"\n\"the selection.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Sequences\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Too many relations found: %r in %s\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"You are not allowed to modify this record.\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Models Access\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Clean Translations\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Sync\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Mark for Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Show\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Sequences\"\n\n#, fuzzy\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Sequences Strict\"\n\n#, fuzzy\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Export Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Export Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Set Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Set Translations\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Triggers\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Administration\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icons\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Localization\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Buttons\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Perform Pending Activation/Upgrade\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Scheduler\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Clean Translations\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Export Translations\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Set Translations\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"User Interface\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Show View\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\n#, fuzzy\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Fields\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Reports\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Views\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel Upgrade\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Mark for Upgrade\"\n\n#, fuzzy\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"Clean Translations\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Synchronize Translations\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Actions\"\n\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Exports\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"\"\n"
  },
  {
    "path": "trytond/ir/locale/fr.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icône\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Mots-clés\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"Enregistrements\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"Utilisation\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"Domaines\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Vues\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Action\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"Valeur du contexte\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"Contexte du domaine\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"Modèle de context\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"Valeur du domaine\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"Domaines\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icône\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Mots-clés\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"Limite\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"Valeur de l'ordre\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"Contexte PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"Domaine PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"Ordre PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"Critère de recherche PySON\"\n\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"Enregistrements\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"Critères de recherche\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"Utilisation\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Vues\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Action\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"Compter\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domaine\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Action\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Vue\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Action\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"Mot-clé\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Action\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"Imprimer directement\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"Extension\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icône\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"Est personnalisé\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Mots-clés\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Nom de l'enregistrement\"\n\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"Enregistrements\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"Chemin\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"Contenu\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"Contenu\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"Contenu HTML\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"Nom du contenu\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"Nom interne\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"Unique\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"Extension du modèle\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Traduisible\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"Utilisation\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Action\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icône\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Mots-clés\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"Enregistrements\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"Url\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"Utilisation\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Action\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icône\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Mots-clés\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"Enregistrements\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"Utilisation\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"Onglet\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"Nom de l'assistant\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Copier sur les ressources\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Copier sur les ressources visible\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Données\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"Taille des données\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Description\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"ID du fichier\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Dernière modification\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Dernier utilisateur\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"Lien\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ressource\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"Résumé\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Copier sur les ressources\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Copier sur les ressources visible\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"Image\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"ID de l'image\"\n\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Dernière modification\"\n\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Dernier utilisateur\"\n\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ressource\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"UUID\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"Image\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"ID de l'image\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"Taille\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"Estampille\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Abréviation\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"Index\"\n\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Abréviation\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"Index\"\n\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"Nom d'hôte\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"Langue\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"Jour\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"Heure\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"Nombre d'intervalles\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"Type d'intervalle\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"Méthode\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"Minute\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"Appel suivant\"\n\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"Fuseau Horaire\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"Jour de la semaine\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"Adresses\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"À\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"Corps\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"Destinataires\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Destinataires cachés\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Destinataires secondaires\"\n\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ressource\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"Objet\"\n\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"Utilisateur\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"Adresse\"\n\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"E-mail\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"Corps\"\n\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Nom du modèle\"\n\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"Destinataires\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Destinataires cachés\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Destinataires cachés\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"Destinataires\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Destinataires secondaires\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Destinataires secondaires\"\n\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Rapports\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"Objet\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Rapport\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"Modèle\"\n\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Description\"\n\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"Message\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"Origine\"\n\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"Traitée par\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"Résolue par\"\n\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"État\"\n\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"Résumé\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Champs\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"Entête\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ressource\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Exports\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"AM\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"Code\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Date\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Séparateur de décimale\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"Direction\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Groupement\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Séparateur de décimale\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Groupement\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Séparateur des milliers\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"Symbole négatif en premier\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"Négatif séparé par un espace\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"Position du signe négatif\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"Signe négatif\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"Symbole positif en premier\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"Positif séparé par un espace\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"Position du signe positif\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"Code parent\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"Configuration de la recherche de texte PostgreSQL\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"PM\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"Signe positif\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Séparateur des milliers\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Traduisible\"\n\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Langues\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"Texte\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Champs\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"Recherche globale\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"Information\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"Nom du modèle\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"Description du modèle\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Description\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Groupe\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Accès en creation\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Accès en suppression\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Accès en lecture\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Accès en écriture\"\n\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Clics\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"Confirmer\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"Aide\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"Réinitialiser\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"Réinitialiser par\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"Règles\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"Label\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Bouton\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"Bouton réglé\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Bouton\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"ID du record\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Bouton\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"Condition\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Description\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"Nombre d'utilisateur\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID de la ressource\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"Identifiant sur le système de fichier\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"Valeurs sur le système de fichier\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"Pas de mise à jour\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Désynchronisé\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"Valeurs\"\n\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Accès\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"Description du champ\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"Aide\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"Modèle associé\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"Type de champ\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Description\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Champ\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Groupe\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Accès en creation\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Accès en suppression\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Accès en lecture\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Accès en écriture\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Filtre\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"Niveau\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"Enfants\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"Dépendances\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"Parents\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"État\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"Version\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"Modules à mettre à jour\"\n\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Action\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"État\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"Pourcentage\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"État\"\n\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Copier sur les ressources\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Copier sur les ressources visible\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Dernière modification\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Dernier utilisateur\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"Message\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"Message\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ressource\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"Non-lu\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Note\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"Utilisateur\"\n\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Données\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"Enlevé de la file à\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"Ajouté à la file à\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"Attendu à\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"Fini à\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"Prévu à\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domaine\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Groupe\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"Défaut\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"Global\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Accès en creation\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Accès en suppression\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Accès en lecture\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Accès en écriture\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"Tests\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Dernière estampille\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nom de séquence\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Nombre d'incrément\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Numéro suivant\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Numéro suivant\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Nombre de chiffres\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Préfixe\"\n\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Type de séquence\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Suffixe\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Décalage estampille\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Arrondi de l'estampille\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Dernière estampille\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nom de séquence\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Incrément\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Nombre suivant\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Numéro suivant\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Nombre de chiffes\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Préfixe\"\n\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Type de séquence\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Suffixe\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Décalage d'estampille\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Arrondi de l'estampille\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nom de séquence\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"Clé\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Données\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"Floue\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Langue\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"Nom du champ\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"Module surchargeant\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID de la ressource\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"Source\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"Traduction\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"Fichier\"\n\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"Nom de fichier\"\n\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Langue\"\n\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Langue\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Langue\"\n\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Action\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"Condition\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"Nombre limite\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"Délai minimal\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"À la création\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"À la suppression\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"À temps\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"À l'écriture\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"ID du record\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Déclencheur\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icône\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"Chemin vers le fichier SVG\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Action\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"Mots-clés d'action\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"Enfants\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"Nom complet\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"Favori\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icône\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"Menu parent\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"Utilisateur\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"Architecture de la vue\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Données\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domaine\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"Champs enfants\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"Vue héritée\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"Priorité\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"Type de vue\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domaine\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"Utilisateur\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Champ\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Utilisateur\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"Valeur\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"ID Vue\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"Nom enfant\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domaine\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"Nœuds développés\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"Nœuds sélectionnés\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"Utilisateur\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Champ\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"Utilisateur\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"Largeur\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Les enregistrements sur lesquels l'action s'exécute.\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"La partie du domaine qui sera évaluée à chaque rafraîchissement.\"\n\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"Limite par défaut pour la vue liste.\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Les enregistrements sur lesquels l'action s'exécute.\"\n\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"Critères de recherche par défaut pour la vue liste.\"\n\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\"Laissez vide pour la même que le modèle, voir la documentation de \"\n\"LibreOffice pour la compatibilité de format.\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\"Une expression Genshi pour calculer le nom en utilisant 'record'.\\n\"\n\"Laissez vide pour le nom par défaut.\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Les enregistrements sur lesquels l'action s'exécute.\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"\"\n\"Cocher si le modèle fonctionne uniquement avec un seul enregistrement.\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"Décocher pour désactiver la traduction pour ce rapport.\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Les enregistrements sur lesquels l'action s'exécute.\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Les enregistrements sur lesquels l'action s'exécute.\"\n\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"Lancer l'assistant dans un nouvel onglet.\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"Le champ qui contient le(s) destinataire(s).\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"Le champ qui contient le(s) destinataire(s) secondaire(s).\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Une expression PYSON qui génère une liste de destinataires masqués avec \"\n\"l'enregistrement représenté par « self ».\"\n\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Une expression PYSON qui génère une liste de destinataires avec \"\n\"l'enregistrement représenté par « self ».\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"Le champ qui contient le(s) destinataire(s) secondaire(s).\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Une expression PYSON qui génère une liste de destinataires secondaires avec \"\n\"l'enregistrement représenté par « self ».\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"Cochez pour inclure les noms de champ dans l'export.\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"Balise RFC 4646.\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"Code du parent exceptionnel\"\n\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"Module dans lequel ce modèle est défini.\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\"Le texte pour demander confirmation à l'utilisateur quand il clique sur le \"\n\"bouton.\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"Bouton qui doit réinitialiser les règles.\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\"Une expression PYSON évaluée avec l'enregistrement représenté par « self »\\n\"\n\"Elle déclenche la règle si elle est vrai.\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"L'ID de l'enregistrement dans la base de données.\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"L'ID de l'enregistrement sur le système de fichier.\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\"Si coché, le droit d'accès sur le modèle du champ est également testé par \"\n\"rapport à la relation du champ.\"\n\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"Module dans lequel ce champ est défini.\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\"Une expression Python utilisée pour exclure les modèles correspondant du \"\n\"graphe.\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"Quand la tâche doit être effectuée.\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"Quand la tâche peut démarrer.\"\n\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\"Le domaine est évalué avec un context PYSON contenant :\\n\"\n\"- \\\"user\\\" comme utilisateur courant\\n\"\n\"- \\\"groups\\\" comme liste d'ids des groupes de l'utilisateur courant\"\n\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"Ajouter cette règle à tous les utilisateurs par défaut.\"\n\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\"Rendre la règle globale de sorte \\n\"\n\"que tous les utilisateurs doivent la respecter.\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\"Affiché aux utilisateurs quand une erreur d'accès est levée à cause de cette\"\n\" règle.\"\n\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"La règle est satisfaite si au moins un test est Vrai.\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\"Une expression PYSON évaluée avec l'enregistrement représentée par « self »\\n\"\n\"Elle déclenche l'action si elle est vrai.\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\"Limite le nombre d'appel aux « Fonction action » par enregistrement.\\n\"\n\"0 signifie pas de limite.\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\"Défini un delai minimal entre l'appel à la « fonction de l'action » pour le même enregistrement.\\n\"\n\"Vide pour aucun délai.\"\n\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"Le domaine PYSON.\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Action\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Actions de la fenêtre\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Rapports\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Assistants\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Attachements\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Éléments de l'assistant de configuration\"\n\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"E-mails\"\n\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"Archives de courrier électronique\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"Modèles d'e-mail\"\n\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"Erreurs\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icônes\"\n\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Configurer les langues\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Langues\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"Message\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Accès aux modèles\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Accès\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Clics\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Boutons\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Données\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Droits d'accès au champs\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Accès\"\n\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Champs\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Modèles\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Lancer l'activation/mise à jour en attente\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Configurer les modules\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Configuration du module\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Règles des enregistrements\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Séquences\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Séquences strictes\"\n\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"Types\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Nettoyer les traductions\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Exporter les traductions\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Traductions\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Traductions\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Définir les traductions\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchroniser les traductions\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Déclencheurs\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Vues\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"Recherches des vues\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Montrer la vue\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"Facultatif des vues arbres\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"État d'arbre\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"Largeur des vues arbres\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graphique\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graphique\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Graphique de flux de travail\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Traductions\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"Action ouvrir fenêtre\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"Action domaine de fenêtre\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Toutes\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"Ouvertes\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"En traitements\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Tous\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Désynchronisé\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Locale\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"Action ouvrir fenêtre vue\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"Action de mots clés\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"Action rapport\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"Action URL\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"Action assistant\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Pièce jointe\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"Cache d'avatar\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"Ven\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"Lun\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"Sam\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"Dim\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"Jeu\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"Mar\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"Mer\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"Jour\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"Vendredi\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"Lundi\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"Samedi\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"Dimanche\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"Jeudi\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"Mardi\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"Mercredi\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"Avr\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"Aoû\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"Déc\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"Fév\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"Jan\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"Jul\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"Jun\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"Mar\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"Mai\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"Nov\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"Oct\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"Sep\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"Mois\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"Avril\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"Août\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"Décembre\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"Février\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"Janvier\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"Juillet\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"Juin\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"Mars\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"Mai\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"Novembre\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"Octobre\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"Septembre\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"Configuration\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"Tâche planifiée\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Date\"\n\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"Adresse électronique\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"Modèle d'e-mail\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"Modèle d'e-mail - Rapport\"\n\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"Erreur\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Export\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"Ligne d'export\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Langue\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Bulgare\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Catalan\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Tchèque\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"Allemand\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"Anglais\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Espagnol\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Espagnol (Amérique latine)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"Estonien\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"Persan\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"Finlandais\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"Français\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Hongrois\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"Indonésien\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italien\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Lao\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Lituanien\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Néerlandais\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Polonais\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"Portugais\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"Roumain\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Russe\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Slovène\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"Turc\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Chinois Simplifié\"\n\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Configurer les langues\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"Message\"\n\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"Appeler le bouton « %(button)s » sur « %(model)s » n'est pas permis.\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"Vous n'êtes pas autorisé à accéder à « %(model)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"Vous n'êtes pas autorisé à accéder à « %(model)s.%(field)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"Vous n'êtes pas autorisé à exécuter le wizard « %(wizard)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Vous n'êtes pas autorisé à exécuter le wizard « %(wizard)s » sur \"\n\"« %(model)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Contexte « %(context)s » invalide pour l'action « %(action)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\"Domaine ou critère de recherche « %(domain)s » invalide pour l'action \"\n\"« %(action)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Vue « %(view)s » invalide pour l'action « %(action)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"Modèle d'assistant incorrect pour le mot-clé d'action « %(name)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Actif\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"Décocher pour exclure d'une utilisation future.\"\n\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Attachements\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"Un seul avatar est autorisé par ressource.\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"La taille d'un avatar doit être unique.\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"URL de l'avatar\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"Avatars\"\n\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"Cet enregistrement fait partie de la configuration de base.\"\n\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"Le nom du bouton doit être unique par modèle.\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Vous n'êtes pas autorisé à créer les enregistrements de « %(model)s » car ils échouent à au moins une de ces règles :\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"Crée le\"\n\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"Créé par\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Vous n'êtes pas autorisé à supprimer les enregistrement « %(ids)s » de « %(model)s » à cause d'au moins une de ces règles :\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"Vous n'êtes pas autorisé à supprimer cet enregistrement.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"Non\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"Booléen\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"Caractères\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Date\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"Date Heure\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"Chiffres\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"Domaine\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"Float\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"Aide\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Aide de sélection\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"La clé suivie du texte d'aide séparé par un \\\":\\\", une par ligne.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Aide de sélection JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"Entier\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"Domaine invalide sur le schéma « %(schema)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Aide invalide de sélection sur le schéma « %(schema)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Sélection invalide sur le schéma « %(schema)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"MultiSelection\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"Numérique\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Sélection\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\"Un couple composé d'une clé et d'un label séparé par « : » sur une ligne.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"Sélection JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"Sélection triée\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"Si la sélection doit être triée par label.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"Chaîne de caractères\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"Oui\"\n\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"Le nombre de décimales de la valeur « %(value)r » pour le champs \"\n\"« %(field)s » sur « %(record)s » de « %(model)s » excède la limite de \"\n\"« %(digits)i ».\"\n\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"La valeur « %(value)s » du champ « %(field)s » sur « %(record)s » de \"\n\"« %(model)s » n'est pas valide selon son domaine.\"\n\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"Édité le\"\n\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"Édité par\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Corps non valide dans le modèle d'e-mail « %(template)s » avec l'exception \"\n\"« %(exception)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"PYSON %(field)s non valide dans le modèle d'e-mail « %(template)s » avec \"\n\"l'exception « %(exception)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\"Le PYSON %(field)s dans le modèle d'e-mail « %(template)s » doit générer une\"\n\" liste.\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Objet non valide dans le modèle d'e-mail « %(template)s » avec l'exception \"\n\"« %(exception)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"%(field)s (nom du modèle)\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"%(champ)s (chaîne)\"\n\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"La valeur « %(value)s » pour le champ « %(field)s » dans « %(record)s » de \"\n\"« %(model)s » contient des caractères non valides « %(chars)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Les enregistrements ne peuvent pas être supprimés car ils sont utilisés par \"\n\"le champ « %(field)s » de « %(model)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"\"\n\"La valeur « %(value)s » du champ « %(field)s » sur « %(model)s » n'existe \"\n\"pas.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"Échec de sauvegarde, réessayez.\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"L'ID doit être positif.\"\n\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"Le code d'une langue doit être unique.\"\n\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"La langue par défaut « %(language)s » doit être traduisible.\"\n\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"La langue par défaut « %(language)s » ne peut pas être supprimée.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\"Format de date « %(format)s » invalide pour la langue « %(language)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Groupement « %(grouping)s » invalide pour la langue « %(language)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\"La condition « %(condition)s » n'est pas une expression PYSON valide pour la\"\n\" règle de bouton « %(rule)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\"Certains modules activés dépendent de ceux que vous essayez de désactiver :\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"\"\n\"Vous ne pouvez pas supprimer un module qui est activé ou qui va être activé.\"\n\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\"Vous essayez de lire les enregistrements « %(ids)s » de « %(model)s » qui \"\n\"n'existent plus.\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Vous n'êtes pas autorisé à lire les enregistrements « %(ids)s » de « %(model)s » à cause d'au moins une de ces règles :\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Nom d'enregistrement\"\n\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Erreur de récursion : L'enregistrement « %(rec_name)s » avec le parent \"\n\"« %(parent_rec_name)s » a été configuré comme ancêtre de lui même.\"\n\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Erreur de syntaxe pour la référence : %(value)r dans « %(field)s » de \"\n\"« %(model)s » (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Relation introuvable : « %(value)r » sur « %(model)s » (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"Définition d' e-mail incorrecte pour le rapport « %(name)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Définition de nom d'enregistrement non valide pour le rapport « %(report)s »\"\n\" avec l'exception «%(exception)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Une valeur est requise pour le champ « %(field)s » sur « %(model)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Une valeur est requise pour le champ « %(field)s » sur « %(record)s » de \"\n\"« %(model)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"Les ressources sur lesquelles cet enregistrement doit être copié.\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"Domaine invalide sur la règle « %(name)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Fonction de recherche manquante pour le champ « %(field)s » sur \"\n\"« %(model)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"La valeur « %(value)s » pour le champ « %(field)s » sur « %(record)s » de \"\n\"« %(model)s » n'est pas une des options permises.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Séquence\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\"Vous ne pouvez pas modifier le type de séquence d'une séquence à la place \"\n\"créer une nouvelle séquence.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"\\\"Numéro d'incrément\\\" (%(number_increment)s) ou \\\"Numéro suivant\\\" \"\n\"(%(number_next)s) non valide avec l'exception \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Préfixe « %(affix)s » invalide pour la séquence « %(sequence)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Suffixe « %(affix)s » invalide pour la séquence « %(sequence)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"\"\n\"La « Dernière estampille » ne peut pas être dans le futur pour la séquence \"\n\"« %s ».\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"Séquence manquante.\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Fonction de définition manquante pour le champ « %(field)s » sur \"\n\"« %(model)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"La valeur « %(value)s » pour le champ « %(field)s » sur « %(model)s » est \"\n\"trop longue (%(size)i > %(max_size)i).\"\n\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"La valeur « %(value)s » pour le champ « %(field)s » sur « %(record)s » de \"\n\"« %(model)s » est trop longue (%(size)i > %(max_size)i).\"\n\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"La valeur de temps « %(value)s » pour le champ « %(field)s » sur \"\n\"« %(record)s » de « %(model)s » n'est pas valide.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"M\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"A\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"j\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"h\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"m\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"s\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"s\"\n\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"\"\n\"Trop de relations trouvées : « %(value)r » sur « %(model)s » (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\"Vous ne pouvez pas exporter la traduction « %(name)s » car elle a été \"\n\"surchargée par le module « %(overriding_module)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\"La condition « %(condition)s » n'est pas une expression valide PYSON pour le\"\n\" déclencheur « %(trigger)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Erreur de syntaxe pour la valeur : %(value)r sur « %(field)s » de \"\n\"« %(model)s » (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"XML invalide pour la vue « %(name)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\"Domaine ou critère de recherche « %(domain)s » invalide pour la recherche \"\n\"« %(search)s ».\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\"Vous essayez d'écrire sur les enregistrements « %(ids)s » de « %(model)s » \"\n\"qui n'existent plus.\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Vous n'êtes pas autorisé à écrire sur les enregistrements « %(ids)s » de « %(model)s » à cause d'au moins une de ces règles :\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"Vous n'êtes pas autorisé à modifier cet enregistrement.\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Erreur de syntaxe pour l'id XML : %(value)r sur « %(field)s » de \"\n\"« %(model)s » (%(column)s).\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Accès au modèle\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"Voulez-vous vraiment charger les traductions des langues ?\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"Voulez-vous vraiment supprimer les traductions des langues ?\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"Bouton de modèle\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Lancer une fois\"\n\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"Ouvrir\"\n\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Traiter\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"Résoudre\"\n\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Charger les traductions\"\n\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Décharger les traductions\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Synchroniser\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Marquer pour activation\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Annuler l'activation\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Marquer pour inactivation (beta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Annuler l'inactivation\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Marquer pour mise à niveau\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Annuler la mise à jour\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Afficher\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"Réinitialisation de modèle de bouton\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"Clic de modèle de bouton\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"Règle de modèle de bouton\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"Données de modèle\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"Champ de modèle\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"Droit d'accès au champ de modèle\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"Imprimer le graphe de modèles\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"Mise à jour / activation de module terminée\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"Début d'activation et mise à jour de module\"\n\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Configurer les modules\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"Assistant de configuration de module - Fin\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"Assistant de configuration de module - Première\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"Assistant de configuration à exécuter après l'activation d'un module\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"Assistant configuration module Autre\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"Dépendance de module\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Note\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"Note lue\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"File\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"Règle\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"Groupe de règle\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Séquence\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Séquence stricte\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Type de séquence\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"Session\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"Assistant de session\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Traduction\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Netoyer les traductions - Début\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Netoyer les traductions - Début\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Export de traduction - Fichier\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Export de traduction - Fichier\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Définir les traductions\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Définir les traductions\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"Mise à jour des traduction\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Déclencheur\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"Journal des déclencheurs\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Icône\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"Menu de l'IU\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Actions de la fenêtre\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Rapports\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Assistants\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Administration\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Attachements\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Éléments de l'assistant de configuration\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"E-mails\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"Modèles d'e-mail\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"Erreurs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icônes\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"Types\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Langues\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Localisation\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"Message\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Accès aux modèles\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Boutons\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Données\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Droits d'accès au champs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Modèles\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Modèles\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Lancer l'activation/mise à jour en attente\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Règles des enregistrements\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Planificateur\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Séquences\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Séquences strictes\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Séquences\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Nettoyer les traductions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Exporter les traductions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Traductions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Définir les traductions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchroniser les traductions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Déclencheurs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"Interface utilisateur\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Vues\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"Recherches des vues\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"Facultatif des vues arbres\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"État d'arbre\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"Largeur des vues arbres\"\n\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Champs\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"Favoris menu\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Vue\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Montrer la vue\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"Recherches des vues\"\n\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"Facultatif des vues arbres\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"État de vue arbre\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"Largeur de vue arbre\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"Listés\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Sélectionnés\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"Listés\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Sélectionnés\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"Formulaire\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"Formulaire relié\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"Ouvrir le graphique\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"Ouvrir l'arbre\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"Imprimer le formulaire\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"Listés\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Sélectionnés\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"Listés\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Sélectionnés\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"Listés\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Sélectionnés\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Données\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"Lien\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"Jours\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"Heures\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"Minutes\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"Mois\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"Semaines\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"Nettoyer les erreurs\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"Nettoyer la file d'attente des tâches\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"Lancer les déclencheurs « À temps »\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Action\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"Tâche\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"Ouverte\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"En traitement\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"Résolue\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"Gauche-à-droite\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"Droite-à-gauche\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"Activé\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Inactif\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"À être activé\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"À être enlevé\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"À être mis à jour\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"Effectué\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"Ouvert\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"Activée\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Inactive\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"À être activée\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"À être enlevé\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"À être mis à jour\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"Inconnu\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Estampille décimale\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Estampille hexadécimale\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"Incrémental\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Estampille décimale\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Estampille hexadécimale\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"Incrémental\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Champ\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"Aide\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Modèle\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Rapport\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"Sélection\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Vue\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"Bouton de l'assistant\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"Tableau\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"Calendrier\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"Formulaire\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Graphique\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"Liste Formulaire\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"Arbre\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"Général\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"Éditer\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"Général\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"Général\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"Général\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"Général\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"Document\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"Heure de dernière modification\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"À\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"Chaque\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"Date du prochain appel\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"Heure du prochain appel\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Lancer une fois\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"Destinataires cachés :\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"Destinataires :\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"Destinataires secondaires :\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"Origine\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"\"\n\"Vous pouvez maintenant charger des traductions supplémentaires dans le \"\n\"système.\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"Formatage des dates\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"Format monétaire\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"Formatage des nombres\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"Les modules ont été mis à niveau / activés.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"Cette opération peut prendre quelques minutes.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"Votre système va être mis à niveau.\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"\"\n\"Vous pouvez maintenant activer des modules supplémentaires sur le système.\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"La configuration est faite.\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\"Vous pourrez configurer votre installation en fonction des modules que vous \"\n\"avez installés.\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Annuler l'activation\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Annuler l'inactivation\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Annuler la mise à jour\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Marquer pour activation\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Marquer pour inactivation (beta)\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Marquer pour mise à niveau\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Date\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"Heure\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"Utilisateur\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\"Si aucun test n'est défini, la règle est toujours satisfaite si elle n'est \"\n\"pas globale.\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"La règle est satisfaite si au moins un test est Vrai.\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"${day}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"${month}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"${year}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"Jour :\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"Incrémental\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"Légende (charactère pour le préfixe, le suffixe)\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"Mois :\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"Estampille\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"Année :\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"Nettoyer les traductions ?\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"Traductions nettoyées avec succès.\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Synchroniser les traductions ?\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"Traductions définies avec succès.\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuler\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"Charger\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuler\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"Imprimer\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuler\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"Démarrer la mise à jour\"\n\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Activer\"\n\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuler\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuler\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"Suivant\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuler\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"Nettoyer\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuler\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"Fermer\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuler\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Exports\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuler\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"Mise à jour\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuler\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"Mise à jour\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"Fermer\"\n"
  },
  {
    "path": "trytond/ir/locale/hu.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikon\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Kulcsszavak\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"Adat ID\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"Típus\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"Használat\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"Értéktartomány\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Nézetek\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Művelet\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"Összefüggés\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"Értéktartomány\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"Értéktartomány\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikon\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Kulcsszavak\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"Korlát\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"Érték sora\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"PySON összefüggés\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"PySON értéktartomány\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"PySON sorrend\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"PySON Keresési feltételek\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"Adat ID\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"Keresési feltételek\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"Típus\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"Használat\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Nézetek\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Művelet\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"Megszámolás\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"Érvényesség\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Művelet\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Nézet\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Művelet\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"Kulcsszó\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Művelet\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"Közvetlen nyomtatás\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"Dokumentum típusa\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikon\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Kulcsszavak\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Rekord neve\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"Adat ID\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"Útvonal\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"Tartalom\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"Tartalom\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"Tartalom neve\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"Belső név\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"Sablon kiterjesztése\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Fordítható\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"Típus\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"Használat\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Művelet\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikon\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Kulcsszavak\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"Adat ID\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"Típus\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"Művelet URL\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"Használat\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Művelet\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikon\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Kulcsszavak\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"Adat ID\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"Típus\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"Használat\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"Ablak\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"Wizard név\"\n\n#, fuzzy\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Forrás\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Adat\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"Mérer\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Leírás\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Utolsó módosítás\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Utolsó felhasználó\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"Hivatkozás\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"Elem\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"Leírás\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"Típus\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Forrás\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Forrás\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Utolsó módosítás\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Utolsó felhasználó\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"Elem\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"Időbélyeg\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"Kiszolgálónév\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"nyelv\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"Nap\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"Óra\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"Közbenső szám\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"Intervallum típusa\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"Perc\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"Következő hívás\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"Időpont\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"A hét napja\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"Címek\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"Időpont\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"Tartalom\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"Címzettek\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Rejtett másolatot kaptak\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Másolatot kaptak\"\n\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"Elem\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"Tárgy\"\n\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"Felhasználó\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"Cím\"\n\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"E-mail\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"Tartalom\"\n\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Mintanév\"\n\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"Címzettek\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Rejtett másolatot kaptak\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Rejtett másolatot kaptak\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"Címzettek\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Másolatot kaptak\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Másolatot kaptak\"\n\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Nyomtatványok\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"Tárgy\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Nyomtatvány\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"Sablon\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Leírás\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"Használat\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"Létrehozta\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Állapot\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"Leírás\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Mezők\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"Erőforrás\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Exportálás\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"Kód\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Dátum\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Tizedes elválasztó\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"Irány\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Csoportosítás\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Tizedes elválasztó\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Csoportosítás\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Ezredes elválasztó jel\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"Főeset\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Ezredes elválasztó jel\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Fordítható\"\n\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Nyelvek\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"Szöveg\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Mezők\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"Globális keresés\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"Információk\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"Mintanév\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"Minta leírás\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Leírás\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Csoport\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Létrehozni\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Törlés\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Olvasási hozzáférés\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Írási hozzáférés\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Clicks\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"Jóváhagyás\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"Súgó\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"Szabályok\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Gomb\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Gomb\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"Adat ID\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Gomb\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"Feltétel\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Leírás\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"Rekord ID\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"Azonosító a fájlrendszerben\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"Értékek a fájlrendszerben\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"Nincs frissítés\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Nem szinkronizált\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"Értékek\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"Leírás\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"Súgó\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"Minta kapcsolat\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"Mezőtípus\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Leírás\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Mező\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Csoport\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Létrehoz\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Törlés\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Olvasási hozzáférés\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Írási hozzáférés:\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Szűrő\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"Szint\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"Alárendelt (modul)\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"Függőségek\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"Fölérendelt (modul)\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"Állapot\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"Verzió\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"Aktualizálásra váró modulok\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Művelet\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"Állapot\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"Százalék\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"Állapot\"\n\n#, fuzzy\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Forrás\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Utolsó módosítás\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Utolsó felhasználó\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"Elem\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"Olvasatlan\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Jegyzetek\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"Felhasználó\"\n\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Adat\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"Érvényesség\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Csoport\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"Alapértelmezett\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"A teljes alkalmazásban érvényes\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Létrehozás\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Törlés\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Olvasási hozzáférés\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Írás hozzáférés\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"Teszt\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Utolsó időpont\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Sorszámozás neve\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Ilyen lépésekben növekedjen\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Következő szám\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Következő szám\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Szám hossza (hány karakter széles)\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Előtag\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Utótag\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Időpont eltolás\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Időpont kerekítés\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"Számítás módja\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Utolsó időpont\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Sorszámozás neve\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Ilyen lépésekben növekedjen\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Következő szám\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Következő szám\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Szám hossza (hány karakter széles)\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Előtag\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Utótag\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Időpont eltolás\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Dátum kerekítése\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"Típus\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Sorszámozás neve\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"Kulcs\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Adatok\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"Pontatlan\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Nyelv\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"Mezőnév\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"Átírandó modul\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"Rekord ID\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"Forrás\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"Típus\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"Fordítás\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"Fájl\"\n\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"Fájlnév\"\n\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Nyelv\"\n\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Nyelv\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Nyelv\"\n\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Művelet\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"Feltétel\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"Limit átfutások\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"Minimum késés\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"Létrehozásnál\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"Törléskor\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"Időzített\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"Írásnál\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"Adat ID\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Trigger\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikon\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"SVG útvonal\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Művelet\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"Műveleti kulcsszó\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"Alárendelt rekordok\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"Teljes név\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"Kedvencek\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikon\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Menü\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"Szülő menü\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menü\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"Felhasználó\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"Nézet felépítése\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Adat\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"Érvényesség\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"Alárendelt mező\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"Örökölt nézet\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"Prioritás\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"Nézet típusa\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"Érvényesség\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"Felhasználó\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Mező\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Felhasználó\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"Értékek\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"Nézet\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"Alárendelt elem neve\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"Érvényesség\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"Bővített konto\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"Kiválasztott folyószámla\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"Felhasználó\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Mező\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"Felhasználó\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"Szélesség\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"Alap felső határ a lista nézethez\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"Alap keresési érték a listanézetben\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\"Üresen hagyni ugyan ahhoz a formátumhoz, mint a 'bővített javaslat', lásd \"\n\"unoconv-dokumentáció kompatibilis formátumokhoz.\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"Wizard kivitelezés külön ablakokon\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Python kifejezés, mely az adattal (\\\"self\\\"által képviselve)van értékelve.\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Python kifejezés, mely az adattal (\\\"self\\\"által képviselve)van értékelve.\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Python kifejezés, mely az adattal (\\\"self\\\"által képviselve)van értékelve.\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"Modul, melyben ez a minta van definiálva\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\"Python kifejezés, mely az adattal (\\\"self\\\"által képviselve)van értékelve.\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"Az adat ID az adatbankban\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"Adat ID, mint az adatrendszerben\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"Modul, melyben ez a mező van definiálva\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\"Az értékterület egy PYSON Kontexttel van kiértékelve, mely tartalmaz:\\n\"\n\"- \\\"user\\\" als der aktuelle Benutzer\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"Ezt a szabályt alapszabályként minden felhasználónak\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\"Globális szabály\\n\"\n\"(Minden felhasználóra érvényes)\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"A szabály akkor érvényes, ha legalább egy teszt pozitív\"\n\n#, fuzzy\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\"Python kifejezés, mely az adattal (\\\"self\\\"által képviselve)van értékelve.\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\"Hívások számának korlátozása \\\"műveleti funkció\\\" által adatokon keresztül.\\n\"\n\"0 nem limit\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\"Minimum időszak megadása 'műveleti funkció' hívásokhoz ugyan ahhoz az adathoz.\\n\"\n\"Üres azt jelenti, nincs késés.\"\n\n#, fuzzy\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"PySON értékterület\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Művelet\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Műveletek\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Nyomtatványok\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Mellékletek\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Műveletek\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"E-mail\"\n\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"Korábbi e-mailek\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"Hiba\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Ikonok\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Nyelvek\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menü\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Menü\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Clicks\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Buttons\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Adat\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Mezők\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Előjegyzett installációk/aktualizálás végrehajtása\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Module Configuration\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Jegyzetek\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sorszámozások\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"Típus\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Export Translations\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Fordítások\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Fordítások\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Fordítás aktualizálása\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Nézetek\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"Keresés nézet\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Show View\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"Oszlop széles nézet\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"Oszlopszéles nézet\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Diagram\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Diagram\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Workflow Graph\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Fordítások\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"Művelet aktív ablak\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"Aktív ablak nézet\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"összes\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"nyitott\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"összes\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Nem szinkronizált\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Local\"\n\n#, fuzzy\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Modulok\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"Aktív ablak nézet\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"Művelet kulcsszó\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"Művelet jelentés\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"URL Művelet\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"Wizard Művelet\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Melléklet\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"pén\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"hét\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"szo\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"vas\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"csü\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"kedd\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"szer\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"Nap\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"péntek\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"hétfő\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"szombat\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"vasárnap\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"csütörtök\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"kedd\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"szerda\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"ápr\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"aug\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"dec\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"feb\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"jan\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"júl\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"jún\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"márc\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"máj\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"nov\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"okt\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"szep\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"Hónap\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"április\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"augusztus\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"december\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"február\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"január\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"július\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"június\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"március\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"máj\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"november\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"október\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"szeptember\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"Beállítások\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"Cron\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Dátum\"\n\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"E-mail sablon\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"Hiba\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Exportálás\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"Export sor\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Nyelv\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Bulgarian\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Català\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Czech\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"német\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"angol\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Spanyol (Spanyolország)\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Spanish (Latin American)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"French\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"magyar\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italian\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Lao\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Lithuanian\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Dutch\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Polish\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Russian\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Slovenian\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Chinese Simplified\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"Nincs hozzáférési engedélye a(z) „%(model)s” elemhez.\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"Nincs hozzáférési engedélye a(z) „%(model)s.%(field)s” mezőhöz.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Érvénytelen összefüggés \\\"%(context)s\\\" a műveletben \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\"Érvénytelen értéktartomány (Domain) vagy keresési kritérium \"\n\"\\\"%(domain)s\\\"akcióban \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Érvénytelen nézet \\\"%(view)s\\\" a művelethez \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"Helytelen Wizard mint a kulcsszó műveletben \\\"%s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Aktív\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"Kapcsolja ki, ha ezt a rekordot a jövőben nem akarja használni.\"\n\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Mellékletek\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"Egy modul neve csak egyszer adható.\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"This record is part of the base configuration.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"Egy modul neve csak egyszer adható.\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Nem tud „%(model)s” rekordokat létrehozni, mert a következő szabályok legalább egyike nem teljesül:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"Létrehozás dátuma\"\n\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"Létrehozta\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Nem tudja a „%(model)s” „%(ids)s” ID-vel rendelkező rekordjait törölni, mert a következő szabályok legalább egyike nem teljesül:\\n\"\n\"%(rules)s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"nov\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"igen/nem\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"szöveg\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"dátum\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"dátum és idő\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"Tizedesjegyek\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"Érvényesség\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"lebegőpontos szám\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"Magyarázat\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Értéklista magyarázata\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Kiválasztás\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"egész szám\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Érvénytelen e-mail cím a jelentésben \\\"%s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"értéklista többszörös\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"szám tizedesjegyekkel\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"értéklista\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"Kiválasztás\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"Értéklista sorba rendezve\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"Jelölje be, ha az értéklista elemeit sorba kell rendezni.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"Szöveg\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"Típus\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" exceeds the \"\n\"digits limit of \\\"%(digits)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"A „%(model)s” elem „%(field)s” mezője hibásan van kitöltve.\"\n\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"Módosítás dátuma\"\n\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"Módosította\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Érvénytelen összefüggés \\\"%(context)s\\\" a műveletben \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Érvénytelen összefüggés \\\"%(context)s\\\" a műveletben \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Érvénytelen összefüggés \\\"%(context)s\\\" a műveletben \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"A minta csak egyszer adható.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"Az alapnyelv fordítható legyen.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"Az alapnyelvet nem lehet törölni.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Érvénytelen a dátum alakja \\\"%(format)s\\\" a \\\"%(language)s\\\" nyelvben.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Érvénytelen csoportosítás \\\"%(grouping)s\\\" a \\\"%(language)s\\\" nyelvben.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\"A Tigger \\\"%(trigger)s\\\" feltételei \\\"%(condition)s\\\" nem érvényes Python \"\n\"kifejezés.\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"A már telepített vagy telepítésre előjegyzett modul nem törölhető.\"\n\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Jegyzetek\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Nem tudja a „%(model)s” „%(ids)s” ID-vel rendelkező rekordjait olvasni, mert a következő szabályok legalább egyike nem teljesül:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Rekord neve\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Syntax error for reference %r in %s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Relation not found: %r in %s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"Érvénytelen e-mail cím a jelentésben \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Érvénytelen összefüggés \\\"%(context)s\\\" a műveletben \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"A „%(model)s” elem „%(field)s” mezőjét ki kell tölteni.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"A „%(model)s” elem „%(field)s” mezőjét ki kell tölteni.\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"Érvénytelen értéktartomány (Domain) szabályozásban \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not in \"\n\"the selection.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Sorszám\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"Érvénytelen összefüggés \\\"%(context)s\\\" a műveletben \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Érvénytelen előtag \\\"%(prefix)s\\\" a számkörben \\\"%(sequence)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Érvénytelen toldalék \\\"%(prefix)s\\\" a számkörben \\\"%(sequence)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"Az idő a számkörhöz \\\"%s\\\" nem lehet a jövőben\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"Hiányzó számkör.\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"H\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"É\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"t\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"ó\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"m\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"s\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"h\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Too many relations found: %r in %s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\"Fordítás %(name) nem exportálható, mert a modulokon %(overriding_module) \"\n\"keresztül vannak átírva.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\"A Tigger \\\"%(trigger)s\\\" feltételei \\\"%(condition)s\\\" nem érvényes Python \"\n\"kifejezés.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"Érvénytelen XML-adat nézethez \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\"Érvénytelen értéktartomány (Domain) vagy keresési kritérium \"\n\"\\\"%(domain)s\\\"akcióban \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Nem tudja a „%(model)s” „%(ids)s” ID-vel rendelkező rekordjait módosítani, mert a következő szabályok legalább egyike nem teljesül:\\n\"\n\"%(rules)s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"You are not allowed to modify this record.\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Hozzáférés\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"Minta gomb\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"nyitott\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Fordítás tisztítás\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Fordítás tisztítás\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Sync\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Mark for Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Show\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"Minta adat\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"Minta mező\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"Minta mező hozzáférésének engedélyezése\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"Grafikon nyomtatása\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"Modul telepítésének aktualizálása megtörtént\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"Modul telepítésének aktualizálása indít\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"Modulkonfigurációs wizard befejezve\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"Konfigurációs wizard első modul\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"Konfigurációs wizard modul telepítés után\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"Konfigurációs wizard más modul\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"Modultól függő\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Jegyzetek\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"Szabály\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"Szabályos csoport\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Sorszám\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Pontos számkör\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Sorszámozás típusa\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"Munkamenet\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"Wizard Munkamenet\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Fordítás\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Fordítás tisztítás\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Fordítás tisztítás\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Export fordítás\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Export fordítás\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Fordítás aktualizálása\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Fordítás aktualizálása\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"Fordítás aktualizálása\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Trigger\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"Trigger Protokoll\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Ikon\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"Menü\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Műveletek\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Műveletek\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Nyomtatványok\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Adminisztráció\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Mellékletek\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Műveletek\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"E-mail\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"Hiba\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Ikonok\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"Típus\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Nyelvek\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Localization\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menü\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"Használat\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Buttons\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Adat\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Előjegyzett installációk/aktualizálás végrehajtása\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Jegyzetek\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Scheduler\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sorszámozások\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Sorszámozások\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Export Translations\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Fordítások\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Set Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"User Interface\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Nézetek\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"Keresés nézet\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"Oszlop széles nézet\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"Oszlopszéles nézet\"\n\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Mezők\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"Kedvencek\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Nézet\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Előnézet megjelenítése\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"Keresés nézet\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"Oszlop széles nézet\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"Oszlop széles nézet\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"Oszlopszéles nézet\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Kiválasztott folyószámla\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Kiválasztott folyószámla\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"Űrlap művelet\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"Hivatkozási űrlap\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"Grafika megnyitása\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"Megnyitás\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"Űrlap nyomtatása\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Kiválasztott folyószámla\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Kiválasztott folyószámla\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Kiválasztott folyószámla\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Adat\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"Hivatkozás\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"Nap\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"Óra\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"Perc\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"Hónap\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"Hét\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Művelet\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"nyitott\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"Balról jobbra\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"Jobbról balra\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"Eltávolítandó\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Frissítendő\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"Kész\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"nyitott\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"Eltávolítandó\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Frissítendő\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"Ismeretlen\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"decimális időpont\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"hexadecimális időpont\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"növekvő\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"decimális időpont\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"hexadecimális időpont\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"növekvő\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Mező\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"Súgó\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Minta\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Nyomtatvány\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"Értéklista\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Nézet\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"Wizard gomb\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"Info oldal\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"Naptár\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"Űrlap\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Diagram\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"Fa\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"Általános\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"Módosítás\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"Általános\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"Általános\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"Általános\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"Általános\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"Utolsó módosítás ideje\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"Időpont\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"Következő hívás\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"Következő hívás\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel Upgrade\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Mark for Upgrade\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Dátum\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"Időpont\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"Felhasználó\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"A szabály akkor érvényes, ha legalább egy teszt pozitív\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"${day}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"${month}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"${year}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"Nap:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"Növekvő\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"Előtagban, utótagban használható változók\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"Hónap:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"Időbélyeg\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"Év:\"\n\n#, fuzzy\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"Fordítások rendezése\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Szinkronizáljam a fordításokat?\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"A fordítás sikeresen be lett állítva.\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Mégse\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Mégse\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"Nyomtatás\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Mégse\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"Start\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Aktív\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Mégse\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"Mégse\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"Tovább\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"Mégse\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"Tisztítás\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Mégse\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"Bezárás\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Mégse\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Exportálás\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Mégse\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"Aktualizálás\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Mégse\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"Frissítés\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"Bezárás\"\n"
  },
  {
    "path": "trytond/ir/locale/id.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Kata Kunci\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"Catatan\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"Jenis\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"Penggunaan\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Kata Kunci\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"Batasan\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"Rekaman\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"Kriteria Pencarian\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"Jenis\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"Penggunaan\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"Kata Kunci\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"Cetak Langsung\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Kata Kunci\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Catatan\"\n\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"Catatan\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"Kandungan\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"Kandungan\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"Tunggal\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Dapat Diterjemahkan\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"Jenis\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"Penggunaan\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Kata Kunci\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"Catatan\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"Url Tindakan\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"Penggunaan\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Kata Kunci\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"Rekaman\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"Jenis\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"Penggunaan\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"Jendela\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"Nama wisaya\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Salin ke Sumber Daya\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"Ukuran data\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Deskripsi\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"ID Berkas\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Perubahan Terakhir\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Pengguna Terakhir\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"Tautan\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"Sumber daya\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"Ringkasan\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"Jenis\"\n\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Sumber daya\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Sumber daya\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Perubahan Terakhir\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Pengguna Terakhir\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"Sumber daya\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"UUID\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"Penanda waktu\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Singkatan\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"Indeks\"\n\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Singkatan\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"Indeks\"\n\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"Hostname\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"bahasa\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"Hari\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"Jam\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"Metode\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"Menit\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"Waktu\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"Alamat-Alamat\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"Sumber daya\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"Alamat\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"Email\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Nama Model\"\n\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"Penerima\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Laporan-Laporan\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Laporan\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"Templat\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Deskripsi\"\n\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"Pesan\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"Asal\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"Dibuat oleh\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Status\"\n\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"Ringkasan\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"Sumber daya\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"AM\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"Kode\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Tanggal\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Pemisah Desimal\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Pemisah Desimal\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Pemisah Ribuan\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"Simbol Mata Uang Negatif Mendahului\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"Negatif Dipisahkan oleh Spasi\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"Posisi Tanda Negatif\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"Tanda Negatif\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"Simbol Mata Uang Positif Mendahului\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"Positif Dipisahkan oleh Spasi\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"Posisi Tanda Positif\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"Kode Induk\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"PM\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"Tanda Positif\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Pemisah Ribuan\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Dapat diterjemahkan\"\n\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Bahasa-Bahasa\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"Teks\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"Pencarian Global\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"Informasi\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"Nama Model\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"Deskripsi Model\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Deskripsi\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Kelompok\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Klik\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"Konfirmasi\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"Bantuan\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Tombol\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Tombol\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Tombol\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"Kondisi\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Deskripsi\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID Sumber daya\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"Tidak Ada Pembaharuan\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"Bantuan\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Deskripsi\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Kelompok\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Saring\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"Status\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"Versi\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Modul-Modul\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"Status\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"Persentase\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"Status\"\n\n#, fuzzy\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Sumber daya\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Perubahan Terakhir\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Pengguna Terakhir\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"Pesan\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"Pesan\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"Sumber daya\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Catatan\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Kelompok\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nama Urutan\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Nomor Berikutnya\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Nomor Berikutnya\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Awalan\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Jenis Urutan\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Akhiran\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nama Urutan\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Nomor Berikutnya\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Nomor Berikutnya\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Awalan\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Jenis Urutan\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Akhiran\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nama Urutan\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"Kunci\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Bahasa\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID Sumber daya\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"Berkas\"\n\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"Nama Berkas\"\n\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Bahasa\"\n\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Bahasa\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Bahasa\"\n\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"Kondisi\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"Saat Membuat\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"Saat Menghapus\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"Tepat Waktu\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"Saat Menulis\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Pemicu\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"Kata Kunci Tindakan\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"Cabang\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"Nama Lengkap\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"Prioritas\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"Lebar\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"Jalankan wisaya pada jendela baru.\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Tindakan-Tindakan\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Laporan-Laporan\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URL-URL\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Wisaya-Wisaya\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Lampiran-Lampiran\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Butir Wisaya Konfigurasi\"\n\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Tindakan-Tindakan\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Email\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"Email\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Ikon\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Bahasa\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Bahasa-Bahasa\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"Pesan\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Klik\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Tombol\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Lakukan Aktivasi/Upgrade Tertunda\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Konfigurasi Modul\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modul-Modul\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Catatan-Catatan\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Urutan-Urutan\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"Jenis\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Menyamakan Terjemahan\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Terjemahan\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"Buka\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Modul-Modul\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"Kata kunci tindakan\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"Laporan tindakan\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"URL Tindakan\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"Wisaya Tindakan\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Lampiran\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"Jum\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"Sen\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"Sab\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"Min\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"Kam\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"Sel\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"Rab\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"Hari\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"Jumat\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"Senin\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"Sabtu\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"Minggu\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"Kamis\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"Selasa\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"Rabu\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"Apr\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"Agu\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"Des\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"Feb\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"Jan\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"Jul\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"Jun\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"Mar\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"Mei\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"Nov\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"Okt\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"Sep\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"Bulan\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"April\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"Agustus\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"Desember\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"Februari\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"Januari\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"Juli\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"Juni\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"Maret\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"Mei\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"November\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"Oktober\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"September\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"Konfigurasi\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"Cron\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Tanggal\"\n\n#, fuzzy\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"Email\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"Alamat Email\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Bahasa\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Bulgaria\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"Jerman\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"Inggris\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Spanyol\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Spanyol (Amerika Latin)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"Estonia\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"Persia\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"Finlandia\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"Perancis\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Hongaria\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"Bahasa Indonesia\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italia\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Lithuania\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Belanda\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Polandia\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"Portugis\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"Estonia\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Rusia\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"Turki\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Bahasa\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"Pesan\"\n\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"Tombol panggil \\\"%(button)s pada \\\"%(model)s\\\" tidak diizinkan.\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"Anda tidak diizinkan mengakses \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"Anda tidak diizinkan mengakses \\\"%(model)s.%(field)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"Anda tidak diizinkan mengakses \\\"%(model)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"Anda tidak diizinkan mengakses \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"Model wisaya salah pada tindakan kata kunci \\\"%(name)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Aktif\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Lampiran-Lampiran\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"Dibuat pada\"\n\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"Dibuat oleh\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"Anda tidak diizinkan untuk menghapus catatan ini.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"Tidak\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Tanggal\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"TanggalWaktu\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"Bantuan\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Pilihan Bantuan\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Pilihan\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Pilihan\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Pilihan\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"Ya\"\n\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"Disunting pada\"\n\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"Disunting oleh\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"Gagal menyimpan, coba lagi.\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"ID harus positif.\"\n\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"Kode pada bahasa harus unik.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"Bahasa default tidak dapat dihapus.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"Bahasa default tidak dapat dihapus.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Catatan-Catatan\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Kesalahan sintaks untuk referensi: \\\"%(value)r\\\" di dalam \\\"%(field)s\\\" dari\"\n\" \\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Urutan\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Kesalahan sintaks untuk id XML: \\\"%(value)r\\\" di dalam \\\"%(field)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"Anda tidak diizinkan untuk mengubah catatan ini.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Kesalahan sintaks untuk id XML: \\\"%(value)r\\\" di dalam \\\"%(field)s\\\".\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"Apakah Anda yakin ingin memanggil terjemahan bahasa?\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Jalankan Satu Kali\"\n\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"Buka\"\n\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Proses\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Terjemahan\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Terjemahan\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Bahasa\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Catatan\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Urutan\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Terjemahan\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"UI menu\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Laporan-Laporan\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URL-URL\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Wisaya-Wisaya\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Administrasi\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Lampiran-Lampiran\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Butir Wisaya Konfigurasi\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Tindakan-Tindakan\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Email\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"Templat E-mail\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Ekspor\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Ikon\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"Jenis\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Bahasa-Bahasa\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"Pesan\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modul-Modul\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Modul-Modul\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Catatan-Catatan\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Urutan-Urutan\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Urutan-Urutan\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Terjemahan\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Pilihan\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Pilihan\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Pilihan\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Pilihan\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Pilihan\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"Tautan\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"Buka\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"Buka\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"Bantuan\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Laporan\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"Pilihan\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"Tombol Wisaya\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"Kalender\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"Umum\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"Sunting\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"Umum\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"Umum\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"Umum\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"Umum\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"Dokumen\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Jalankan Satu Kali\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"Asal\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"Anda sekarang bisa memanggil terjemahan tambahan pada sistem.\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"Modul-Modul sudah ditingkatkan / diaktifkan.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"Perhatikan bahwa operasi ini mungkin memakan waktu beberapa menit.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"Sistem Anda akan ditingkatkan.\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"Anda sekarang bisa mengaktifkan modul-modul tambahan ke dalam sistem.\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Tandai untuk Aktivasi\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Tandai untuk Deaktivasi (beta)\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Tanggal\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"Waktu\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"${day}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"${month}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"${year}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"Hari:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"Bulan:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"Tahun:\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Batal\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Batal\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"Cetak\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Batal\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"Mulai Tingkatkan\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Aktif\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Batal\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"Batal\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"Berikutnya\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"Batal\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Batal\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"Tutup\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Batal\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Batal\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Batal\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"Tutup\"\n"
  },
  {
    "path": "trytond/ir/locale/it.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icona\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Keywords\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"Record ID\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"Dominii\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Viste\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Azione\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"Valore Contenuto\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"modello context\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"Valore di Dominio\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"Dominii\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icona\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Keywords\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"Limite\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"Ordinare per valore\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"Context PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"Dominio PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"Ordine PySon\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"Criterio di ricerca PySON\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"Record ID\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"Criteri di ricerca\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Viste\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Azione\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"Conteggio\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"Dominio\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Azione\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Vista\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Azione\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"Keyword\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Azione\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"Stampa immediata\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"Estensione\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icona\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Keywords\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Modulo\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Record ID\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"Record ID\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"Percorso\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"Contenuto\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"Contenuto\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"Nome del Contenuto\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"Nome Interno\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"Estensione del template\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Traducibile\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Azione\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icona\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Keywords\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"Record ID\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"Url Azione\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Azione\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icona\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Keywords\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"Record ID\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"Finestra\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"Nome Wizard\"\n\n#, fuzzy\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Risorsa\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Dati\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"Dimensione dati\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Descrizione\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"ID file\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Ultima Modifica\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Ultimo utente\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"Link\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"Risorsa\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"Sommario\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Risorsa\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Risorsa\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Ultima Modifica\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Ultimo utente\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"Risorsa\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"Dimensione\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"Marca temporale\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"lingua\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"Giorno\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"Ora\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"Intervallo Numerico\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"Minuti\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"Prossima Call\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"Tempo\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"Corpo\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"Risorsa\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"Utente\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"Email\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"Corpo\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Nome modello\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Report\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"Estensione del template\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Descrizione\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"Messaggio\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"Origine\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"Creazione Utente\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Stato\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"Sommario\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Campi\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"Risorsa\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Esportazione\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"Codice\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Separatore dei decimali\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"Previsione\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Raggruppamento\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Separatore dei decimali\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Raggruppamento\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Separatore delle migliaia\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Separatore delle migliaia\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Traducibile\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"Prossimo\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Campi\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"Ricerca globale\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"Informazione\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"Nome modello\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Modulo\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"Descrizione Modello\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Descrizione\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppo\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Creazione Accesso\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Eliminazione dell'accesso\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Accesso di lettura\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Accesso scrittura\"\n\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"click\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"Aiuto\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"Azzera\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"azzerato da\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"Regole\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"pulsante\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"pulsante vincolato\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"pulsante\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"Record ID\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"pulsante\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"Condizione\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Descrizione\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"numero utente\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID Risorsa\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"Identificatore nel file system\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"Valori nel File System\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Modulo\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"Nessun Aggiornamento\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Out of Sync\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"Valori\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"Descrizione campo\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"Aiuto\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Modulo\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"Relazione modello\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"tipo campo\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Descrizione\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Campo\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppo\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Creazione Accesso\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Eliminazione dell'accesso\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Accesso di lettura\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Accesso scrittura\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Filtro\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"Livello\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"Figli\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"Dipendenze\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"Padri\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"Stato\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"Versione\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"Moduli da aggiornare\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Azione\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"Stato\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"Percentuale\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Modulo\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"Stato\"\n\n#, fuzzy\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Risorsa\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Ultima Modifica\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Ultimo utente\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"Messaggio\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"Messaggio\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"Risorsa\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"Non Letto\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Nota\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"Utente\"\n\n#, fuzzy\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Dati\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"Dominio\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Gruppo\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"Predefinito\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"Globale\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Creazione Accesso\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Eliminazione dell'accesso\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Accesso di lettura\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Accesso scrittura\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"Tests\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Ultima marcatura temporale\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nome Sequenza\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Incremento Numero\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Prossimo Numero\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Prossimo Numero\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Padding del numero\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Prefisso\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Suffisso\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Marca temporale offset\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Marca temporale arrotondamento\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Ultima marcatura temporale\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nome Sequenza\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Incremento Numero\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Prossimo Numero\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Prossimo Numero\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Padding del numero\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Prefisso\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Stato\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Marca temporale offset\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Marca temporale arrotondamento\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nome Sequenza\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"Chiave\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Dati\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"Fuzzy\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Lingua\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Modulo\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"Nome campo\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"Modulo non tenuto in conto\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID Risorsa\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"Source\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"Termine tradotto\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"File\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"File\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Lingua\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Modulo\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Lingua\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Modulo\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Lingua\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Azione\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"Condizione\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"Numero Limite\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"Ritardo minimo\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"Alla creazione\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"All'eliminazione\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"On Time\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"Alla scrttura\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"Record ID\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Trigger\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icona\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Modulo\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"Percorso SVG\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Azione\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"Keywords Azione\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"Figlio\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"Completare il nome\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"Preferito\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icona\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"Menu Padre\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"Utente\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"Architettura della vista\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Dati\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"Dominio\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"Campo Figlio\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"Vista incrementale\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Modulo\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"PrioritÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ \"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"Vista Tipo\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"Dominio\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"Utente\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Campo\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Utente\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"Valori\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"Vista\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"Nome del figlio\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"Dominio\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"Nodi Espansi\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"Nodi selezionati\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"Utente\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Campo\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"Utente\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"Larghezza\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"Limite predefinito per la vista della lista\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"Criteri di ricerca predefiniti per la vista della lista\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\"Lasciare vuoto per lo stesso come modello, vedere la documentazione unovonv \"\n\"per il formato compatibile\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"Esegui il wizard in nuova finestra\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Un espressione PYSON che genera una lista di recipineti nascosti dal record \"\n\"rappresentato da \\\"self\\\".\"\n\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Un espressione PYSON che genera una lista di recipineti dal record \"\n\"rappresentato da \\\"self\\\".\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Un espressione PYSON che genera una lista di recipineti secondari dal record\"\n\" rappresentato da \\\"self\\\".\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"Modulo dove ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ¨ definito questo modello\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"pulsante per azzerare le regole\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\"Istruzione PYSON valutata dal record rappresentato da \\\"self\\\"\\n\"\n\" . Attiva la regola se vera.\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"l'id del record nel database\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"l'id del record come indicato nel file system\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"Modulo dove ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ¨ definito questo campo\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\"L'imputazione di un'espressione regolare Python \"\n\"escluderÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ  il matching dei modelli dal grafico\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\"Il dominio è valutato con un context PYSON contenente \\n\"\n\" - \\\"user\\\", come utente attuale\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"Aggiungi automaticamente questa regola a ciascun utente\"\n\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\"Rendere globale la regola \\n\"\n\"così ogni utente deve segire tale regola.\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\"La regola ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ¨ rispettata se almeno uno \"\n\"ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ¨ True\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\"Istruzione PYSON valutata dal record rappresentato da \\\"self\\\"\\n\"\n\" . Attiva la regola se vera.\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\"Limitare per record il numero delle chiamate ad \\\"Action Functions\\\".\\n\"\n\"0 per nessun limite.\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\"Imposta un ritardo minimo fra le call ad \\\"Action Function\\\" per la stesso record.\\n\"\n\" Vuoto per nessun ritardo\"\n\n#, fuzzy\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"Dominio PYSON\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Azione\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Allegati\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Email\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"Email\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"Errore\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icons\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Configure Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"Messaggio\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Clicks\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Buttons\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Perform Pending Activation/Upgrade\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Module Configuration\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"Tipo\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Export Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Traduzioni\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Set Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Show View\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"Vista ad albero dello stato\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Workflow Graph\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Traduzioni\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"Finestra Action act\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"Dominio finestra Action act\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"All\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"Apertura\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"All\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Out of Sync\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Local\"\n\n#, fuzzy\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Moduli\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"Vista finestra Action act\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"Keyword Azione\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"Report Azione\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"URL Azione\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"Wizard Azione\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Allegato\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"Giorno\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"Mesi\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"Configurazione\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"Operazione pianificata\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\n#, fuzzy\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"Email\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"Errore\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Esportazione\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"Esportazione riga\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Lingua\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Bulgarian\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Català\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Czech\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"German\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"English\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Spanish\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Spanish (Latin American)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"French\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Hungarian\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italian\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Lao\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Lithuanian\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Dutch\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Polish\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Russian\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Slovenian\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Chinese Simplified\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Configure Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"Messaggio\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Context \\\"%(context)s\\\" invalido nell'azione \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\"Dominio o criterio di ricerca \\\"%(domain)s\\\" invalido nell'azione \"\n\"\\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Vista \\\"%(view)s invalida per l'azione \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"Modello wizard sbagliato nella keyword action \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Attivo\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Allegati\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"Il nome del modulo dev'essere unico\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"This record is part of the base configuration.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"Il nome del modulo dev'essere unico\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"Creato il\"\n\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"Creato da\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"Nota\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"Pulizia\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"Dominio\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"Aiuto\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Selezione\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Selezione\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Definizione dell'email invalida nel report \\\"%s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Selezione\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Selezione\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"Selezione\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"Selezione\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" exceeds the \"\n\"digits limit of \\\"%(digits)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"The value of the field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not valid according\"\n\" to its domain.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"Creazione Data\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"Creazione Utente\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Context \\\"%(context)s\\\" invalido nell'azione \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Context \\\"%(context)s\\\" invalido nell'azione \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Context \\\"%(context)s\\\" invalido nell'azione \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"Il modello dev'essere unico\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"Il linguaggio predefinito dev'essere traducibile\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"\"\n\"La lingua predefinita non si puÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ² eliminare\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Formato data \\\"%(format)s\\\" invalido nella lingua \\\"%(language)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Raggruppamento \\\"%(grouping)s\\\" invalido nella lingua \\\"%(language)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\"La condizione \\\"%(condition)s\\\" non e un'epressione PYSON valida nella \"\n\"regola bottone \\\"%(rule)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\"Alcuni moduli attivi dipendono da quelli che stai tentando di disattivare:\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"Non si può rimuovere un modulo attivato o da attivare.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Record ID\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Syntax error for reference %r in %s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Relation not found: %r in %s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"Definizione dell'email invalida nel report \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Context \\\"%(context)s\\\" invalido nell'azione \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"Dominio invalido nella regola \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not in \"\n\"the selection.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Sequenza\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"Context \\\"%(context)s\\\" invalido nell'azione \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Prefisso \\\"%(prefix)s\\\" invalido nella sequenza \\\"%(sequence)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Suffisso \\\"%(suffix)s\\\" invalido nella sequenza \\\"%(sequence)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"\"\n\"L'ultima marcatura temporale non puÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ² essere \"\n\"in futuro nella sequenza \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"Sequenza mancante\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Too many relations found: %r in %s\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\"Traduzione %(name)s non esportabile perche superata dal modulo \"\n\"%(overriding_module)s.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\"La condizione \\\"%(condition)s\\\" non e' un'epressione PYSON valida per il \"\n\"trigger \\\"%(trigger)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"XML invalido per la vista \\\"%s\\\"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\"Dominio o criterio di ricerca \\\"%(domain)s\\\" invalido nell'azione \"\n\"\\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"You are not allowed to modify this record.\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Accesso modello\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"Bottone Modello\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"Apertura\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Pulire la traduzione\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Pulire la traduzione\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Sync\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Mark for Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Show\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"modello pulsante azzeramento\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"modello pulsante click\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"modello pulsante regola\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"Dati modello\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"Campo modello\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"Accesso a campi modello\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"Stampa modello grafico\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Modulo\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"Eseguita attivazione dell'upgrade del modulo\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"Inizio attivazione upgrade del modulo\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"Wizard di config modulo Fatto\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"Wizard di config modulo primo\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"Lanciare il wizard di configurazione dopo l'installazione del modulo\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"Wizard di config modulo Altro\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"Dipendenza Modulo\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Nota\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"leggere la nota\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"Regola\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"Regola gruppo\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Sequenza\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Sequenza Stretta\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Tipo sequenza\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"Sessione\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"Wizard sessione\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Traduzione\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Pulire la traduzione\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Puire la traduzione\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Esportazione Traduzione\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Esportazione Traduzione\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Impostazione traduzione\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Impostazione traduzione\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"Aggiornamento traduzione\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Trigger\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"Log del trigger\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Icona\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"menu interfaccia utente\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Administration\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Allegati\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Email\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"Errore\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icons\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"Tipo\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Localization\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"Messaggio\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Buttons\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Perform Pending Activation/Upgrade\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Scheduler\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Export Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Set Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"User Interface\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"Vista ad albero dello stato\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"Menu Preferito\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Vista\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Mostra vista\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"Cerca vista\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"Vista ad albero dello stato\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"Vista ad albero dello stato\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"Vista ad albero dell'ampiezza\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Nodi selezionati\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Nodi selezionati\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"Form Azione\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"Relazione a Form\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"Apertura Grafico\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"Apri tree\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"Stampa form\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Nodi selezionati\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Nodi selezionati\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Nodi selezionati\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Dati\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"Link\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"Giorni\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"Ore\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"Minuti\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"Mesi\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"Settimana\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"Pulizia Traduzioni riuscita\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Azione\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"Apertura\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"Sinistra-destra\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"Destra-Sinistra\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"Attivata\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"non attivato\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"da attivare\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"Da rimuovere\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Da upgradare\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"Fatto\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"Apertura\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"Attivato\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"non attivato\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"da attivare\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"Da rimuovere\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Da upgradare\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"URLs\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Timestamp Decimale\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Marca temporale esadecimale\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"Incrementale\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Timestamp Decimale\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Marca temporale esadecimale\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"Incrementale\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Campo\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"Aiuto\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Modello\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Report\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"Selezione\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Vista\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"Bottone Wizard\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"Tavola\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"Calendario\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"Modulo\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Grafo\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"Tree\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"Generale\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"Generale\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"Generale\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"Generale\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"Generale\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"Ultima Modifica\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"Prossima Call\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"Prossima Call\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"esegui una volta\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"Origine\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"Formato Data\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"Formattazione dei numeri\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"I moduli sono stati elevati /attivati\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"Questa operazione potrebbe durare qualche minuto\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"Il sistema verra'  upgradato\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"Configurazione effettuata\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"Installazione configurabile dall'utente in base ai moduli installati\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"annulla attivazione\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"annulla deattivazione\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancellare l'upgrade\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"spuntare per attivare\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"spuntare per deattivare (beta)\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Seleziona per upgrade\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"Tempo\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"Utente\"\n\n#, fuzzy\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\"Se non c'ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ¨ test definito la regola se non \"\n\"globale ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ¨ sempre rispettata\"\n\n#, fuzzy\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\"La regola ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ¨ rispettata se almeno uno \"\n\"ÃÂÃÂÃÂÃÂÃÂÃÂÃÂÃÂ¨ True\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"$ {giorno}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"$ {mese}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"$ {anno}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"Giorno:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"Incrementale\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"Legenda (segnaposto per prefisso, suffisso)\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"Mese:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"Marca Temporale\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"Anno:\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"Pulire le traduzioni?\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Sincronizza Traduzioni?\"\n\n#, fuzzy\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"La traduzionedev'essere unica\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annulla\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annulla\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"Stampa\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annulla\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"Avvia l'upgrade\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Attivata\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annulla\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annulla\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"Prossimo\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annulla\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"Pulizia\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annulla\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"Chiudi\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annulla\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Esportazione\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annulla\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"Imposta\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annulla\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"Aggiornamento\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"Chiudi\"\n"
  },
  {
    "path": "trytond/ir/locale/lo.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"ໄອຄັອນ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"ຂໍ້ຄວາມຫຼັກ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"ປະເພດ\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"ເບິ່ງ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"ການປະຕິບັດ\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"ໄອຄັອນ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"ຂໍ້ຄວາມຫຼັກ\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"ປະເພດ\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"ເບິ່ງ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"ການປະຕິບັດ\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"ການປະຕິບັດ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"ເບິ່ງ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"ການປະຕິບັດ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"ຄຳລະຫັດ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"ການປະຕິບັດ\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"ໄອຄັອນ\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"ຂໍ້ຄວາມຫຼັກ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"ປະເພດ\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"ການປະຕິບັດ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"ໄອຄັອນ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"ຂໍ້ຄວາມຫຼັກ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"ປະເພດ\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"ການປະຕິບັດ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"ໄອຄັອນ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"ຂໍ້ຄວາມຫຼັກ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"ປະເພດ\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"ວັນທີ:\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"ເນື້ອໃນລາຍການ\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"ປະເພດ\"\n\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"ສ້າງຜູ້ໃຊ້\"\n\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"ພາສາ\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"ເວລາ\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"ຜູ້ໃຊ້\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Models Access\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"ລາຍງານ\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"ລາຍງານ\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"ເນື້ອໃນລາຍການ\"\n\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"ສ້າງຜູ້ໃຊ້ງານ\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"ສະຖານະ\"\n\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"ຟິນລ໌\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Exports\"\n\n#, fuzzy\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"ລະຫັດແຂວງ\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"ວັນທີ:\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"ໝາຍຂັ້ນເລກເສດ\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"ຈັດກຸ່ມຫົວພັນ\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"ໝາຍຂັ້ນເລກເສດ\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"ຈັດກຸ່ມຫົວພັນ\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"ໝາຍຂັ້ນຫົວພັນ\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"ໝາຍຂັ້ນຫົວພັນ\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"ພາສາ\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"ຟິນລ໌\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"ເນື້ອໃນລາຍການ\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"ໝວດ\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Clicks\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"ສູດຄິດໄລ່\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"ປຸ່ມ\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"ປຸ່ມ\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"ປຸ່ມ\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"ເນື້ອໃນລາຍການ\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Out of Sync\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"ໝາຍເລກ\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"ເນື້ອໃນລາຍການ\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"ຟິນລ໌\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"ໝວດ\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"ລະດັບ\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"ສະຖານະ\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"ການປະຕິບັດ\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"ສະຖານະ\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"ອັດຕາສ່ວນຮ້ອຍ\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"ສະຖານະ\"\n\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"ໝາຍເຫດ\"\n\n#, fuzzy\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"ຜູ້ໃຊ້\"\n\n#, fuzzy\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"ວັນທີ:\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"ໝວດ\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"ປະເພດ\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"ປະເພດ\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"ວັນທີ:\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"ພາສາ\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"ປະເພດ\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"ພາສາ\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"ພາສາ\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"ພາສາ\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"ການປະຕິບັດ\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Triggers\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"ໄອຄັອນ\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"ການປະຕິບັດ\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"ໝວດຍ່ອຍ\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"ໄອຄັອນ\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"ລາຍການ\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"ລາຍການ\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"ຜູ້ໃຊ້\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"ວັນທີ:\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"ຜູ້ໃຊ້\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"ຟິນລ໌\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"ຜູ້ໃຊ້\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"ໝາຍເລກ\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"ເບິ່ງ\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"ຜູ້ໃຊ້\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"ຟິນລ໌\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"ຜູ້ໃຊ້\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"ການປະຕິບັດ\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"ການປະຕິບັດ\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"ລາຍງານ\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"ເອກະສານຄັດຕິດ\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"ການປະຕິບັດ\"\n\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"ໄອຄັອນ\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Configure Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"ພາສາ\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"ລາຍການ\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"ລາຍການ\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Clicks\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"ປຸ່ມ\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"ວັນທີ:\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"ຟິນລ໌\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Perform Pending Activation/Upgrade\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Module Configuration\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"ໝາຍເຫດ\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"ລຳດັບ\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"ປະເພດ\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"ລ້າງການແປ\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Export Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"ລ້າງການແປ\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"ລ້າງການແປ\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"ລ້າງການແປ\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"ເບິ່ງ\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Show View\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"ສະຖານະເບິ່ງແບບຕົ້ນໄມ້\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Workflow Graph\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"ລ້າງການແປ\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"ທັງໝົດ\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"ໄຂ\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"ທັງໝົດ\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Out of Sync\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Local\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"ເອກະສານຄັດຕິດ\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"ການຕັ້ງຄ່າ\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"ວັນທີ:\"\n\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Exports\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"ພາສາ\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Bulgarian\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Català\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Czech\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"German\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"English\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Spanish\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Spanish (Latin American)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"French\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Hungarian\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italian\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Lao\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Lithuanian\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Dutch\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Polish\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Russian\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Slovenian\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Chinese Simplified\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ເລດລຳດັບ\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"ໃຊ້ຢູ່\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"ເອກະສານຄັດຕິດ\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"This record is part of the base configuration.\"\n\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"ສ້າງວັນທີ\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"ສ້າງຜູ້ໃຊ້ງານ\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"ໝາຍເຫດ\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"ວັນທີ:\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"ວັນທີ:\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Scheduled Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"ປະເພດ\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" exceeds the \"\n\"digits limit of \\\"%(digits)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"The value of the field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not valid according\"\n\" to its domain.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"ສ້າງວັນທີ\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"ສ້າງຜູ້ໃຊ້ງານ\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"ໝາຍເຫດ\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Syntax error for reference %r in %s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Relation not found: %r in %s\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not in \"\n\"the selection.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"ລໍາດັບ\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Too many relations found: %r in %s\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"You are not allowed to modify this record.\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Models Access\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"ໄຂ\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"ລ້າງການແປ\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"ລ້າງການແປ\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Sync\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Mark for Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Show\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"ໝາຍເຫດ\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"ສູດຄິດໄລ່\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"ລໍາດັບ\"\n\n#, fuzzy\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Sequences Strict\"\n\n#, fuzzy\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"ລ້າງການແປ\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"ລ້າງການແປ\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"ລ້າງການແປ\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"ສົ່ງການແປອອກ\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"ສົ່ງການແປອອກ\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"ລ້າງການແປ\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"ລ້າງການແປ\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Triggers\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"ໄອຄັອນ\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"ການປະຕິບັດ\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"ການປະຕິບັດ\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"ລາຍງານ\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"ເຂດການປົກຄອງ\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"ເອກະສານຄັດຕິດ\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"ການປະຕິບັດ\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"ໄອຄັອນ\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"ປະເພດ\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"ພາສາ\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Localization\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"ລາຍການ\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"ປຸ່ມ\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"ວັນທີ:\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Perform Pending Activation/Upgrade\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"ໝາຍເຫດ\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Scheduler\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"ລຳດັບ\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"ລຳດັບ\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"ລ້າງການແປ\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"ສົ່ງການແປອອກ\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"ລ້າງການແປ\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"ລ້າງການແປ\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"User Interface\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"ເບິ່ງ\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"ສະຖານະເບິ່ງແບບຕົ້ນໄມ້\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"ຟິນລ໌\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"ເບິ່ງ\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Show View\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"ສະຖານະເບິ່ງແບບຕົ້ນໄມ້\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"ສະຖານະເບິ່ງແບບຕົ້ນໄມ້\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\n#, fuzzy\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"ວັນທີ:\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"ການປະຕິບັດ\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"ໄຂ\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"ແລ້ວໆ\"\n\n#, fuzzy\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"ໄຂ\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"ຟິນລ໌\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"ລາຍງານ\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"ເບິ່ງ\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"ທົ່ວໄປ\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"ທົ່ວໄປ\"\n\n#, fuzzy\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"ທົ່ວໄປ\"\n\n#, fuzzy\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"ທົ່ວໄປ\"\n\n#, fuzzy\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"ທົ່ວໄປ\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel Upgrade\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Mark for Upgrade\"\n\n#, fuzzy\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"ວັນທີ:\"\n\n#, fuzzy\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"ເວລາ\"\n\n#, fuzzy\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"ຜູ້ໃຊ້\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"ລ້າງການແປ\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Synchronize Translations\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"ຍົກເລີກ\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"ຍົກເລີກ\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"ພິມອອກ\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"ຕົກລົງ\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"ຍົກເລີກ\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"ໃຊ້ຢູ່\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"ຍົກເລີກ\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"ຕົກລົງ\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"ຕົກລົງ\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"ຍົກເລີກ\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"ຍົກເລີກ\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"ຍົກເລີກ\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"ຕົກລົງ\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"ອັດ\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"ຍົກເລີກ\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Exports\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"ຍົກເລີກ\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"ຕົກລົງ\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"ຍົກເລີກ\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"ປັບປຸງ\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"ອັດ\"\n"
  },
  {
    "path": "trytond/ir/locale/lt.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Raktiniai žodžiai\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"Įrašo ID\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"Tipas\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"Naudojimas\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"Domenai\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Rodiniai\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Veiksmas\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"Konteksto vertė\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"Konteksto domenas\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"Konteksto modelis\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"Domeno vertė\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"Domenai\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Raktiniai žodžiai\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"Riba\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"Rikiavimo vertė\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"PySON kontekstas\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"PySON domenas\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"PySON rikiavimo tvarka\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"PySON paieškos kriterijus\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"Įrašo ID\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"Paieškos kriterijus\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"Tipas\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"Naudojimas\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Rodiniai\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Veiksmas\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"Skaičiavimas\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domenas\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Veiksmas\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Peržiūra\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Veiksmas\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"Raktažodis\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Veiksmas\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"Tiesioginis spausdinimas\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"Plėtinys\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"Individualizuota\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Raktiniai žodžiai\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Modulis\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Įrašo pavadinimas\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"Įrašo ID\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"Kelias\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"Turinys\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"Turinys\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"HTML turinys\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"Turinio pavadinimas\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"Vidinis pavadinimas\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"Atskira\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"Šablonų plėtiniai\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Verčiama\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"Tipas\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"Naudojimas\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Veiksmas\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Raktiniai žodžiai\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"Įrašo ID\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"Tipas\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"Veiksmo URL\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"Naudojimas\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Veiksmas\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Raktiniai žodžiai\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"Įrašo ID\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"Tipas\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"Naudojimas\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"Langas\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"Vediklio pavadinimas\"\n\n#, fuzzy\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Resursas\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Duomenys\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"Duomenų dydis\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Aprašymas\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"Failo ID\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Paskutinis taisymas\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Paskutinis naudotojas\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"Nuoroda\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"Resursas\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"Santrauka\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"Tipas\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"Podėlis\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Resursas\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Resursas\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Paskutinis taisymas\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Paskutinis naudotojas\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"Resursas\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"Laiko žyma\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Santrumpa\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"Indeksas\"\n\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Santrumpa\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"Indeksas\"\n\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"Kompiuterio vardas\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"kalba\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"Diena\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"Valanda\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"Vidinis numeris\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"Intervalo tipas\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"Metodas\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"Minutė\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"Kitas įvykis\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"Laikas\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"Savaitės diena\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"Resursas\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"Naudotojas\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"El. paštas\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Modelio pavadinimas\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Ataskaitos\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Ataskaitos\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"Šablonų plėtiniai\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Aprašymas\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"Žinutė\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"Sukūręs naudotojas\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Būsena\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"Santrauka\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Laukai\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"Resursas\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Eksportas\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"AM\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"Kodas\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Dešimtainis skirtukas\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"Kryptis\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Grupavimas\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Dešimtainis skirtukas\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Grupavimas\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Tūkstančių skirtukas\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"Neigiamas ženklas prieš valiutos simbolį\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"Neigiamas ženklas atskirtas tarpu\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"Neigiamo ženklo pozicija\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"Neigiamas ženklas\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"Teigiamas ženklas prieš valiutos simbolį\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"Teigimas ženklas atskirtas tarpu\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"Teigiamo ženklo pozicija\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"Motininis kodas\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"PM\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"Teigiamas ženklas\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Tūkstančių skirtukas\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Verčiamas\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Kalbos\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"Tekstas\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Laukai\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"Globali paieška\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"Informacija\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"Modelio pavadinimas\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Modulis\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"Modelio aprašymas\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Aprašymas\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Groupė\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Teisė sukurti\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Teisė trinti\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Teisė skaityti\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Teisė įrašyti\"\n\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Spustelėjimai\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"Patvirtinimas\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"Pagalba\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"Atstatyti\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"Atstatęs naudotojas\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"Taisyklės\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"Etiketė\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Mygtukas\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Mygtukas\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"Įrašo ID\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Mygtukas\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"Sąlyga\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Aprašymas\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"Naudotojų kiekis\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"Resurso ID\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"Identifikatorius failų sistemoje\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"Failų sistemos vertės\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Modulis\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"Nėra atnaujinimų\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Nesinchronizuota\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"Vertės\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Teisė skaityti\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"Lauko aprašymas\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"Pagalba\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Modulis\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"Modelio ryšys\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"Lauko tipas\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Aprašymas\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Laukas\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Groupė\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Teisė sukurti\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Teisė trinti\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Teisė skaityti\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Teisė įrašyti\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Filtras\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"Lygis\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"Dukteriniai\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"Priklausomybės\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"Motininiai\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"Būsena\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"Versija\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"Atnaujinami moduliai\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Moduliai\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Veiksmas\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"Būsena\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"Procentas\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Modulis\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"Būsena\"\n\n#, fuzzy\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Resursas\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Paskutinis taisymas\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Paskutinis naudotojas\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"Žinutė\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"Žinutė\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"Resursas\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"Neskaityta\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Pastaba\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"Naudotojas\"\n\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Duomenys\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domenas\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Groupė\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"Numatytoji\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"Globali\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Teisė sukurti\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Teisė trinti\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Teisė skaityti\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Teisė įrašyti\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"Testai\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Paskutinė laiko žyma\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Numeruotės pavadinimas\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Didėjimo žingsnis\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Kitas numeris\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Kitas numeris\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Bendras skilčių skaičius\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Priešdėlis\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Numeruočių tipai\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Galūnė\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Laiko žymos postūmis\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Laiko žymos apvalinimas\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Paskutinė laiko žyma\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Numeruotės pavadinimas\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Didėjimo žingsnis\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Kitas numeris\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Kitas numeris\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Bendras skilčių skaičius\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Priešdėlis\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Numeruočių tipai\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Galūnė\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Laiko žymos postūmis\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Laiko žymos apvalinimas\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"Tipas\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Numeruotės pavadinimas\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"Raktas\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Duomenys\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"Netikslus\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Kalba\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Modulis\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"Lauko pavadinimas\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"Perrašantis modulis\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"Resurso ID\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"Šaltinis\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"Tipas\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"Vertimas\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"Failas\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"Failas\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Kalba\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Modulis\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Kalba\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Modulis\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Kalba\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Veiksmas\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"Sąlyga\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"Ribojantis skaičius\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"Minimalus užlaikymas\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"Sukuriant\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"Ištrinant\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"Atėjus laikui\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"Įrašant\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"Įrašo ID\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Trigeris\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Modulis\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"Kelias prie SVG\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Veiksmas\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"Veiksmo raktažodžiai\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"Dukteriniai\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"Pilnas pavadinimas\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"Adresynas\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Meniu\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"Motininis meniu\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Meniu\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"Naudotojas\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"Rodinio architektūra\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Duomenys\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domenas\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"Dukterinis laukas\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"Paveldėtas rodinys\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Modulis\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"Prioritetas\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"Rodinio tipas\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domenas\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"Naudotojas\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Laukas\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Naudotojas\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"Vertės\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"Peržiūra\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domenas\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"Išplėstiniai mazgai\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"Pasirinkti mazgai\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"Naudotojas\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Laukas\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"Naudotojas\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"Plotis\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"PYSON domenas\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Veiksmas\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Lango veiksmai\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Veiksmai\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Ataskaitos\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URL\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Vedikliai\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Priedai\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Veiksmai\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"El. paštas\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"El. paštas\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Eksportai\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Ikonos\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Derinti modulius\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Kalbos\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Meniu\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Meniu\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"Žinutė\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Spustelėjimai\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Mygtukai\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Duomenys\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Laukai\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Modeliai\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Aktyvuoti/Atnaujinti pažymėtus modulius\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Derinti modulius\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Modulių derinimas\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Moduliai\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Pastabos\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Įrašo taisyklės\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Numeruotės\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"Tipas\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Ištrinti vertimus\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Eksportuoti vertimus\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Vertimai\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Vertimai\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Pritaikyti vertimus\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Sinchronizuoti vertimus\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Trigeriai\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Rodiniai\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"Rodinio paieška\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Rodyti rodinį\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"Hierarchinio sąrašo rodinio būsena\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Hierarchinio sąrašo būsena\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"Hierarchinio sąrašo rodinio plotis\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Grafikas\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Grafikas\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Darbo eigos grafikas\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Vertimai\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Visi\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"Atviras\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Visi\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Nesinchronizoti\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Vietiniai\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Moduliai\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"Veiksmo raktažodis\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"Veiksmo ataskaita\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"Veiksmo URL\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"Veiksmo vediklis\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Priedai\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"Podėlis\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"Pen\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"Pir\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"Šeš\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"Sek\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"Ket\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"Ant\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"Tre\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"Diena\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"Pentadienis\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"Pirmadienis\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"Šeštadienis\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"Sekmadienis\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"Ketvirtadienis\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"Antradienis\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"Trečiadienis\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"Bal\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"Rugp\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"Gruo\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"Vas\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"Sau\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"Lie\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"Bir\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"Kov\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"Geg\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"Lap\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"Spa\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"Rugs\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"Mėnuo\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"Balandis\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"Rugpjūtis\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"Gruodis\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"Vasaris\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"Sausis\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"Liepa\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"Birželis\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"Kovas\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"Gegužė\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"Lapkritis\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"Spalis\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"Rugsėjis\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"Derinimas\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"Planuotojas\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\n#, fuzzy\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"El. paštas\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Eksportas\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"Eksporto eilutė\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Kalba\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Bulgarų\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Katalonų\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Čekų\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"Vokiečių\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"Anglų\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Ispanų\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Ispanų (Lotynų Amerika)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"Estų\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"Persų\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"Suomių\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"Prancūzų\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Vengrų\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italų\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Lao\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Lietuvių\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Olandų\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Lenkų\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"Portugalų\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"Estų\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Rusų\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Slovėnų\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"Turkų\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Kiniečių supaprastinta\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Derinti modulius\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"Žinutė\"\n\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Veiksni\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Priedai\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"Sukūrimo data\"\n\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"Sukūręs naudotojas\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"Lap\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"Domenai\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"Pagalba\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Parinktis\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"JSON parinktis\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Parinktis\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"Skaičius\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Parinktis\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"JSON parinktis\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"Išrikiuota parinktis\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"Tekstas\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"Tipas\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" exceeds the \"\n\"digits limit of \\\"%(digits)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"The value of the field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not valid according\"\n\" to its domain.\"\n\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"Taisymo data\"\n\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"Taisęs naudotojas\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"ID turi būti teigiamas.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"Numatytoji kalba turi būti verčiama.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"Numatytoji kalba turi būti verčiama.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"Numatytosios kalbos negalima ištrinti.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Pastabos\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Įrašo pavadinimas\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Syntax error for reference %r in %s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Relation not found: %r in %s\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not in \"\n\"the selection.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Numeruotė\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"Trūksta numeruotės.\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"mėn.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"m.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"d.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"val.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"min.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"sek.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"sav.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Too many relations found: %r in %s\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"Jums nėra leista taisyti šį įrašą.\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Models Access\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"Modelio mygtukas\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Vienkartinis vykdymas\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"Atviras\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Teisė skaityti\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Išvalyti vertimą\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Išvalyti vertimą\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Sinchronizuoti\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Pažymėti įjungimui\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Nutraukti įjungimą\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Pažymėti išjungimui (beta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Nutraukti išjungimą\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Pažymėti atnaujinimui\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Nutraukti atnaujinimą\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Rodyti\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"Modelio mygtuko atkūrimas\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"Modelio mygtuko paspaudimas\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"Modelio mygtuko taisyklė\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"Modelio duomenys\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"Modelio laukas\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"Spausdinti modelio grafiką\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Modulis\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"Modulio įjungimas ir atnaujinimas atliktas\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"Pradėti modulio įjungimą ir atnaujinimą\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Derinti modulius\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"Modulio derinimo vediklis baigtas\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"Modulio derinimo vediklio pradžia\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"Modulio priklausomybės\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Pastaba\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"Perskaityta pastaba\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"Eilė\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"Taisyklė\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"Taisyklių grupė\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Numeruotė\"\n\n#, fuzzy\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Sequences Strict\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Numeruotės tipas\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"Sesija\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"Sesijos vediklis\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Vertimas\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Išvalyti vertimą\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Išvalyti vertimą\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Eksportuoti vertimą\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Eksportuoti vertimą\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Pritaikyti vertimą\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Pritaikyti vertimą\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"Atnaujinti vertimą\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Trigeris\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"Trigerio žurnalas\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"Naudotojo sąsajos meniu\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Veiksmai\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Veiksmai\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Lango veiksmai\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Ataskaitos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URL\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Vedikliai\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Valdymas\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Priedai\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Veiksmai\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"El. paštas\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Eksportai\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Ikonos\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"Tipas\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Kalbos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Lokalizavimas\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Meniu\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"Žinutė\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Modelių prieigos teisės\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Mygtukai\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Duomenys\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Modeliai\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Modeliai\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Aktyvuoti/Atnaujinti pažymėtus modulius\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Moduliai\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Moduliai\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Pastabos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Įrašo taisyklės\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Planuotojas\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Numeruotės\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Ištrinti vertimus\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Eksportuoti vertimus\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Vertimai\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Pritaikyti vertimus\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Sinchronizuoti vertimus\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Trigeriai\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"Naudotojo sąsaja\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Rodiniai\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"Rodinio paieška\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"Hierarchinio sąrašo rodinio būsena\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Hierarchinio sąrašo būsena\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"Hierarchinio sąrašo rodinio plotis\"\n\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Laukai\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Peržiūra\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Rodyti peržiūrą\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"Rodinio paieška\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"Hierarchinio sąrašo rodinio būsena\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"Hierarchinio sąrašo rodinio būsena\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"Hierarchinio sąrašo rodinio plotis\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Pasirinkti mazgai\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Pasirinkti mazgai\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"Veiksmo forma\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"Atverti grafiką\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"Atverti hierarchinį sąrašą\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"Spausdinti formą\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Pasirinkti mazgai\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Pasirinkti mazgai\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Pasirinkti mazgai\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Duomenys\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"Nuoroda\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"Dienos\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"Valandos\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"Minutės\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"Mėnesiai\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"Savaitės\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"Vertimai sėkmingai ištrinti!\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Veiksmas\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"Atviras\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"Iš kairės į dešinę\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"Iš dešinės į kairę\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"Veiksnus\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Neveiksnus\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"Aktyvuojamas\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"Pašalinamas\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Atnaujinamas\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"Atlikta\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"Atviras\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"Veiksnus\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Neveiksnus\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"Aktyvuojamas\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"Pašalinamas\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Atnaujinamas\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"Nežinoma\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Dešimtainė laiko žymė\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Šešioliktainė laiko žyma\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"Didėjanti\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Dešimtainė laiko žymė\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Šešioliktainė laiko žyma\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"Didėjanti\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Laukas\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"Pagalba\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Modelis\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Ataskaitos\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"Parinktis\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Peržiūra\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"Vediklio mygtukas\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"Pultas\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"Kalendorius\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"Forma\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Grafikas\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"Sąrašo forma\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"Hierarchinis sąrašas\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"Pagrindinis\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"Keisti\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"Pagrindinis\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"Pagrindinis\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"Pagrindinis\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"Pagrindinis\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"Paskutinio keitimo laikas\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"Kiekvienas\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"Kitas įvykis\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"Kitas įvykis\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Vienkartinis vykdymas\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"Datos formatas\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"Valiutos formatas\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"Skaičių formatas\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Nutraukti įjungimą\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Nutraukti išjungimą\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Nutraukti atnaujinimą\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Pažymėti įjungimui\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Pažymėti išjungimui (beta)\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Pažymėti atnaujinimui\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"Laikas\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"Naudotojas\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"Diena:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"Didėjanti\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"Mėnuo:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"Laiko žyma\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"Metai:\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"Ištrinti vertimus?\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Sinchronizuoti vertimus?\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Atsisakyti\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Atsisakyti\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"Spausdinti\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"Gerai\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Atsisakyti\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"Atnaujinti\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Veiksnus\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Atsisakyti\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"Gerai\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"Gerai\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"Atsisakyti\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"Kitas\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"Atsisakyti\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"Ištrinti\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Atsisakyti\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"Gerai\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"Užverti\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Atsisakyti\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Eksportuoti\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Atsisakyti\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"Pritaikyti\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"Gerai\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Atsisakyti\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"Atnaujinti\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"Užverti\"\n"
  },
  {
    "path": "trytond/ir/locale/nl.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Pictogram\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Trefwoorden\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"Records\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"Gebruik\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"Domeinen\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Weergaves\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Actie\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"Context waarde\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"Context domein\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"Context model\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"Domein waarde\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"Domeinen\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Pictogram\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Trefwoorden\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"Limiet\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"Volgorde waarde\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"PySON context\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"PySON domein\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"PySON volgorde\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"PySON zoekargument\"\n\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"Records\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"Zoekargumenten\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"Gebruik\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Weergaves\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Actie\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"Tellen\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domein\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Actie\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Weergave\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Actie\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"Trefwoord\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Actie\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"Direct afdrukken\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"Extensie\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Pictogram\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"Is gepersonaliseerd\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Trefwoorden\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Recordnaam\"\n\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"Records\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"Pad\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"Inhoud\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"Inhoud\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"HTML inhoud\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"Inhoud naam\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"Interne naam\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"Uniek\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"Template extensie\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Vertaalbaar\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"Gebruik\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Actie\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Pictogram\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Trefwoorden\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"Records\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"Actie URL\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"Gebruik\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Actie\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Pictogram\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Trefwoorden\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"Records\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"Gebruik\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"Venster\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"Assistent naam\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Kopieer naar bronnen\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Kopieer naar zichtbare bronnen\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Gegevens\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"Gegevensgrootte\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Omschrijving\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"Bestands-ID\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Laatste wijziging\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Laatste gebruiker\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"Koppeling\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"Bron\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"Samenvatting\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Kopieer naar bronnen\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Kopieer naar zichtbare bronnen\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"Afbeelding\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"Afbeeldings-ID\"\n\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Laatste wijziging\"\n\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Laatste gebruiker\"\n\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"Bron\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"UUID\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"Afbeelding\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"Afbeeldings-ID\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"Grootte\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"Tijdmarkering\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Afkorting\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"Inhoudsopgave\"\n\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Afkorting\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"Inhoudsopgave\"\n\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"Hostnaam\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"taal\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"Dag\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"Uur\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"Interval nummer\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"Interval Type\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"Methode\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"Minuut\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"Volgende oproep\"\n\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"Tijdzone\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"Dag van de week\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"Adressen\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"Om\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"Bericht\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"Ontvangers\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Verborgen ontvangers\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Secundaire ontvangers\"\n\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"Bron\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"Onderwerp\"\n\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"Gebruiker\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"Adres\"\n\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"E-mail\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"Bericht\"\n\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Naam model\"\n\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"Ontvangers\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Verborgen ontvangers\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Verborgen ontvangers\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"Ontvangers\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Secundaire ontvangers\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Secundaire ontvangers\"\n\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Rapporten\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"Onderwerp\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Rapport\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"Template\"\n\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Omschrijving\"\n\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"Bericht\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"Oorsprong\"\n\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"Uitgevoerd door\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"Opgelost door\"\n\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Status\"\n\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"Samenvatting\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Velden\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"Kop\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"Bron\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Exporteren\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"VM\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"Code\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Datum\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Decimaalteken\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"Richting\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Groeperen\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Decimaalteken\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Groeperen\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Duizendtal teken\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"Negatief valutasymbool vooraf\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"Negatief, gescheiden door de spatie\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"Positie van het minteken\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"Minteken\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"Voorafgaand positief valuta symbool\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"Positieve waarde gescheiden door spaties\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"Positie positief teken\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"Bovenliggende code\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"Configuratie voor PostgreSQL-tekst zoeken\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"NM\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"Positief teken\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Duizendtal teken\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Vertaalbaar\"\n\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Talen\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"Tekst\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Velden\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"Algemeen zoeken\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"Informatie\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"Naam model\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"Model omschrijving\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Omschrijving\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Groep\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Toegang aanmaken\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Toegang verwijderen\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Toegang lezen\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Toegang schrijven\"\n\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Aantal klikken\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"Bevestigen\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"Help\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"Resetten\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"Gereset door\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"Regel\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"Label\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Knop\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"Knop regels\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Knop\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"Item ID\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Knoppen\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"Voorwaarde\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Omschrijving\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"Aantal gebruikers\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"Bron ID\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"Kenmerk voor bestandssysteem\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"Waarden op bestandssysteem\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"Niet bijwerken\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Niet gesynchroniseerd\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"Waarden\"\n\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Toegang\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"Veld omschrijving\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"Help\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"Model relatie\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"Veld type\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Omschrijving\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Veld\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Groep\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Toegang aanmaken\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Toegang verwijderen\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Toegang lezen\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Toegang schrijven\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Filter\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"Niveau\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"Onderliggend\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"Afhankelijkheden\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"Bovenliggend\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"Status\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"Versie\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"Modules om bij te werken\"\n\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Actie\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"Status\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"Percentage\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"Status\"\n\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Kopieer naar bronnen\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Kopieer naar zichtbare bronnen\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Laatste wijziging\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Laatste gebruiker\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"Bericht\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"Bericht\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"Bron\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"Ongelezen\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Notitie\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"Gebruiker\"\n\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Gegevens\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"Verwijderd uit de wachtrij op\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"Toegevoegd aan de wachtrij op\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"Verwacht op\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"Afgerond om\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"Gepland op\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domein\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Groep\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"Standaard\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"Algmeen\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Toegang aanmaken\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Toegang verwijderen\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Toegang lezen\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Toegang schrijven\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"Testen\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Laatste tijdmarkering\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Reeks naam\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Oplopende stap\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Volgende nummer\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Volgende nummer\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Voorloopnullen\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Voorvoegsel\"\n\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Reeks type\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Achtervoegsel\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Tijdmarkering verschuiving\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Tijdmarkering afronding\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Laatste tijdmarkering\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Reeks naam\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Oplopende stap\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Volgende nummer\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Volgende nummer\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Voorloopnullen\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Voorvoegsel\"\n\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Reeks type\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Achtervoegsel\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Tijdmarkering verschuiving\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Tijdmarkering afronding\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Reeks naam\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"Sleutel\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Gegevens\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"Onzeker\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Taal\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"Veldnaam\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"Module overschrijven\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"Bron ID\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"Bron\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"Vertaling waarde\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"Bestand\"\n\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"Bestandsnaam\"\n\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Taal\"\n\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Taal\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Taal\"\n\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Actie\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"Voorwaarde\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"Limiet nummer\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"Minimale vertraging\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"Bij aanmaken\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"Bij verwijderen\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"Op tijd\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"Bij schrijven\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"Item ID\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Trigger\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Pictogram\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"SVG pad\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Actie\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"Actietrefwoorden\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"Onderliggend\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"Volledige naam\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"Favoriet\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Pictogram\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"Bovenliggend menu\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"Gebruiker\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"Architectuur weergave\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Gegevens\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domein\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"Onderliggende velden\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"Overgenomen weergave\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"Prioriteit\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"Weergave type\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domein\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"Gebruiker\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Veld\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Gebruiker\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"Waarde\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"Weergave ID\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"Naam onderliggend\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domein\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"Uitgebreide knopen\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"Geselecteerde Knopen\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"Gebruiker\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Veld\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"Gebruiker\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"Breedte\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"De records waarop de actie wordt uitgevoerd.\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"Een deel van het domein dat bij elke verversing wordt geëvalueerd.\"\n\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"Standaard limiet voor lijstweergave.\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"De records waarop de actie wordt uitgevoerd.\"\n\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"Standaard zoekcriteria voor de lijstweergave.\"\n\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\"Laat leeg voor hetzelfde als template, zie LibreOffice documentatie voor \"\n\"ondersteunend formaat.\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\"Een Genshi-expressie om de naam te berekenen met 'record'.\\n\"\n\"Laat leeg voor de standaard naam.\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"De records waarop de actie wordt uitgevoerd.\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"Controleer of de template slechts voor één record werkt.\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"\"\n\"Verwijder het vinkje om vertalingen voor dit rapport uit te schakelen.\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"De records waarop de actie wordt uitgevoerd.\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"De records waarop de actie wordt uitgevoerd.\"\n\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"Start assistent in nieuw venster.\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"Het veld dat de ontvanger(s) bevat.\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"Het veld dat de verborgen ontvanger(s) bevat.\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Een PYSON-expressie die een lijst met verborgen ontvangers genereert met het\"\n\" record vertegenwoordigd door \\\"self\\\".\"\n\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Een PYSON-expressie die een lijst met ontvangers genereert met het record \"\n\"vertegenwoordigd door \\\"self\\\".\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"Het veld dat de secundaire ontvanger(s) bevat.\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Een PYSON-expressie die een lijst met secundaire ontvangers genereert met \"\n\"het record vertegenwoordigd door \\\"self\\\".\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"Vink aan om de veldnamen mee te nemen in de export.\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"RFC 4646-tag.\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"Code van de uitzonderlijke ouder\"\n\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"Module waarin dit model is gedefinieerd.\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\"Tekst om bevestiging van de gebruiker te vragen wanneer er op de knop wordt \"\n\"geklikt.\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"Knop die de regels opnieuw instellen.\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\"Een PYSON-instructie geëvalueerd met record vertegenwoordigd door \\\"self\\\"\\n\"\n\"Het activeert de actie als het waar is.\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"Het ID van het item in de database.\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"Het ID van het item zoals bekend in het bestandssysteem.\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\"Indien aangevinkt, wordt het toegangsrecht op het model van het veld ook \"\n\"getoetst aan de relatie van het veld.\"\n\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"Module waarin dit veld is gedefinieerd.\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\"Als u een Python Regular Expression invoert, wordende overeenkomstige \"\n\"modellen uitgesloten van de grafiek.\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"Wanneer de taak gereed moet zijn.\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"Wanneer de taak mag beginnen.\"\n\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\"Domein wordt geëvalueerd met een PYSON-context die het volgende bevat:\\n\"\n\"- \\\"user\\\" als de huidige gebruiker\\n\"\n\"- \\\"groups\\\" als lijst met ids van de huidige gebruiker\"\n\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"Voeg deze regel standaard toe bij alle gebruikers.\"\n\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\"Maak de regel globaal\\n\"\n\"dus elke gebruiker moet deze regel volgen.\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\"Weergegeven aan gebruikers wanneer toegangsfout is opgetreden voor deze \"\n\"regel.\"\n\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"De regel is waar als tenminste aan één voorwaarde wordt voldaan.\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\"Een PYSON-instructie geëvalueerd met record vertegenwoordigd door \\\"self\\\"\\n\"\n\"Het activeert de actie als het waar is.\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\"Limiteer het aantal aanroepen van \\\"Uitvoerende functie\\\" door items.\\n\"\n\"Gebruik 0 voor geen limiet.\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\"Stel een minimale tijdsvertraging in voor de \\\"Action Function\\\" voor hetzelfde record.\\n\"\n\"zonder vertraging leeg.\"\n\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"Het PYSON-domein.\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Actie\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Vensteracties\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Acties\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Rapporten\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Assistenten\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Bijlagen\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Configureer Assistent items\"\n\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Acties\"\n\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"E-mails\"\n\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"E-mailarchief\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"E-mail templates\"\n\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"Fouten\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Geëxporteerd\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Pictogrammen\"\n\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Talen configureren\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Talen\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"Bericht\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Toegang modellen\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Toegang\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Aantal klikken\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Knoppen\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Gegevens\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Toegang veld\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Toegang\"\n\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Velden\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Modellen\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Voer installatie / bijwerken uit\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Modules configureren\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Module configuratie\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notities\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record regels\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Reeksen\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Strikte reeksen\"\n\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"Types\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Vertalingen opschonen\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Exporteer vertalingen\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Vertalingen\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Vertalingen\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Vertalingen bijwerken\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchroniseer vertalingen\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Weergaves\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"Zoek weergave\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Toon weergave\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"Optionele boomstructuur weergave\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Status boom\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"Kolombreedte boomweergave\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Grafiek\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Grafiek\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Workflow diagram\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Vertalingen\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"Actie uitvoerend scherm\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"Actie uitvoerend scherm domein\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Alle\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"Open\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"Uitvoering\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Alle\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Niet gesynchroniseerd\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Lokaal\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"Actie uitvoerend scherm weergave\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"Actietrefwoord\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"Actie rapport\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"Actie URL\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"Actie assistent\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Bijlage\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"Avatar-cache\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"Vr\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"Ma\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"Za\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"Zo\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"Do\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"Di\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"Wo\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"Dag\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"Vrijdag\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"Maandag\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"Zaterdag\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"Zondag\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"Donderdag\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"Dinsdag\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"Woensdag\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"Apr\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"Aug\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"Dec\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"Feb\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"Jan\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"Jul\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"Jun\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"Mrt\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"Mei\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"Nov\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"Okt\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"Sept\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"Maand\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"April\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"Augustus\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"December\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"Februari\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"Januari\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"Juli\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"Juni\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"Maart\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"Mei\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"November\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"Oktober\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"September\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"Configuratie\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"Cyclische opdracht\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Datum\"\n\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"E-mailadres\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"Email template\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"E-mail template - Rapport\"\n\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"Fout\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Exporteren\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"Exporteer regel\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Taal\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Bulgaars\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Catalaans\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Tsjechisch\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"Duits\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"Engels\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Spaans\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Spanish (Latin American)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"Ests\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"Perzisch\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"Fins\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"Frans\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Hongaars\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"Indonesisch\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italiaans\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Lao\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Litouws\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Nederlands\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Pools\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"Portugees\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"Roemeens\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Russisch\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Sloveens\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"Turks\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Chinees Simplified\"\n\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Talen configureren\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"Bericht\"\n\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"De knop \\\"%(button)s op\\\"%(model)s \\\" aanroepen is niet toegestaan.\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"U hebt geen toegang tot \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"U hebt geen toegang tot \\\" \\\"%(model)s.%(field)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"U hebt niet de rechten om wizard \\\"%(wizard)s\\\" uit te voeren.\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"U hebt niet de rechten om wizard \\\"%(wizard)s\\\" op \\\"%(model)s\\\"uit te \"\n\"voeren.\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Ongeldige context \\\"%(context)s\\\" voor actie \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Ongeldig domein of zoekcriteria \\\"%(domain)s\\\" voor actie \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Ongeldige weergave\\\"%(view)s\\\" voor actie \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"Verkeerd wizardmodel in trefwoordactie \\\"%(name)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Actief\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"Verwijder het vinkje om toekomstig gebruik te voorkomen.\"\n\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Bijlagen\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"Avatar\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"Er is slechts één avatar toegestaan per bron.\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"De grootte van een avatar moet uniek zijn.\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"Avatar-URL\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"Avatars\"\n\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"Deze record maakt deel uit van de basisconfiguratie.\"\n\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"De naam van de knop moet uniek zijn per model.\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"U mag geen records van \\\"%(model)s\\\" aanmaken omdat ze ten minste één van deze regels niet naleven:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"Aangemaakt op\"\n\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"Aangemaakt door\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Het is niet toegestaan records \\\"%(ids)s\\\" van \\\"%(model)s\\\" te verwijderen vanwege ten minste één van deze regels:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"U mag dit record niet verwijderen.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"Nee\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"Boolean\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"Karakters\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Datum\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"Datum en tijd\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"Decimalen\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"Domein\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"Float\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"Help\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Help-selectie\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\"Een combinatie van sleutel en helptekst gescheiden door \\\":\\\", één per \"\n\"regel.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Help Selectie JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"Geheel getal\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"Ongeldig domein in schema \\\"%(schema)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Ongeldige hulpselectie in schema \\\"%(schema)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Ongeldige selectie in schema \\\"%(schema)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Meervoudige Selectie\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"Numeriek\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Selectie\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"Een paar van sleutel en label gescheiden door \\\":\\\" per regel.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"Selectie JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"Selectie gesorteerd\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"Als de selectie op label moet worden gesorteerd.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"Tekstregel\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"Type\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"Ja\"\n\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"Het aantal decimalen in de waarde \\\"%(value)s\\\" voor het veld \\\"%(field)s\\\" \"\n\"in \\\"%(record)s\\\" van \\\"%(model)s\\\" overschrijdt de limiet van \"\n\"\\\"%(digits)i\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"De waarde \\\"%(value)s\\\" voor veld \\\"%(field)s\\\" in \\\"%(record)s\\\" van \"\n\"\\\"%(model)s\\\" valt niet binnen het geldige waardebereik.\"\n\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"Bewerkt op\"\n\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"Bewerk door\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Ongeldige tekst in e-mail template \\\"%(template)s\\\" met uitzondering \"\n\"\\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Ongeldig PYSON %(field)s in e-mail template \\\"%(template)s\\\" met \"\n\"uitzondering \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\"Het PYSON %(field)s in e-mailsjabloon \\\"%(template)s\\\" moet een lijst \"\n\"genereren.\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Ongeldige onderwerp in e-mail template \\\"%(template)s\\\" met uitzondering \"\n\"\\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"%(field)s (model naam)\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"%(field)s (tekst)\"\n\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"De waarde \\\"%(value)s\\\" voor veld \\\"%(field)s\\\" in \\\"%(record)s\\\" van \"\n\"\\\"%(model)s\\\" bevat ongeldige tekens \\\"%(chars)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"De records konden niet worden verwijderd omdat ze worden gebruikt door veld \"\n\"\\\"%(field)s\\\" van %(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"De waarde \\\"%(value)s\\\" voor veld \\\"%(field)s\\\" in \\\"%(model)s\\\" bestaat niet.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"Opslaan mislukt. Probeer het opnieuw.\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"ID moet positief zijn.\"\n\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"De code voor taal moet uniek zijn.\"\n\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"De standaardtaal \\\"%(language)s\\\"moet vertaalbaar zijn.\"\n\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"De standaardtaal\\\"%(language)s\\\" kan niet verwijderd worden.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Ongeldig datum formaat \\\"%(format)s\\\" voor taal \\\"%(language)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Ongeldige groepering \\\"%(grouping)s\\\" voor taal \\\"%(language)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\"De voorwaarde \\\"%(condition)s\\\" is geen geldige PYSON-expressie voor \"\n\"knopregel \\\"%(rule)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\"Sommige geactiveerde modules zijn afhankelijk van degene die u probeert te \"\n\"deactiveren:\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"\"\n\"U kunt een module niet verwijderen die geactiveerd is of op het punt staat \"\n\"geactiveerd te worden.\"\n\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Notities\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\"U probeert records \\\"%(ids)s\\\"van \\\"%(model)s\\\" te lezen die niet meer \"\n\"bestaan.\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Het is niet toegestaan om deze velden \\\"%(ids)s\\\" van \\\"%(model)s\\\" te lezen vanwege ten minste één van deze regels:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Recordnaam\"\n\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Recursiefout: record \\\"%(rec_name)s\\\" met bovenliggend record \"\n\"\\\"%(parent_rec_name)s\\\" is gedefinieerd als zijn eigen voorganger.\"\n\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Syntaxfout voor referentie: \\\"%(value)r\\\" van \\\"%(field)s\\\" in model \"\n\"\\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Relatie niet gevonden: \\\"%(value)r\\\" in \\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"Ongeldige e-maildefinitie voor rapport \\\"%(name)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Ongeldige recordnaamdefinitie voor rapport \\\"%(report)s\\\" met uitzondering \"\n\"\\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Een waarde is vereist voor veld \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Een waarde is vereist voor veld \\\"%(field)s\\\" in \\\"%(record)s\\\" van \"\n\"\\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"De bronnen waarnaar dit record moet worden gekopieerd.\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"Ongeldig domein in regel \\\"%(name)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Zoekfunctie ontbreekt voor veld \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"De waarde \\\"%(value)s\\\" voor het veld \\\"%(field)s\\\" in \\\"%(record)s\\\" van \"\n\"\\\"%(model)s\\\" is geen van de toegestane opties.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Reeks\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\"U kunt het reekstype van een reeks niet wijzigen, maak in de plaats een \"\n\"nieuwe reeks aan.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Ongeldig \\\"Toenamenummer\\\" (%(number_increment)s) of \\\"Volgend nummer\\\" \"\n\"(%(number_next)s) met uitzondering \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Ongeldig voorvoegsel \\\"%(affix) s\\\" voor reeks \\\"%(sequence)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Ongeldig achtervoegsel \\\"%(affix)s\\\" voor reeks \\\"%(sequence)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"\"\n\"De \\\"Laatste tijdstempel\\\" kan niet in de toekomst liggen voor de reeks \"\n\"\\\"%s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"Reeks ontbreekt.\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Definitiefunctie voor het veld \\\"%(field)s\\\" in \\\"%(model)s\\\" ontbreekt.\"\n\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"De waarde voor veld \\\"%(field)s\\\" in \\\"%(model)s\\\" is te lang (%(size)i > \"\n\"%(max_size)i).\"\n\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"De waarde voor veld \\\"%(field)s\\\" in \\\"%(record)s\\\" van \\\"%(model)s\\\" is te \"\n\"lang (%(size)i > %(max_size)i).\"\n\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"De tijd \\\"%(value)s\\\" voor veld \\\"%(field)s\\\" in \\\"%(record)s\\\" van \"\n\"\\\"%(model)s\\\" is niet geldig.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"M\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"Y\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"d\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"u\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"m\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"s\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"w\"\n\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Te veel relaties gevonden: %(value)r\\\" in \\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\"U kunt vertaling \\\"%(name)s\\\" niet exporteren omdat deze overschreven wordt \"\n\"door module %(value)r\\\" in \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\"Voorwaarde %(condition)s\\\" is geen geldige PYSON-expressie voor trigger \"\n\"\\\"%(trigger)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Syntaxfout voor waarde: \\\"%(value)r\\\" in \\\"%(field)s\\\" van \\\"%(model)s\\\" \"\n\"(%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"Ongeldige XML voor weergave \\\"%(name)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"Ongeldig domein of zoekcriteria \\\"%(domain)s\\\" voor zoekactie \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\"U probeert te schrijven in het record \\\"%(ids)s\\\" van\\\"%(model)s dat niet \"\n\"meer bestaat.\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Het is niet toegestaan om te schrijven in de records \\\"%(ids)s\\\" van \\\"%(model)s\\\"vanwege ten minste één van deze regels:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"U hebt niet de nodige bevoegdheid om dit record te wijzigen.\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Syntaxfout voor XML-id: \\\"%(value)r\\\" in \\\"%(field)s\\\" van \\\"%(model)s\\\" \"\n\"(%(column)s).\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Toegang tot model\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"Weet u zeker dat u de talen / vertalingen wilt laden?\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"Weet u zeker dat u de talen / vertalingen wilt verwijderen?\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"Model knop\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Een keer uitvoeren\"\n\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"Open\"\n\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Uitvoeren\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"Oplossen\"\n\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Laad vertalingen\"\n\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Maak vertalingen leeg\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Synchroniseren\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Markeren om te activeren\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Annuleer activering\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Markeren om te deactiveren (bèta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Annuleer deactivering\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Markeren om bij te werken (upgrade)\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Annuleer bijwerken\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Toon\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"Model knop resetten\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"Model knop Klik\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"Model knop regel\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"Model gegevens\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"Model veld\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"Model veld toegang\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"Modelgrafiek afdrukken\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Module\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"Module activeren / bijwerken voltooid\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"Module Activeren/ bijwerken start\"\n\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Modules configureren\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"Module configuratie assistent gereed\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"Module configuratie assistent eerste\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"Configuratie assistent die start na installatie van de module\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"Module configuratie assistent ander\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"Module afhankelijkheid\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Notitie\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"Notitie gelezen\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"Wachtrij\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"Regel\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"Regelgroep\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Reeks\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Strikte reeks\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Reeks type\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"Sessie\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"Sessie assistent\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Vertaling\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Vertaling opschonen\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Vertaling opschonen\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Exporteer vertaling\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Exporteer vertaling\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Vertaling bijwerken\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Vertaling bijwerken\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"Vertaling bijwerken\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Trigger\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"Trigger logboek\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Pictogram\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"Gebruiker menu\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Acties\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Acties\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Vensteracties\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Rapporten\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Assistenten\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Administratie\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Bijlagen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Configureer Assistent items\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Acties\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"E-mails\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"E-mail templates\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"Fouten\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Geëxporteerd\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Pictogrammen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"Types\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Talen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Lokalisatie\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"Bericht\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Toegang modellen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Knoppen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Gegevens\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Toegang veld\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Modellen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Modellen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Voer installatie / bijwerken uit\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notities\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record regels\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Planner\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Reeksen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Strikte reeks\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Reeksen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Vertalingen opschonen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Exporteer vertalingen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Vertalingen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Vertalingen bijwerken\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchroniseer vertalingen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"Gebruikersomgeving\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Weergaves\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"Zoek weergave\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"Optionele boomstructuur weergave\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Status boom\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"Kolombreedte boomweergave\"\n\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Velden\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"Menu favorieten\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Weergave\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Toon weergave\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"Zoek weergave\"\n\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"Optionele boomstructuur weergave\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"Geef boomstructuur weer\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"Kolombreedte boomweergave\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"Vermeld\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Geselecteerd\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"Vermeld\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Geselecteerd\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"Actieformulier\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"Formulier relatie\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"Open grafiek\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"Open boomstructuur\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"Formulier afdrukken\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"Vermeld\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Geselecteerd\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"Vermeld\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Geselecteerd\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"Vermeld\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Geselecteerd\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Gegevens\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"Koppeling\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"Dagen\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"Uren\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"Minuten\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"Maanden\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"Weken\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"Fouten opschonen\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"Taakwachtrij opschonen\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"Start triggers \\\"op tijd\\\"\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Actie\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"Taak\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"Open\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"Uitvoering\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"Opgelost\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"Links naar rechts\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"Rechts naar links\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"Geactiveerd\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Niet geactiveerd\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"Te activeren\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"Te verwijderen\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Bij te werken\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"Gereed\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"Open\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"Geactiveerd\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Niet geactiveerd\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"Te activeren\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"Te verwijderen\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Bij te werken\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"Onbekend\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Tijdmarkering\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Hexadecimale tijdmarkering\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"Oplopend\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Tijdmarkering\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Hexadecimale tijdmarkering\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"Oplopend\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Veld\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"Help\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Rapport\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"Selectie\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Weergave\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"Assistent knop\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"Bord\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"Kalender\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"Formulier\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Grafiek\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"Lijstformulier\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"Boomstructuur\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"Algemeen\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"Bewerk\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"Algemeen\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"Algemeen\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"Algemeen\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"Algemeen\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"Document\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"Laatste wijzigingstijd\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"Om\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"Elke\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"Datum volgende oproep\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"Tijd volgende oproep\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Een keer uitvoeren\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"Verborgen ontvangers:\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"Ontvangers:\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"Secundaire ontvangers:\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"Oorsprong\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"U kunt nu extra vertalingen in het systeem laden.\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"Datum formaat\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"Monetair formaat\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"Getal weergave\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"De modules zijn bijgewerkt / geïnstalleerd.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"Houd er rekening mee dat deze bewerking enkele minuten kan duren.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"Het systeem wordt bijgewerkt.\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"U kunt nu extra modules voor het systeem activeren.\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"De configuratie is voltooid.\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\"Afhankelijk van de modules die u hebt geïnstalleerd, kunt u uw installatie \"\n\"configureren.\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Annuleer activering\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Annuleer deactivering\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Annuleer bijwerken\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Markeren om te activeren\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Markeren om te deactiveren (bèta)\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Markeren om bij te werken (upgrade)\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Datum\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"Tijd\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"Gebruiker\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\"Als er geen test is gedefinieerd is de regel altijd waar mits niet globaal.\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"De regel is waar als tenminste aan één voorwaarde wordt voldaan.\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"${dag}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"${maand}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"${jaar}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"Dag:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"Oplopend\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"Legenda (sjabloon voor voorvoegsel, achtervoegsel)\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"Maand:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"Tijdmarkering\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"Jaar:\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"Vertalingen opschonen?\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"Vertalingen met succes opgeschoond.\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Vertalingen synchroniseren?\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"Vertalingen zijn succesvol ingesteld.\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuleer\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"Laden\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuleer\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"Afdrukken\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuleer\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"Start bijwerken\"\n\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Activeren\"\n\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuleer\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"Ok\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"Ok\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuleer\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"Volgende\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuleer\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"Opruimen\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuleer\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"Ok\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"Sluiten\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuleer\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Exporteren\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuleer\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"Actualiseren\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"Ok\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuleer\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"Bijwerken\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"Sluiten\"\n"
  },
  {
    "path": "trytond/ir/locale/pl.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Słowa kluczowe\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"ID rekordu\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"Użycie\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"Domeny\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Widoki\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Akcja\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"Wartość kontekstu\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"Domena kontekstu\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"Model kontekstu\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"Wartość domeny\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"Domeny\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Słowa kluczowe\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"Limit\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"Wartość porządkowa\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"Kontekst PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"Domena PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"Porządek PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"Kryteria wyszukiwania PySON\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"ID rekordu\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"Kryteria wyszukiwania\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"Użycie\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Widoki\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Akcja\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"Licznik\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domena\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Akcja\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Widok\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Akcja\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"Słowo kluczowe\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Akcja\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"Druk bezpośredni\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"Rozszerzenie\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"Jest typowy\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Słowa kluczowe\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Moduł\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Nazwa rekordu\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"ID rekordu\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"Ścieżka\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"Treść\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"Treść\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"Zawartość HTML\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"Nazwa kontentu\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"Nazwa wewnętrzna\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"Pojedynczy\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"Rozszerzenie szablonu\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Przetłumaczalny\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"Użycie\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Akcja\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Słowa kluczowe\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"ID rekordu\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"Url akcji\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"Użycie\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Akcja\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Słowa kluczowe\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"ID rekordu\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"Użycie\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"Okno\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"Nazwa kreatora\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Skopiuj do zasobów\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Kopiuj do widocznych zasobów\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Dane\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"Rozmiar danych\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Opis\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"ID pliku\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Ostatnia modyfikacja\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Ostatnio używał\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"Odnośnik\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"Zasób\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"Skrót opisu\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"Pamięć podręczna\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Skopiuj do zasobów\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Kopiuj do widocznych zasobów\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Ostatnia modyfikacja\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Ostatnio używał\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"Zasób\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"Znak czasu\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Skrót\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"Indeks\"\n\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Skrót\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"Indeks\"\n\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"Nazwa hosta\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"język\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"Dzień\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"Godzina\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"Interwał\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"Typ interwału\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"Metoda\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"Minuta\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"Kolejne wywołanie\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"Czas\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"Dzień tygodnia\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"Adresy\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"W\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"Treść\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"Odbiorcy\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Ukryci odbiorcy\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Dodatkowi odbiorcy\"\n\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"Zasób\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"Temat\"\n\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"Użytkownik\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"Adres\"\n\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"E-mail\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"Treść\"\n\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Nazwa modelu\"\n\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"Odbiorcy\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Ukryci odbiorcy\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Ukryci odbiorcy\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"Odbiorcy\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Dodatkowi odbiorcy\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Dodatkowi odbiorcy\"\n\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Raporty\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"Temat\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Raport\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"Szablon\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Opis\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"Wiadomość\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"Utworzył\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Stan\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"Skrót opisu\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Pola\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"Zasób\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Wyeksportuj\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"rano\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"Kod\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Separator dziesiętny\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"Kierunek\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Grupowanie\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Separator dziesiętny\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Grupowanie\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Separator tysięcy\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"Symbol waluty przed wartością ujemną\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"Oddzielenie symbolu waluty od wartości ujemnej\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"Pozycja znaku ujemnego\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"Znak ujemny\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"Symbol waluty przed wartością dodatnią\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"Oddzielenie symbolu waluty od wartości dodatniej\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"Pozycja znaku dodatniego\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"Kod elementu nadrzędnego\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"po południu\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"Znak dodatni\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Separator tysięcy\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Przetłumaczalny\"\n\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Języki\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"Tekst\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Pola\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"Globalne przeszukiwanie\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"Informacje\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"Nazwa modelu\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Moduł\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"Opis modelu\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Opis\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Grupa\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Tworzenie\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Usuwanie\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Odczyt\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Zapis\"\n\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Kliknięcia\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"Potwierdź\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"Pomoc\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"Przywróć\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"Przywróć według\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"Reguły\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"Etykieta\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Przyciski\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"Przycisk z regułą\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Przycisk\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"ID rekordu\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Przycisk\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"Warunek\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Opis\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"Liczba użytkownika\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID zasobu\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"Identyfikator w systemie plików\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"Wartości w systemie plików\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Moduł\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"Brak aktualizacji\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Niezsynchronizowany\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"Wartości\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Dostęp\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"Opis pola\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"Pomoc\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Moduł\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"Relacja modelu\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"Typ pola\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Opis\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Pole\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Grupa\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Utworzenie\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Usunięcie\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Odczyt\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Zapis\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Filtr\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"Poziom\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"Elementy podrzędne\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"Zależności\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"Elementy nadrzędne\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"Stan\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"Wersja\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"Moduły przeznaczone do aktualizacji\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Moduły\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Akcja\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"Stan\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"Odsetek\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Moduł\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"Stan\"\n\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Skopiuj do zasobów\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Kopiuj do widocznych zasobów\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Ostatnia modyfikacja\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Ostatnio używał\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"Wiadomość\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"Wiadomość\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"Zasób\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"Nieprzeczytane\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Notatka\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"Użytkownik\"\n\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Dane\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"Usunięto z kolejki o\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"Dodano do kolejki o\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"Oczekiwany o\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"Ukończony o\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"Zaplanowany na\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domena\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Grupa\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"Domyślne\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"Globalne\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Utworzenie\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Usunięcie\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Odczyt\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Zapis\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"Testy\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Ostatni znak czasu\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nazwa sekwencji\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Numer przyrostu\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Kolejny numer\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Kolejny numer\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Dopełnienie numeru\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Prefiks\"\n\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Typ sekwencji\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Sufiks\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Offset znaku czasu\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Zaokrąglenie znaku czasu\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Ostatni znak czasu\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nazwa sekwencji\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Numer przyrostu\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Kolejny numer\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Kolejny numer\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Dopełnienie numeru\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Prefiks\"\n\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Typy sekwencji\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Sufiks\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Offset znaku czasu\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Zaokrąglenie znaku czasu\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nazwa sekwencji\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"Klucz\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Dane\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"Niepewne\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Język\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Moduł\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"Nazwa pola\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"Nadpisany moduł\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID zasobu\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"Źródło\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"Wartość tłumaczenia\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"Plik\"\n\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"Nazwa pliku\"\n\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Język\"\n\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Moduł\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Język\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Moduł\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Język\"\n\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Akcja\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"Warunek\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"Wartość limitu\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"Minimalne opóźnienie\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"Przy utworzeniu\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"Przy usunięciu\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"O czasie\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"Przy zapisie\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"ID rekordu\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Wyzwalacz\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Moduł\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"Ścieżka SVG\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Akcja\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"Słowa kluczowe akcji\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"Elementy podrzędne\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"Pełna nazwa\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"Ulubione\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"Menu nadrzędne\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"Użytkownik\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"Architektura widoku\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Dane\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domena\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"Pole elementów podrzędnych\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"Widok odziedziczony\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Moduł\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"Priorytet\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"Typ widoku\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domena\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"Użytkownik\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Pole\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Użytkownik\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"Wartości\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"Widok\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"Nazwa elementu podrzędnego\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domena\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"Rozszerzone węzły\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"Zaznaczone węzły\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"Użytkownik\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Pole\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"Użytkownik\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"Szerokość\"\n\n#, fuzzy\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Zasoby, do których należy skopiować ten rekord.\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"Część domeny, która będzie ewaluowana przy każdym odświeżeniu.\"\n\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"Domyślny limit dla widoku listy.\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Zasoby, do których należy skopiować ten rekord.\"\n\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"Domyślne kryteria wyszukiwania dla widoku listy.\"\n\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\"Pozostaw puste jako szablon. Sprawdź dokumentację LibreOffice dla właściwego\"\n\" formatu.\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Zasoby, do których należy skopiować ten rekord.\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"Sprawdź, czy szablon pracuje tylko dla jednego rekordu.\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"Odznacz, aby wyłączyć tłumaczenie dla tego raportu.\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Zasoby, do których należy skopiować ten rekord.\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Zasoby, do których należy skopiować ten rekord.\"\n\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"Uruchom kreatora w nowym oknie.\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"Pole zawierające odbiorcę(ów).\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"Pole zawierające dodatkowego odbiorcę(ów).\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Wyrażenie PYSON generujące listę ukrytych odbiorców reprezentujących rekord \"\n\"przez „self”.\"\n\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Wyrażenie PYSON generujące listę odbiorców z rekordem reprezentowanym przez \"\n\"„self”.\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"Pole zawierające dodatkowego odbiorcę(ów).\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Wyrażenie PYSON generujące listę dodatkowych odbiorców z rekordem \"\n\"reprezentowanym przez „self”.\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"Kod elementu nadrzędnego powodującego wyjątek\"\n\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"Moduł, w którym ten model jest zdefiniowany.\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\"Tekst umożliwiający użytkownikowi potwierdzenie po wciśnięciu przycisku.\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"Przycisk resetujący reguły.\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\"Wyrażenie PYSON odnoszące się do rekordu reprezentowanego przez \\\"self\\\"\\n\"\n\"Jeśli wyrażenie jest prawdziwe to prowadzi do uaktywnienia reguły.\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"Identyfikator rekordu w bazie danych.\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"Identyfikator rekordu znany w systemie plików.\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"Moduł, w którym to pole jest zdefiniowane.\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\"Podanie regularnego wyrażenia w Pythonie spowoduje usunięcie pasujących \"\n\"modeli z grafu.\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"Kiedy zadanie powinno zostać ukończone.\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"Kiedy zadanie może zostać rozpoczęte.\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\"Domena jest ewaluowana przez kontekst PYSON zawierający:\\n\"\n\"- \\\"user\\\" jako aktualny użytkownik\"\n\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"Dodaj domyślnie tę regułę do wszystkich użytkowników.\"\n\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\"Określ regułę jako globalną,\\n\"\n\"aby wpływała na każdego użytkownika.\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\"Wyświetlane użytkownikom, gdy dla tej reguły zostanie zgłoszony błąd \"\n\"dostępu.\"\n\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\"Reguła spełnia wymagania jeśli wynik przynajmniej jednego testu jest True.\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\"Wyrażenie PYSON odnoszące się do rekordu reprezentowanego przez \\\"self\\\"\\n\"\n\"Jeśli wyrażenie jest prawdziwe to nastąpi wywołanie akcji.\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\"Limit wywołań \\\"Funkcji akcji\\\" przez rekordy.\\n\"\n\"0 oznacza bez limitu.\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\"Ustaw minimalny czas opóźnienia pomiędzy wywołaniami \\\"Funkcji akcji\\\" dla tego samego rekordu.\\n\"\n\"Puste oznacza brak opóźnień.\"\n\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"Domena PYSON.\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Akcja\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Okno akcji\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Akcje\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Raporty\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"Adresy URL\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Kreatory\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Załączniki\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Elementy kreatora konfiguracji\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Akcje\"\n\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"E-mail\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"Adres e-mail\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"Szablony e-maili\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"Błąd\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Wyeksportowania\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Ikony\"\n\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Skonfiguruj języki\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Języki\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"Wiadomość\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Dostęp do modeli\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Dostęp\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Kliki\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Przyciski\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Dane\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Dostęp do pól\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Dostęp\"\n\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Pola\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Modele\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Wykonaj aktywację/aktualizację\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Skonfiguruj moduły\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Konfiguracja modułu\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Moduły\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notatki\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Reguły rekordu\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sekwencje\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sekwencje ciągłe\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"Typ\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Oczyść tłumaczenia\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Wyeksportuj tłumaczenia\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Tłumaczenia\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Tłumaczenia\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Ustaw tłumaczenia\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronizuj tłumaczenia\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Wyzwalacze\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Widoki\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"Wyszukiwanie widoku\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Pokaż widok\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"Stan drzewa widoku\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Stan drzewa\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"Szerokość drzewa widoku\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Wykres\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Wykres\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Wykres przepływu pracy\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Tłumaczenia\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"Okno działania akcji\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"Domena okna działania akcji\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Wszystko\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"Otwórz\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Wszystko\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Niezsynchronizowany\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Lokalny\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Moduły\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"Widok okna działania akcji\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"Słowo kluczowe akcji\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"Raport akcji\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"Adres URL akcji\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"Kreator akcji\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Załącznik\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"Pamięć podręczna\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"Pią\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"Pon\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"Sob\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"Nie\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"Czw\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"Wto\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"Śro\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"Dzień\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"Piątek\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"Poniedziałek\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"Sobota\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"Niedziela\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"Czwartek\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"Wtorek\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"Środa\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"Kwi\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"Sie\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"Gru\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"Lut\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"Sty\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"Lip\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"Cze\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"Mar\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"Maj\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"Lis\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"Paź\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"Wrz\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"Miesiąc\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"Kwiecień\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"Sierpień\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"Grudzień\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"Luty\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"Styczeń\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"Lipiec\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"Czerwiec\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"Marzec\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"Maj\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"Listopad\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"Październik\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"Wrzesień\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"Konfiguracja\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"Cron\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"Adres e-mail\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"Szablon e-maili\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"Szablon e-maili - Raport\"\n\n#, fuzzy\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"Błąd\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Eksport\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"Wiersz eksportu\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Język\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Bułgarski\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Kataloński\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Czeski\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"Niemiecki\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"Angielski\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Hiszpański\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Hiszpański (Ameryka Łacińska)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"Estoński\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"Perski\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"Fiński\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"Francuski\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Węgierski\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"Indonezyjski\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Włoski\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Laotański\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Litewski\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Holenderski\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Polski\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"Portugalski\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"Estoński\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Rosyjski\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Słoweński\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"Turecki\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Chiński uproszczony\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Skonfiguruj języki\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"Wiadomość\"\n\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"\"\n\"Uruchomienie przycisku \\\"%(button)s\\\" w modelu \\\"%(model)s\\\" jest \"\n\"niedozwolone.\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"Nie masz dostępu do \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"Nie masz dostępu do \\\"%(model)s.%(field)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"Nie masz uprawnień do uruchomienia kreatora \\\"%(wizard)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Nie masz uprawnień do uruchomienia kreatora \\\"%(wizard)s\\\" w modelu \"\n\"\\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Nieprawidłowy kontekst \\\"%(context)s\\\" dla akcji \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\"Nieprawidłowa domena lub kryteria wyszukiwania \\\"%(domain)s\\\" dla akcji \"\n\"\\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Nieprawidłowy widok \\\"%(view)s\\\" dla akcji \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"Nieprawidłowy model kreatora w akcji \\\"%(name)s\\\" dot. słów kluczowych.\"\n\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Aktywny\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"Odznacz, aby nie używać w przyszłości.\"\n\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Załączniki\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"Nazwa modelu musi być unikalna!\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"Ten rekord jest częścią podstawowej konfiguracji.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"Nazwa modelu musi być unikalna!\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Nie masz uprawnień do utworzenia rekordów w \\\"%(model)s\\\" z powodu niezgodności przynajmniej jednej z reguł:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"Data utworzenia\"\n\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"Utworzył\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Nie masz uprawnień do usunięcia rekordów \\\"%(ids)s\\\" z modelu \\\"%(model)s\\\" z powodu niezgodności przynajmniej jednej z reguł:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"Nie masz uprawnień do usunięcia tego rekordu.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"Lis\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"Boolean\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"Char\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Date\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"DateTime\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"Digits\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"Domena\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"Float\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"Pomoc\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Zaznaczenie\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"Para klucza i etykiety rozdzielone w linii przez \\\":\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Zaznaczenie JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"Integer\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"Nieprawidłowa domena w schemacie \\\"%(schema)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Nieprawidłowe zaznaczenie w schemacie \\\"%(schema)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Nieprawidłowe zaznaczenie w schemacie \\\"%(schema)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Wielokrotne zaznaczenie\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"Numeric\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Zaznaczenie\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"Para klucza i etykiety rozdzielone w linii przez \\\":\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"Zaznaczenie JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"Zaznaczenie posortowane\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"Aktywuj, jeśli zaznaczenie ma być posortowane według etykiety.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"String\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"Typ\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"Liczba cyfr w wartości \\\"%(value)s\\\" w polu \\\"%(field)s\\\" modelu \"\n\"\\\"%(model)s\\\" przekroczyła limit \\\"%(digits)i\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"Wartość w polu \\\"%(field)s\\\" dla \\\"%(model)s\\\" jest nieprawidłowa względem \"\n\"swojej domeny.\"\n\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"Data utworzenia\"\n\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"Zmodyfikował\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Nieprawidłowa treść w szablonie e-mail \\\"%(template)s\\\" generująca wyjątek \"\n\"\\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Nieprawidłowe wyrażenie PYSON %(field)s w szablonie e-mail \\\"%(template)s\\\" \"\n\"generujące wyjątek \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"PYSON %(field)s w szablonie e-mail \\\"%(template)s\\\" musi generować listę.\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Nieprawidłowy temat w szablonie e-mail \\\"%(template)s\\\" generujący wyjątek \"\n\"\\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"Niepoprawna wartość czasu \\\"%(value)s\\\" pola \\\"%(field)s\\\" w modelu \"\n\"\\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Rekordy nie mogą zostać usunięte ponieważ są używane w polu \\\"%(field)s\\\" \"\n\"modelu \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"Wartość \\\"%(value)s\\\" pola \\\"%(field)s\\\" w modelu \\\"%(model)s\\\" nie istnieje.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"Problem z zapisem, spróbuj ponownie.\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"ID musi być dodatnie.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"Model musi być unikalny!\"\n\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"Domyślny język \\\"%(language)s\\\" musi być przetłumaczalny.\"\n\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"Domyślny język \\\"%(language)s\\\" nie może zostać usunięty.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Niewłaściwy format daty \\\"%(format)s\\\" w języku \\\"%(language)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Niewłaściwe grupowanie \\\"%(grouping)s\\\" w języku \\\"%(language)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\"Warunek \\\"%(condition)s\\\" nie jest poprawnym wyrażeniem PYSON dla przycisku \"\n\"w regule \\\"%s(rule)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\"Niektóre aktywne moduły zależą od modułów, które próbujesz dezaktywować:\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"Nie możesz usunąć modułu, który jest aktywny lub będzie aktywny.\"\n\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Notatki\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\"Próbujesz odczytać rekordy \\\"%(ids)s\\\" modelu \\\"%(model)s\\\", które już nie \"\n\"istnieją.\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Nie masz uprawnień do odczytu rekordów \\\"%(ids)s\\\" modelu \\\"%(model)s\\\" z powodu przynajmniej jednej z reguł:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Nazwa rekordu\"\n\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Błąd rekurencji: Rekord \\\"%(rec_name)s\\\" z elementem nadrzędnym \"\n\"\\\"%(parent_rec_name)s\\\" został skonfigurowany jako element nadrzędny siebie \"\n\"samego.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Błąd składni dla referencji: \\\"%(value)r\\\" w \\\"%(field)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Brak relacji: \\\"%(value)r\\\" w \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"Nieprawidłowe określenie e-maila w raporcie \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Nieprawidłowa treść w szablonie e-mail \\\"%(template)s\\\" generująca wyjątek \"\n\"\\\"%(exception)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"W polu \\\"%(fields)s\\\" w modelu \\\"%(model)s\\\" wymagana jest wartość.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"W polu \\\"%(fields)s\\\" w modelu \\\"%(model)s\\\" wymagana jest wartość.\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"Zasoby, do których należy skopiować ten rekord.\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"Nieprawidłowa domena w regule \\\"%s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Brak funkcji wyszukiwania w polu \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"Brak w elementach wyboru wartości \\\"%(value)s\\\" pola \\\"%(field)s\\\" dla \"\n\"modelu \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Sekwencja\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\"Typ sekwencji nie może zostać zmieniony. Należy utworzyć nową sekwencję.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Nieprawidłowa treść w szablonie e-mail \\\"%(template)s\\\" generująca wyjątek \"\n\"\\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Niewłaściwy prefiks \\\"%(prefix)s\\\" w sekwencji \\\"%(sequence)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Niewłaściwy sufiks \\\"%(suffix)s\\\" w sekwencji \\\"%(sequence)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"Ostatni znak czasu nie może wystąpić w przyszłości w sekwencji \\\"%s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"Brakująca sekwencja.\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Brakująca funkcja setter dla pola \\\"%(field)s\\\" w \\\"%(model)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"Wartość pola \\\"%(field)s\\\" w \\\"%(model)s\\\" jest zbyt długa (%(size)i > \"\n\"%(max_size)i).\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"Wartość pola \\\"%(field)s\\\" w \\\"%(model)s\\\" jest zbyt długa (%(size)i > \"\n\"%(max_size)i).\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"Niepoprawna wartość czasu \\\"%(value)s\\\" pola \\\"%(field)s\\\" w modelu \"\n\"\\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"M\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"R\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"d\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"g\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"m\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"s\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"t\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Znaleziono zbyt wiele relacji: \\\"%(value)r\\\" w \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\"Nie możesz eksportować tłumaczenia %(name)s ponieważ jest ono nadpisane \"\n\"przez moduł %(overriding_module)s.\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\"Warunek \\\"%(condition)s\\\" nie jest poprawnym wyrażeniem PYSON dla wyzwalacza\"\n\" \\\"%(trigger)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Błąd składni w XML id: \\\"%(value)r\\\" w \\\"%(field)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"Niewłaściwy XML dla widoku \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\"Nieprawidłowa domena lub kryteria wyszukiwania \\\"%(domain)s\\\" dla akcji \"\n\"\\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\"Próbujesz zapisać rekordy \\\"%(ids)s\\\" z modelu \\\"%(model)s\\\", które już nie \"\n\"istnieją.\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Nie masz uprawnień do zapisu rekordów \\\"%(ids)s\\\" modelu \\\"%(model)s\\\" z powodu przynajmniej jednego z reguł:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"Nie masz uprawnień do modyfikacji tego rekordu.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Błąd składni w XML id: \\\"%(value)r\\\" w \\\"%(field)s\\\".\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Dostęp do modelu\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"Czy na pewno chcesz przesłać tłumaczenia językowe?\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"Czy na pewno chcesz usunąć tłumaczenia językowe?\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"Przycisk modelu\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Uruchom jednokrotnie\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"Otwórz\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Dostęp\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Prześlij tłumaczenia\"\n\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Usuń tłumaczenia\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Synchronizacja\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Zaznacz, aby aktywować\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Anuluj aktywację\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Zaznacz do dezaktywacji (beta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Anuluj dezaktywację\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Zaznacz, aby aktualizować\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Anuluj aktualizację\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Pokaż\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"Reset przycisku modelu\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"Kliknięcie przycisku modelu\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"Reguła przycisku modelu\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"Dane modelu\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"Pole modelu\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"Dostęp do pola modelu\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"Wykres modelu druku\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Moduł\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"Uruchomiono aktywację/aktualizację modułu\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"Rozpoczęcie aktywacji/aktualizacji modułu\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Skonfiguruj moduły\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"Uruchomiono kreatora konfiguracji modułu\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"Pierwszy kreator konfiguracji modułu\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"Kreator konfiguracji do uruchomienia po aktywacji modułu\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"Inny kreator konfiguracji modułu\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"Zależność modułu\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Notatka\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"Notatka przeczytana\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"Kolejka\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"Reguła\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"Grupa reguł\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Sekwencja\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Sekwencja ciągła\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Typ sekwencji\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"Sesja\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"Kreator sesji\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Tłumaczenie\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Oczyść tłumaczenie\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Oczyść tłumaczenie\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Wyeksportuj tłumaczenie\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Wyeksportuj tłumaczenie\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Dodaj tłumaczenie\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Dodaj tłumaczenie\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"Aktualizuj tłumaczenie\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Wyzwalacz\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"Dziennik wyzwalaczy\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"UI menu\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Akcje\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Akcje\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Okno akcji\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Raporty\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"Adresy URL\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Kreatory\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Administracja\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Załączniki\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Elementy kreatora konfiguracji\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Akcje\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"E-mails\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"Szablony e-maili\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"Błąd\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Wyeksportowania\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Ikony\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"Typ\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Języki\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Lokalizacja\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"Wiadomość\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Dostęp do modeli\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Przyciski\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Dane\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Dostęp do pól\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Modele\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Modele\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Wykonaj aktywację/aktualizację\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Moduły\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Moduły\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notatki\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Reguły rekordu\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Harmonogram\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sekwencje\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sekwencje ciągłe\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Sekwencje\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Oczyść tłumaczenia\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Wyeksportuj tłumaczenia\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Tłumaczenia\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Ustaw tłumaczenia\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronizuj tłumaczenia\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Wyzwalacze\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"Interfejs użytkownika\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Widoki\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"Wyszukiwanie widoku\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"Stan drzewa widoku\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Stan drzewa\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"Szerokość drzewa widoku\"\n\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Pola\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"Menu ulubionych\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Widok\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Pokaż widok\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"Wyszukiwanie widoku\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"Stan drzewa widoku\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"Stan drzewa widoku\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"Szerokość drzewa widoku\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Zaznaczone węzły\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Zaznaczone węzły\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"Formularz akcji\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"Relacja formularza\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"Otwórz wykres\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"Otwórz drzewo\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"Drukuj formularz\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Zaznaczone węzły\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Zaznaczone węzły\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Zaznaczone węzły\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Dane\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"Odnośnik\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"Dni\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"Godziny\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"Minuty\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"Miesiące\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"Tygodnie\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"Wyczyść kolejkę zadań\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"Wyzwalacze uruchamiane o określonym czasie\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Akcja\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"Otwórz\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"Od lewej do prawej\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"Od prawej do lewej\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"Aktywny\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Nieaktywny\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"Do aktywacji\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"Do usunięcia\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Do aktualizacji\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"Wykonano\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"Otwórz\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"Aktywny\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Nieaktywny\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"Do aktywacji\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"Do usunięcia\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Do aktualizacji\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"Nieznany\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Dziesiętny znak czasu\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Szesnastkowy znak czasu\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"Przyrostowo\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Dziesiętny znak czasu\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Szesnastkowy znak czasu\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"Przyrostowo\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Pole\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"Pomoc\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Raport\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"Zaznaczenie\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Widok\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"Przycisk kreatora\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"Tablica\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"Kalendarz\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"Formularz\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Wykres\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"Formularz listy\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"Drzewo\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"Ogólne\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"Edytuj\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"Ogólne\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"Ogólne\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"Ogólne\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"Ogólne\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"Czas ostatniej modyfikacji\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"O\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"Każdy\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"Kolejne wywołanie\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"Kolejne wywołanie\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Uruchom jednorazowo\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"Ukryci odbiorcy:\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"Odbiorcy:\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"Dodatkowi odbiorcy:\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"Możesz przesłać teraz do systemu dodatkowe tłumaczenia.\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"Formatowanie daty\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"Formatowanie pieniężne\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"Formatowanie liczb\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"Moduły zostały zaktualizowane / aktywowane.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"Wykonanie operacji może zająć kilka minut.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"System zostanie zaktualizowany.\"\n\n#, fuzzy\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"Możesz przesłać teraz do systemu dodatkowe tłumaczenia.\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"Konfiguracja została ukończona.\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\"Będziesz mógł skonfigurować swoją instalację w zależności od modułów, które \"\n\"zainstalowałeś.\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Anuluj aktywację\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Anuluj deaktywację\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Anuluj aktualizację\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Oznacz do aktywacji\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Oznacz do dezaktywacji (beta)\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Oznacz do uaktualnienia\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"Czas\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"Użytkownik\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\"Jeśli brak jest zdefiniowanego testu, reguła jeśli nie jest globalna zawsze \"\n\"spełnia wymagania.\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\"Reguła spełnia wymagania jeśli wynik przynajmniej jednego testu jest True.\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"${day}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"${month}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"${year}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"Dzień:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"Przyrostowo\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"Legenda (Placeholders dla prefiksu, sufiksu)\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"Miesiąc:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"Znak czasu\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"Rok:\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"Oczyścić tłumaczenia?\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"Tłumaczenia zostały pomyślnie wyczyszczone.\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Zsynchronizować tłumaczenia?\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"Tłumaczenia zostały pomyślnie zdefiniowane.\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Anuluj\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"Prześlij\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Anuluj\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"Wydruk\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Anuluj\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"Rozpocznij aktualizację\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Aktywny\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Anuluj\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"Anuluj\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"Następne\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"Anuluj\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"Wyczyść\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Anuluj\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"Zamknij\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Anuluj\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Eksportuj\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Anuluj\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"Ustaw\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Anuluj\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"Zaktualizuj\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"Zamknij\"\n"
  },
  {
    "path": "trytond/ir/locale/pt.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ícone\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Palavras-chave\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"ID do registro\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"Domínios\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Visões\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Ação\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"Valor do contexto\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"Contexto do Domínio\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"Contexto do Modelo\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"Valor do domínio\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"Domínios\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ícone\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Palavras-chave\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"Limite\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"Valor de ordenação\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"Contexto PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"Domínio PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"Ordenação PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"Critério de busca PySON\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"ID do registro\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"Critérios de busca\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Visões\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Ação\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"Quantidade\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domínio\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Ação\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Sumário\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Ação\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"Palavra-chave\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Ação\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"Impressão Direta\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"Extensão\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ícone\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"É personalizado\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Palavras-chave\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Nome do Registro\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"ID do registro\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"Caminho\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"Conteúdo\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"Conteúdo\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"Conteúdo HTML\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"Nome do conteúdo\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"Nome interno\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"Único\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"Extensão do modelo\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Traduzível\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Ação\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ícone\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Palavras-chave\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"ID do registro\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"URL da ação\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Ação\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ícone\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Palavras-chave\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"ID do registro\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"Uso\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"Janela\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"Nome do assistente\"\n\n#, fuzzy\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Recurso\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Dados\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"Tamanho dos dados\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Descrição\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"ID do Arquivo\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Última modificação\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Último usuário\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"Link\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"Recurso\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"Sumário\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Recurso\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Recurso\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Última modificação\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Último usuário\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"Recurso\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"Timestamp\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Abreviação\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"Index\"\n\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Abreviação\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"Index\"\n\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"Hostname\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"idioma\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"Dia\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"Horas\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"Intervalo numérico\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"Tipo de Intervalo\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"Método\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"Minutos\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"Próxima chamada\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"Tempo\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"Dia da Semana\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"Recurso\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"Usuário\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"Email\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Nome do modelo\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Relatórios\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Relatório\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"Extensão do modelo\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Descrição\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"Mensagem\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"Criado por\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Estado\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"Sumário\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Campos\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"Recurso\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Exportar\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"AM\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"Código\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Separador Decimal\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"Direção\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Agrupamento\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Separador Decimal\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Agrupamento\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Separador de Milhar\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"O Símbolo Negativo Precede\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"Negativo Separado por Espaço\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"Posição do sinal negativo\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"Sinal de negativo\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"O símbolo positivo precede\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"Sinal positivo separado por espaço\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"Posição do sinal positivo\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"Código Pai\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"PM\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"Sinal de positivo\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Separador de milhar\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Traduzível\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Idiomas\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"Texto\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Campos\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"Busca global\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"Informação\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"Nome do modelo\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"Descrição do modelo\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Descrição\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Acesso de criação\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Acesso de deleção\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Acesso de leitura\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Acesso de edição\"\n\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Cliques\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"Confirmar\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"Ajuda\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"Reiniciar\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"Reiniciado por\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"Regras\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"Etiqueta\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Botão\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"Regra do Botão (Button Ruled)\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Botão\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"ID do registro\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Botão\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"Condição\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Descrição\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"Número do Usuário\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID do recurso\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"Identificador no sistema de arquivos\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"Valores no Sistema de Arquivos\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"Sem atualização\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Fora de Sincronia\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"Valores\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Acesso\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"Descrição do campo\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"Ajuda\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"Relação do modelo\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"Tipo do campo\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Descrição\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Campo\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Acesso de criação\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Acesso de deleção\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Acesso de leitura\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Acesso de edição\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Filtro\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"Nível\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"Filhos\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"Dependências\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"Pais\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"Estado\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"Versão\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"Módulos a atualizar\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Módulos\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Ação\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"Estado\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"Porcentagem\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"Estado\"\n\n#, fuzzy\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Recurso\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Última modificação\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Último usuário\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"Mensagem\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"Mensagem\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"Recurso\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"Não lida\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Nota\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"Usuário\"\n\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Dados\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"Removido da fila em\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"Adicionado à fila em\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"Esperado a\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"Concluído a\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"Programado para\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domínio\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"Padrão\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"Global\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Acesso de criação\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Acesso de deleção\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Acesso de leitura\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Acesso de edição\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"Testes\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Última Timestamp\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nome da sequência\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Número do incremento\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Próximo número\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Próximo número\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Enchimento do número (zeros à esquerda)\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Prefixo\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Tipos de Sequência\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Sufixo\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Alinhamento da Timestamp\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Arredondamento da Timestamp\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Última Timestamp\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nome da sequência\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Número do incremento\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Próximo número\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Próximo número\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Enchimento do número (zeros à esquerda)\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Prefixo\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Tipos de Sequência\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Sufixo\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Alinhamento do Timestamp\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Arredondamento do Timestamp\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Nome da sequência\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"Chave\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Dados\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"Vago\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"Nome do campo\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"Módulo sobreescrevente\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID do Recurso\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"Origem\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"Valor de tradução\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"Arquivo\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"Arquivo\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Ação\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"Condição\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"Número limite\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"Atraso Mínimo\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"Ao criar\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"Ao apagar\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"No tempo\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"Ao editar\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"ID do registro\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Gatilho\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ícone\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"Caminho do SVG\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Ação\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"Palavras-Chave para Ação\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"Criança\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"Nome completo\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"Favorito\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ícone\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"Menu pai\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"Usuário\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"Arquitetura da visão\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Dados\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domínio\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"Campos filhos\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"Visão herdada\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"Prioridade\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"Tipo de visão\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domínio\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"Usuário\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Campo\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Usuário\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"Valores\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"Sumário\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"Nome do filho\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domínio\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"Nodos expandidos\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"Nodos selecionados\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"Usuário\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Campo\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"Usuário\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"Largura\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"Parte do domínio que será avaliado em cada atualização\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"Limit padrão para a listagem\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"Critério de busca padrão para a listagem\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\"Deixe vazio para o mesmo do modelo. Veja a documentação do LibreOffice para \"\n\"formatos compatíveis.\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"Marque se o modelo funcionar para apenas um registro.\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"Desmarque para desabilitar traduções para este relatório.\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"Executar o assitente em nova janela\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Uma expressão PYSON avaliada com o registro representado por \\\"self\\\"\\n\"\n\"Ela dispara uma ação se for verdadeira.\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Uma expressão PYSON avaliada com o registro representado por \\\"self\\\"\\n\"\n\"Ela dispara uma ação se for verdadeira.\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Uma expressão PYSON avaliada com o registro representado por \\\"self\\\"\\n\"\n\"Ela dispara uma ação se for verdadeira.\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"Código de exceção do pai\"\n\n#, fuzzy\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"Módulo no qual este modelo está definido\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\"Texto de confirmação para exibir ao usuário quando clicar em um botão.\"\n\n#, fuzzy\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"Botão que reiniciará as regras\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\"Uma expressão PYSON avaliada com o registro representado por \\\"self\\\"\\n\"\n\"Ela dispara uma ação se for verdadeira.\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"O id do registro no banco de dados.\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"O id do registro como conhecido pelo sistema de arquivos.\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"Módulo no qual este campo está definido\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\"Entrar uma expressão regular em Python irá excluir os modelos que combinarem\"\n\" do grafo.\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"Quando a tarefa deverá ser concluída.\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"Quando a tarefa pode começar.\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\"O Domínio é avaliado com um contexto PYSON contendo:\\n\"\n\"- \\\"user\\\" como o usuário atual\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"Adicione esta regra a todos os usuários por padrão\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\"Torne essa regra global\\n\"\n\"para que todos os usuários sejam forçados a segui-la.\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"A regra será satisfeita se pelo menos um dos testes for verdadeiro.\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\"Uma expressão PYSON avaliada com o registro representado por \\\"self\\\"\\n\"\n\"Ela dispara uma ação se for verdadeira.\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\"Limita o número de chamadas a \\\"Função de Ação\\\" por registros.\\n\"\n\"Zero para sem limite.\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\"Defina um intervalo mínimo entre a chamada de \\\"Função de Ação\\\" para o mesmo registro.\\n\"\n\"vazio para nenhum intervalo.\"\n\n#, fuzzy\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"O domínio PYSON\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Ação\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Ações da Janela\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Ações\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Relatórios\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Assistentes\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Anexos\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Itens do Assistente de Configuração\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Ações\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Email\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"Email\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exportações\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Ícones\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Configurar módulos\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Idiomas\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"Mensagem\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Acesso a Modelos\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Acesso\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Cliques\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Botões\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Dados\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Acesso a Campos\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Acesso\"\n\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Campos\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Modelos\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Realizar Ativações/Atualizações Pendentes\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Configurar módulos\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Configuração do Módulo\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Módulos\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notas\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Regras de Registro\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sequências\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequências Estritas\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"Tipo\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Limpar Traduções\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Exportar Traduções\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Traduções\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Traduções\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Definir traduções\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Sincronizar Traduções\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Gatilhos\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Telas\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"Tela de Busca\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Mostrar Tela\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"Estado da tela de busca\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Estado da Listagem\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"Largura da Tela de Listagem\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Grafo\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Grafo\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Grafo do Fluxo de Trabalho\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Traduções\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"Janela de ato de ação\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"Domínio de janela de ato de ação\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Todos\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"Abrir\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Todos\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Fora de Sincronia\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Local\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Módulos\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"Tela de janela de ato de ação\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"Palavra-chave de ação\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"Relatório de ação\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"URL da ação\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"Assistente de ação\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Anexo\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"Cache\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"Sex\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"Seg\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"Sáb\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"Dom\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"Qui\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"Ter\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"Qua\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"Dia\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"Sexta\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"Segunda\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"Sábado\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"Domingo\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"Quinta\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"Terça\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"Quarta\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"Abr\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"Ago\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"Dez\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"Fev\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"Jan\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"Jul\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"Jun\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"Mar\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"Mai\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"Nov\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"Out\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"Set\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"Mês\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"Abril\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"Agosto\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"Dezembro\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"Fevereiro\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"Janeiro\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"Julho\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"Junho\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"Março\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"Maio\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"Novembro\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"Outubro\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"Setembro\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"Configuração\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"Cron\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\n#, fuzzy\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"Email\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Exportar\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"Exportar Linha\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Búlgaro\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Catalão\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Tcheco\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"Alemão\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"Inglês\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Espanhol (Espanha)\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Espanhol (América Latina)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"Estoniano\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"Persa\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"Concluído a \"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"Francês\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Húngaro\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italiano\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Lao\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Lituano\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Holandês\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Polonês\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"Português\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"Estoniano\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Russo\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Esloveno\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"Turco\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Chinês Simplificado\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Configurar módulos\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"Mensagem\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"Executar o botāo \\\"%(button)s no \\\"%(model)s\\\" não é permitido.\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"Você não pode acessar \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"Você não pode acessar \\\"%(model)s.%(field)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"Você não pode acessar \\\"%(model)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"Você não pode acessar \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Contexto \\\"%(context)s\\\" inválido para a ação \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\"Domínio ou critério de busca inválido \\\"%(domain)s\\\" para a ação \"\n\"\\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Visão inválida \\\"%(view)s\\\" para a ação \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"Modelo errado no assistente da ação \\\"%(name)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Ativo\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"Desmarque para não usar futuramente.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Anexos\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"Esse registro é parte da configuração base.\"\n\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"Data de criação\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"Criado por\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"Você não tem permissão para apagar este registro.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"Nov\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"Limpar\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"Domínio\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"Ajuda\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Seleção\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Seleção\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"Domínio inválido no schema \\\"%(schema)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Domínio inválido no schema \\\"%(schema)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Domínio inválido no schema \\\"%(schema)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Seleção\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Seleção\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"Seleção\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"Seleção\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"Tipo\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"O número de dígitos no valor \\\"%(value)s\\\" para o campo \\\"%(field)s\\\" no \"\n\"\\\"%(model)s\\\" excede o limite de \\\"%(digits)i\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"O valor do campo \\\"%(field)s\\\" no \\\"%(model)s\\\" não é válido de acordo com o\"\n\" seu domínio.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"Esperado a\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"Esperado a\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Contexto \\\"%(context)s\\\" inválido para a ação \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Contexto \\\"%(context)s\\\" inválido para a ação \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Contexto \\\"%(context)s\\\" inválido para a ação \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"O formato de hora \\\"%(value)s\\\" para o campo \\\"%(field)s\\\" em \\\"%(model)s\\\" \"\n\"não é valido.\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Os registros não foram excluídos, pois eles são usados pelo campo \"\n\"\\\"%(field)s\\\" de \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"O valor \\\"%(value)s\\\" do campo \\\"%(field)s\\\" em \\\"%(model)s\\\" não existe.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"ID deve ser positivo.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"O idioma padrão deve ser traduzível.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"O idioma padrão deve ser traduzível.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"O idioma padrão não pode ser apagado.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Formato inválido de data \\\"%(format)s\\\" no idioma \\\"%(language)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Agrupamento inválido \\\"%(grouping)s\\\" no idioma \\\"%(language)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\"A condição \\\"%(condition)s\\\" não é uma expressão PYSON válida para a regra \"\n\"\\\"%(rule)s\\\" do botão.\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\"Alguns módulos ativados dependem nos que você está tentando desativar:\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"Você não pode remover um módulo que está ativado ou que será ativado.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Notas\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"Você está tentando ler registros de \\\"%(model)s\\\" que não existem mais.\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Nome do Registro\"\n\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Erro de recursão: O registro \\\"%(rec_name)s\\\" com o pai \"\n\"\\\"%(parent_rec_name)s\\\" foi configurado como ancestral de si mesmo.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Erro de Sintaxe para referência: \\\"%(value)r\\\" em \\\"%(field)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Relação não encontrada: \\\"%(value)r\\\" no \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"E-mail inválido no relatório\\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Contexto \\\"%(context)s\\\" inválido para a ação \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"É necessário um valor para o campo \\\"%(field)s\\\" em \\\"%(model)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"É necessário um valor para o campo \\\"%(field)s\\\" em \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"Domínio inválida na regra \\\"%(name)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"A função de busca no campo \\\"%(field)s\\\" está faltando.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"O valor \\\"%(value)s\\\" do campo \\\"%(field)s\\\" em \\\"%(model)s\\\" não está na \"\n\"lista de opções.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Sequência\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"Contexto \\\"%(context)s\\\" inválido para a ação \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Prefixo \\\"%(prefix)s\\\" inválido na sequência \\\"%(sequence)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Sufixo \\\"%(suffix)s\\\" inválido na sequência \\\"%(sequence)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"O último Timestamp não pode estar no futuro para sequência \\\"%s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"Faltando sequência.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"A função de busca no campo \\\"%(field)s\\\" está faltando.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"O valor para o campo \\\"%(field)s\\\" em \\\"%(model)s\\\" é longo demais (%(size)i\"\n\" > %(max_size)i).\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"O valor para o campo \\\"%(field)s\\\" em \\\"%(model)s\\\" é longo demais (%(size)i\"\n\" > %(max_size)i).\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"O formato de hora \\\"%(value)s\\\" para o campo \\\"%(field)s\\\" em \\\"%(model)s\\\" \"\n\"não é valido.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"AM\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Relações demais encontradas: \\\"%(value)r\\\" em \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\"Você não pode exportar a tradução %(name)s porque ela foi sobrescrita pelo \"\n\"módulo \\\"%(overriding_module)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\"A condição \\\"%(condition)s\\\" não é uma expressão PYSON válida para o gatilho\"\n\" \\\"%(trigger)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Erro de sintaxe para XML id: \\\"%(value)r\\\" em \\\"%(field)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"XML inválido para a tela \\\"%(name)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\"Domínio ou critério de busca inválido \\\"%(domain)s\\\" para a ação \"\n\"\\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\"Você está tentando gravar registros de \\\"%(model)s\\\" que não existem mais.\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"Você não pode alterar este registro.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Erro de sintaxe para XML id: \\\"%(value)r\\\" em \\\"%(field)s\\\".\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Acesso ao modelo\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"Botão do modelo\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"Abrir\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Acesso\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Limpar tradução\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Limpar tradução\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Sync\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Mark for Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Show\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"Reiniciar Botão do Modelo\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"Clique no Botão do Modelo\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"Regra do Botão do Modelo\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"Dados do modelo\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"Campo do modelo\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"Acesso ao campo do modelo\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"Imprimir o grafo do modelo\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Módulo\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"Ativação do Módulo Concluída\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"Iniciar a Atualização do Módulo\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Configurar módulos\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"Assistente de configuração do módulo terminado\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"Primeiro assistente de configuração do módulo\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"Assistente de configuração a ser executado após ativar um módulo\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"Outro assistente de configuração do módulo\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"Dependência do módulo\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Nota\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"Nota Lida\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"Fila\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"Regra\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"Grupo de regras\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Sequência\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Sequência estrita\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Tipo de sequência\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"Sessão\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"Assistente de sessão\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Tradução\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Limpar tradução\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Limpar tradução\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Exportar tradução\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Exportar tradução\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Definir tradução\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Definir tradução\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"Atualizar tradução\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Gatilhos\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"Registro de Gatilhos\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Ícone\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"Menu de Interface de Usuário\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Ações\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Ações\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Ações da Janela\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Relatórios\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Assistentes\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Administração\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Anexos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Itens do Assistente de Configuração\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Ações\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Email\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exportações\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Ícones\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"Tipo\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Idiomas\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Localização\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"Mensagem\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Acesso a Modelos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Botões\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Dados\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Acesso a Campos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Modelos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Modelos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Realizar Ativações/Atualizações Pendentes\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Módulos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Módulos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notas\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Regras de Registro\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Agendador\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sequências\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequências Estritas\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Sequências\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Limpar Traduções\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Exportar Traduções\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Traduções\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Definir traduções\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Sincronizar Traduções\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Gatilhos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"Interface de Usuário\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Telas\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"Tela de Busca\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"Estado da tela de busca\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Estado da listagem\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"Largura da Tela de Listagem\"\n\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Campos\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"Menu Favoritos\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Sumário\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Ver tela\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"Tela de busca\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"Estado da tela de busca\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"Estado da tela de busca\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"Largura da tela de busca\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Nodos selecionados\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Nodos selecionados\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"Formulário de ação\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"Relacionar formulário\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"Abrir grafo\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"Abrir listagem\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"Imprimir formulário\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Nodos selecionados\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Nodos selecionados\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Nodos selecionados\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Dados\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"Link\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"Dias\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"Horas\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"Minutos\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"Meses\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"Semanas\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"A limpeza das traduções foi realizada com sucesso!\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Ação\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"Abrir\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"Esquerda para a direita\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"Direta para a esquerda\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"Ativo\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Inativo\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"A ser ativado\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"A ser removido\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"A ser atualizado\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"Feito\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"Abrir\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"Ativo\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Inativo\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"A ser ativado\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"A ser removido\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"A ser atualizado\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"Desconhecido\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Timestamp decimal\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Timestamp hexadecimal\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"Incremental\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Timestamp decimal\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Timestamp hexadecimal\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"Incremental\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Campo\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"Ajuda\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Modelo\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Relatório\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"Seleção\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Sumário\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"Botão do Assistente\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"Quadro\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"Calendário\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"Formulário\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Grafo\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"Listagem\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"Geral\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"Geral\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"Geral\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"Geral\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"Assistente\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"Hora da última modificação\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"Próxima chamada\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"Próxima chamada\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Executar uma vez\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"Formato de data\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"Formatação Monetária\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"Formato dos números\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"Os módulos foram atualizados / ativados.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"Observação: Esta operação pode levar alguns minutos.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"Seu sistema será atualizado.\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"A configuração foi feita corretamente.\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\"Você poderá configurar sua instalações dependendo dos módulos que instalou.\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancelar Ativação\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancelar Desativação\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancelar atualização\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Marcar para Ativação\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Marcar para Desativação (beta)\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Marcar para Atualização\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"Tempo\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"Usuário\"\n\n#, fuzzy\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\"Se não há nenhum teste definido, a regra é sempre satisfeita se não for \"\n\"global.\"\n\n#, fuzzy\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"A regra será satisfeita se pelo menos um dos testes for verdadeiro.\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"${day}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"${day}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"%{year}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"Dia:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"Incremental\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"Legenda (Marcadores para prefixo, sufixo)\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"Mês:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"Timestamp\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"Ano:\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"Limpar traduções?\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Sincronizar traduções?\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"Imprimir\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"Iniciar Atualização\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Ativo\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"Próximo\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"Limpar\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"Fechar\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Exportar\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"Definir\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"Atualizar\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"Fechar\"\n"
  },
  {
    "path": "trytond/ir/locale/ro.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Pictogramă\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Cuvinte cheie\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"Înregistrare\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"Utilizare\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"Domenii\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Vederi\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Acțiune\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"Valoare Context\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"Domeniu Context\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"Model context\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"Valoare Domeniu\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"Domenii\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Pictogramă\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Cuvinte cheie\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"Limită\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"Valoare Ordine\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"Context PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"Domeniu PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"Ordine PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"Criterii Cautare PySON\"\n\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"Înregistrare\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"Criteriu de cautare\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"Utilizare\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Vederi\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Acțiune\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"Numeratoare\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domeniu\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Acțiune\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Vedere\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Acțiune\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"Civinte Cheie\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Acțiune\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"Tipărire directă\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"Extensie\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Pictogramă\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"Este personalizat\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Cuvinte cheie\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"ID de înregistrare\"\n\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"Înregistrare\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"Cale\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"Conţinut\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"Conţinut\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"Conţinut HTML\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"Denumire Conţinut\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"Denumire interna\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"Singur\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"Extensie Șablon\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Se poate traduce\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"Utilizare\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Acțiune\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Pictogramă\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Cuvinte cheie\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"Înregistrare\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"URL Actiune\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"Utilizare\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Acțiune\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Pictogramă\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Cuvinte cheie\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"Înregistrare\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"Utilizare\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"Fereastră\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"Denumire Asistent\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Copiere la Resurse\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Copiere la Resurse Vizibile\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Date\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"Mărimea Datelor\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Descriere\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"ID al fișierului\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Ultima Modificare\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Ultimul Utilizator\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"Legătură\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"Resursă\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"Rezumat\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Resursă\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Resursă\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Ultima Modificare\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Ultimul Utilizator\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"Resursă\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"Ștampila de timp\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Abreviere\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"Index\"\n\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Nume\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Abreviere\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"Index\"\n\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Nume\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"Numele gazdei\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"limba\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"Zi\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"Ora\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"Numărul intervalului\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"Tipul de interval\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"Metodă\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"Minut\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"Următorul apel\"\n\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"Ziua săptămânii\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"Resursă\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"Utilizator\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"Email\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Numele modelului\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Rapoarte\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Rapoarte\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"Șablon\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Descriere\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"Mesaj\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Stare\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"Rezumat\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Câmpuri\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"Resursă\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Export\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"AM\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"Cod\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Separator Zecimal\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"Direcţie\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Grupare\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Separator Zecimal\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Grupare\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Separator de mii\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"Simboluri Valori Negative Precedente\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"Spațiu după minus\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"Poziția semnului negativ\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"Semn negativ\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"Pozitiv separat de spațiu\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"Poziția semnului pozitiv\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"Codul părintelui\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"PM\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"Semn pozitiv\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Separator de mii\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Se poate traduce\"\n\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Limbi\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"Text\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Câmpuri\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"Căutare globală\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"Informație\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"Numele modelului\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"Descrierea modelului\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Descriere\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Creați acces\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Ștergeți accesul\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Acces citit\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Acces de scriere\"\n\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Clicuri\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"Confirmare\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"Ajutor\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"Resetare\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"Resetare Prin\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"Reguli\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"Eticheta\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Buton\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Buton\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"ID de înregistrare\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Buton\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"Condiție\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Descriere\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"Număr de utilizator\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID-ul resursei\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"Identificator pe sistemul de fișiere\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"Valorile sistemului de fișiere\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"Lipsă actualizare\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Nesincronizat\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"valori\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Acces\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"Descrierea câmpului\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"Ajutor\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"Relația modelului\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"Tipul câmpului\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Descriere\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Camp\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Creați acces\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Ștergere Access\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Acces citit\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Acces de scriere\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Filtru\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"Nivel\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"Copii\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"Dependenţe\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"Părinţi\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"Stare\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"Versiune\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"Module de actualizat\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Module\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Acțiune\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"Stare\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"Procent\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"Stare\"\n\n#, fuzzy\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Resursă\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Ultima Modificare\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Ultimul Utilizator\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"Mesaj\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"Mesaj\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"Resursă\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"Necitit\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Nota\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"Utilizator\"\n\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Date\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"Scos din lista la\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"Adăugat in lista la\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"Așteptat la\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"Terminat la\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"Programat la\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domeniu\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"Mod implicit\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"Global\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Creați acces\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Ștergere Access\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Acces citit\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Acces de scriere\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"Teste\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Ultima Ștampila de timp\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Numele secvenței\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Numărul următor\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Numărul următor\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Căptușirea numărului\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Prefix\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Tipuri de secvență\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Sufix\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Diferența Ștampila de timp\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Rotunjirea timpului marcat\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Ultima Ștampila de timp\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Numele secvenței\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Numărul următor\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Numărul următor\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Căptușirea numărului\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Prefix\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Tipuri de secvență\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Sufix\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Diferența Ștampila de timp\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Rotunjirea timpului marcat\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Numele secvenței\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"Cheie\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Date\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"pufos\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Limba\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"Denumire Câmpului\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID-ul resursei\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"Sursă\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"Valoarea traducerii\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"Fişier\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"Fişier\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Limba\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Limba\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Limba\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Acțiune\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"Condiție\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"Numărul limită\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"Întârziere minimă\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"La Creare\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"La Ștergere\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"La timp\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"Pe scriere\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"ID de înregistrare\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Pictogramă\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"Calea SVG\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Acțiune\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"Cuvinte cheie de acțiune\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"Copii\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"Numele intreg\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"Favorită\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Pictogramă\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Meniu\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"Meniul părinților\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Meniu\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"Utilizator\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"Vizualizați Arhitectura\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Date\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domeniu\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"Câmpul Copiilor\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"Vedere moștenită\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"Prioritate\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"Tip vizualizare\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domeniu\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"Utilizator\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Camp\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Utilizator\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"valori\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"Vederi\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"Numele copilului\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domeniu\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"Noduri extinse\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"Noduri selectate\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"Utilizator\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Camp\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"Utilizator\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"Lăţime\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"Parte a domeniul care va fi evaluat la fiecare actualizare.\"\n\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"Limită implicită pentru vizualizarea listei.\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"Criterii implicite de căutare pentru vizualizarea listei.\"\n\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\"Lăsați gol pentru același lucru cu șablonul, consultați documentația \"\n\"LibreOffice pentru formatul compatibil.\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"Verificați dacă șablonul funcționează numai pentru o înregistrare.\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"Debifeați pentru a dezactiva traducerile pentru acest raport.\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"Rulați asistentul într-o fereastră nouă.\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"O declarație PYSON evaluată cu înregistrarea reprezentată de „sine”. \"\n\"Activează regula dacă este adevărată.\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\"O declarație PYSON evaluată cu înregistrarea reprezentată de „sine”. \"\n\"Activează regula dacă este adevărată.\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"O declarație PYSON evaluată cu înregistrarea reprezentată de „sine”. \"\n\"Activează regula dacă este adevărată.\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"Codul părintelui excepțional\"\n\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"Modul în care este definit acest model.\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\"Text pentru a solicita confirmarea utilizatorului atunci când faceți clic pe\"\n\" buton.\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"Buton care ar trebui să reseteze regulile.\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\"O declarație PYSON evaluată cu înregistrarea reprezentată de „sine”\\n\"\n\"Activează regula dacă este adevărată.\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"ID-ul înregistrării din baza de date.\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"ID-ul înregistrării, cunoscut în sistemul de fișiere.\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"Modulul în care este definit acest câmp.\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\"Introducerea unei expresii regulate Python va exclude modelele potrivite din\"\n\" grafic.\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"Când sarcina ar trebui să fie făcută.\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"Când sarcina poate începe.\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\"Domeniul este evaluat cu un context PYSON care conține:\\n\"\n\"- \\\"user” ca utilizator curent\"\n\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"Adăugați această regulă tuturor utilizatorilor în mod implicit.\"\n\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\"Faceți regula globală\\n\"\n\"incăt fiecare utilizator să fie obligat să respecte această regulă.\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\"Afișată utilizatorilor când o eroare de acces apare pentru această regulă.\"\n\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"Regula este satisfăcută dacă cel puțin un test este adevărat.\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Acțiune\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Asistenți\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Fișiere atașate\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Configurarea articolelor de asistent\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Acţiuni\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Email\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"Email\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exporturi\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Pictograme\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Configurarea modulelor\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Limbi\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Meniu\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Meniu\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"Mesaj\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Acces la modele\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Acces\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Clicuri\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Butoane\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Date\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Acces câmpuri\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Acces\"\n\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Câmpuri\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Modele\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Efectuați activarea / modernizarea în așteptare\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Configurarea modulelor\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Configurarea modulului\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Module\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notițe\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Reguli de înregistrare\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Secvenţe\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Secvențe Stricte\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"Tip\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Curațare Traduceri\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Exporta Traduceri\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Traduceri\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Traduceri\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Setați traduceri\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Sincronizați traducerile\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Declanșatoare\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Vederi\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"Lațime Arbore Visualizare\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Stare arbore\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"Lațime Arbore Visualizare\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Grafic\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Grafic\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Graficul fluxului de lucru\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Traduceri\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Tot\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Tot\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Nesincronizat\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Local\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Module\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"Cuvânt cheie de acțiune\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"Raport de acțiune\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"URL Acțiune\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"Asistent de acțiune\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Atașament\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"Vin\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"Lun\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"Sâm\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"Dum\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"Joi\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"Mar\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"Mie\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"Zi\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"Vineri\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"Luni\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"Sâmbătă\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"Duminică\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"Joi\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"Marţi\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"Miercuri\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"Apr\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"Aug\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"Dec\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"Feb\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"Ian\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"Iul\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"Iun\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"Mar\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"Mai\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"Noi\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"Oct\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"Sep\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"Lună\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"Aprilie\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"August\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"Decembrie\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"Februarie\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"Ianuarie\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"Iulie\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"Iunie\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"Martie\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"Mai\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"Noiembrie\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"Octombrie\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"Septembrie\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"Configurare\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"Cron\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\n#, fuzzy\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"Email\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Export\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"Rând Export\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Limba\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Bulgară\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Català\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Ceh\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"Germana\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"Engleză\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Spaniolă\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Spaniolă (latino-americană)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"Eston\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"Finlandeză\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"Franceza\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Maghiar\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"Indoneziană\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italiană\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Lao\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Neerlandeză\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"Portugheză\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"Eston\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Rusă\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Chineză simplificată\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Configurarea modulelor\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"Mesaj\"\n\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"Nu aveț voie sa accessați \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"Nu aveț voie sa accessați \\\"%(model)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"Nu aveț voie sa accessați \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Fișiere atașate\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"Noi\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"Char\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"DataTimp\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"Cifre\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"Domeniu\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"Ajutor\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Selecție JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Selecție JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"Întreg\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"Domeniu nevalid din schema \\\"% (schema) s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Domeniu nevalid din schema \\\"% (schema) s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"Selecție JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"Selecție Sortată\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"Dacă selecția trebuie sortată pe etichetă.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"Şir\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"Numărul de cifre din valoarea \\\"%(value)s\\\" pentru câmpul \\\"%(field)s\\\" din \"\n\"\\\"%(model)s\\\" depășește limita de \\\"%(digits)i\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"Numărul de cifre din valoarea \\\"%(value)s\\\" pentru câmpul \\\"%(field)s\\\" din \"\n\"\\\"%(model)s\\\" depășește limita de \\\"%(digits)i\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"Numărul de cifre din valoarea \\\"%(value)s\\\" pentru câmpul \\\"%(field)s\\\" din \"\n\"\\\"%(model)s\\\" depășește limita de \\\"%(digits)i\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"Limba implicită trebuie să poată fi tradusă.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"Limba implicită trebuie să poată fi tradusă.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"Limba implicită nu poate fi ștearsă.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Format invalid de data \\\"%(format)s\\\" pentru limba \\\"%(language)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Notițe\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Relațianu a fost găsită: \\\"%(value)r\\\" in \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"Email invalid pentru raport \\\"%(name)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Email invalid pentru raport \\\"%(name)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Numărul de cifre din valoarea \\\"%(value)s\\\" pentru câmpul \\\"%(field)s\\\" din \"\n\"\\\"%(model)s\\\" depășește limita de \\\"%(digits)i\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Numărul de cifre din valoarea \\\"%(value)s\\\" pentru câmpul \\\"%(field)s\\\" din \"\n\"\\\"%(model)s\\\" depășește limita de \\\"%(digits)i\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"Numărul de cifre din valoarea \\\"%(value)s\\\" pentru câmpul \\\"%(field)s\\\" din \"\n\"\\\"%(model)s\\\" depășește limita de \\\"%(digits)i\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"Secvență lipsă.\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"Numărul de cifre din valoarea \\\"%(value)s\\\" pentru câmpul \\\"%(field)s\\\" din \"\n\"\\\"%(model)s\\\" depășește limita de \\\"%(digits)i\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"Numărul de cifre din valoarea \\\"%(value)s\\\" pentru câmpul \\\"%(field)s\\\" din \"\n\"\\\"%(model)s\\\" depășește limita de \\\"%(digits)i\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"Numărul de cifre din valoarea \\\"%(value)s\\\" pentru câmpul \\\"%(field)s\\\" din \"\n\"\\\"%(model)s\\\" depășește limita de \\\"%(digits)i\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"S-au găsit prea multe relații: \\\"%(value)r\\\" in \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"Domeniu nevalid din schema \\\"% (schema) s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Acces\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Traducere curată\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Traducere curată\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Configurarea modulelor\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"Asistentul de configurare va rula după activare a unui modul\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"Asistent de configurare Alte\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"Dependența modulului\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Nota\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"Notă citită\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"Coadă\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"Regulă\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"Grup de reguli\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Secvenţă\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Secvențe Stricte\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Tip de secvență\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"Sesiune\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"Asistent de sesiune\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Traducere\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Traducere curată\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Traducere curată\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Exporta traducerea\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Exporta traducerea\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Setați traduceri\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Setați traduceri\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"Actualizați traducerea\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Declanșatoare\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"Jurnal de declanșare\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Pictogramă\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"Meniu UI\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Acţiuni\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Acţiuni\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Rapoarte\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URL-uri\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Asistenți\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Administrare\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Atașament\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Acţiuni\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Email\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"Tip\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Limbi\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"Mesaj\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"Lațime Arbore Visualizare\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"Lațime Arbore Visualizare\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Noduri selectate\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Noduri selectate\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Noduri selectate\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Noduri selectate\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Noduri selectate\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Acțiune\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"Formular\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"General\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"General\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"General\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"Document\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"Timp Ultima Modificare\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"La\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"Fiecare\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"Următorul apel\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"Următorul apel\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Rulează o Singură Dată\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"Ștampila de timp\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Anulare\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Export\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Anulare\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"\"\n"
  },
  {
    "path": "trytond/ir/locale/ru.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Иконка\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ключевые слова\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"Идентификатор записи\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"Использование\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"Домены\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Виды\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"Значение контекста\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"Значение области выборки\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"Домены\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Иконка\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ключевые слова\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"Лимит\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"PySON контекст\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"PySON домен\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"PySON условие поиска\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"Идентификатор записи\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"Критерии поиска\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"Использование\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Виды\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"Кол-во\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"Домен\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Просмотр\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"Ключевое слово\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"Прямая печать\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"Расширение\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Иконка\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ключевые слова\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Идентификатор записи\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"Идентификатор записи\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"Путь\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"Содержание\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"Содержание\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"Внутреннее наименование\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"Расширение шаблонов\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Переводимый\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"Использование\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Иконка\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ключевые слова\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"Идентификатор записи\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"Действие URL\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"Использование\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Иконка\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ключевые слова\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"Идентификатор записи\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"Использование\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"Окно\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"Наименование мастера\"\n\n#, fuzzy\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Данные\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"Размер данных\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Описание\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Последнее изменение\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Последний пользователь\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"Ссылка\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Имя вложения\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"Сводка\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"Запас\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Ресурс\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Последнее изменение\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Последний пользователь\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"Временная метка\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"язык\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"Дни:\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"Часы\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"Внутренний номер\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"Минуты\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"Следующий вызов\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"Время\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"Пользователь\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"Эл.почта\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Наименование модели\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Отчет\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"Расширение шаблонов\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Описание\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"Использование\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"Создано пользователем\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Состояние\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"Сводка\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Поля\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Экспорт\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"Код языка\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Дата\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Разделитель десятичных чисел\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"Направление\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Группировка\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Разделитель десятичных чисел\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Группировка\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Разделитель тысяч\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Разделитель тысяч\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Переводимый\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"Далее\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Поля\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"Глобальный поиск\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"Информация\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"Наименование модели\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"Описание модели\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Описание\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Группа\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Добавление\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Удаление\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Чтение\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Запись\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Clicks\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"Помощь\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"Правило\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Кнопка\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Кнопка\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"Идентификатор записи\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Кнопка\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"Условие\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Описание\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"Ресурс ID\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"Идентификатор в файловой системе\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"Нет обновлений\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Out of Sync\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"Значения\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"Описание поля\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"Помощь\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"Связь модели\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"Тип поля\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Описание\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Поле\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Группа\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Добавление\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Удаление\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Чтение\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Запись\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Фильтр\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"Уровень\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"Подчиненные\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"Зависимости\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"Предки\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"Состояние\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"Версия\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"Модули для установки (обновления)\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"Состояние\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"Процент\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"Состояние\"\n\n#, fuzzy\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Последнее изменение\"\n\n#, fuzzy\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Последний пользователь\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Комментарий\"\n\n#, fuzzy\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"Пользователь\"\n\n#, fuzzy\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Данные\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"Домен\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Группа\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"По умолчанию\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"Общий\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Добавление\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Удаление\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Чтение\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Запись\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"Тесты\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Последняя временная метка\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Наименование нумерации\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Инкремент\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Следующий номер\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Следующий номер\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Кол-во цифр в номере (ведущие нули)\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Префикс\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Суффикс\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Смещение временной метки\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Округление временной метки\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Последняя временная метка\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Наименование нумерации\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Инкремент\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Следующий номер\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Следующий номер\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Кол-во цифр в номере (ведущие нули)\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Префикс\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Суффикс\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Смещение временной метки\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Округление временной метки\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Наименование нумерации\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"Ключ\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Данные\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"Неточный\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Язык\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"Название поля\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"Ресурс ID\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"Исходный текст\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"Значение перевода\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"Файл\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"Файл\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Язык\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Язык\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Язык\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"Условие\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"Номер лимита\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"При создании\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"При удалении\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"На время\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"При записи\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"Идентификатор записи\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Триггер\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Иконка\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"Путь к SVG\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"Действие ключевых слов\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"Подчиненные\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"Полное название\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"Избранное\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Иконка\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Меню\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"Основное меню\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Меню\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"Пользователь\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"Арихитуктура вида\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Данные\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"Домен\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"Подчиненое поле\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"Наследованный вид\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"Приоритет\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"Тип вида\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"Домен\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"Пользователь\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Поле\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Пользователь\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"Значения\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"Просмотр\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"Область\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"Пользователь\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Поле\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"Пользователь\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"Ширина\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"По умолчанию кол-во записей в списке\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"По умолчанию критерии поиска в списке\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\"Если оставить пустым - будет так же как в шаблоне. Допустимые форматы \"\n\"смотрите в документацие unuconv.\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"Запустить мастера в новом окне\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Выражение Python вычисляется для записи \\\"self\\\".\\n\"\n\"Оно запускает действие при значении \\\"True\\\".\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Выражение Python вычисляется для записи \\\"self\\\".\\n\"\n\"Оно запускает действие при значении \\\"True\\\".\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Выражение Python вычисляется для записи \\\"self\\\".\\n\"\n\"Оно запускает действие при значении \\\"True\\\".\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"Модуль, в котором эта модель определена\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\"Выражение Python вычисляется для записи \\\"self\\\".\\n\"\n\"Оно запускает действие при значении \\\"True\\\".\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"Идентификатор записи в базе данных.\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"Идентификатор записи как известно, в файловой системе.\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"Модуль, в котором это поле определяется\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\"Ввод регулярного выражения Python исключит соответствующие модели из \"\n\"диаграммы.\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\"Домен расчитывается для пользователя \\\"user\\\" как для текущего пользователя\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"Добавить это правило для всех пользователей по умолчанию\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\"Сделать правило общим чтобы каждый пользователь следовал этому правилу\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"Это правило выполняется, если по крайней мере одно правило истинно\"\n\n#, fuzzy\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\"Выражение Python вычисляется для записи \\\"self\\\".\\n\"\n\"Оно запускает действие при значении \\\"True\\\".\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\"Ограничение количества вызовов \\\"Действие функции\\\" от записей. \\\"0\\\" - нет \"\n\"ограничений.\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"PYSON домен\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Эл.почта\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"Эл.почта\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"Ошибка\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icons\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Configure Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Clicks\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Buttons\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Данные\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Установить / Обновить\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Module Configuration\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Комментарии\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"Тип\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Export Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Переводы\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Применить переводы\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Show View\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"Ширина вида список\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Workflow Graph\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Переводы\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"Действие окна\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"Действие окна домен\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Все\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"Открыть\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Все\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Out of Sync\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Local\"\n\n#, fuzzy\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Модули\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"Действие окна вида\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"Действие ключевых слов\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"Действие отчета\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"Действие URL\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"Действие мастера\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Вложение\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"Запас\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"Дни:\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"Месяцы:\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"Конфигурация\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"Планировщик\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Дата\"\n\n#, fuzzy\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"Эл.почта\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"Ошибка\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Экспорт\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"Экспорт строки\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Язык\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Bulgarian\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Català\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Czech\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"German\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"English\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Испанский (Испания)\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Spanish (Latin American)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"French\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Болгарский\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italian\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Lao\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Lithuanian\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Dutch\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Polish\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Russian\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Slovenian\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Chinese Simplified\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Некорректный контекст \\\"%(context)s\\\" у действия \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\"Некорректный домен или условия поиска \\\"%(domain)s\\\" у действия \"\n\"\\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Некорректный вид \\\"%(view)s\\\" для действия \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"Некорректная модель мастера в ключевом слове действия \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Действующий\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"Наименование модуля должно быть уникальным\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"This record is part of the base configuration.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"Наименование модуля должно быть уникальным\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"Дата создания\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"Создано пользователем\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"Комментарий\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"Очистить\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Дата\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"Дата\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"Домен\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"Помощь\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Выбор\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Выбор\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Некорректная эл.почта у отчета \\\"%s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Выбор\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Выбор\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"Выбор\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"Выбор\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" exceeds the \"\n\"digits limit of \\\"%(digits)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"The value of the field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not valid according\"\n\" to its domain.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"Дата создания\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"Создано пользователем\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Некорректный контекст \\\"%(context)s\\\" у действия \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Некорректный контекст \\\"%(context)s\\\" у действия \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Некорректный контекст \\\"%(context)s\\\" у действия \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"Модель должна быть уникальной!\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"Язык по умолчанию должен иметь возможность перевода.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"Язык используемый по умолчанию не может быть удален.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Некорректный формат даты \\\"%(format)s\\\" для языка \\\"%(language)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Некорректная группировка \\\"%(grouping)s\\\" в языке \\\"%(language)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\"Условие \\\"%(condition)s\\\" не является корректным выражением python для \"\n\"триггера \\\"%(trigger)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"Вы не можете удалить модуль, который установлен или будет установлен\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Комментарии\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Идентификатор записи\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Syntax error for reference %r in %s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Relation not found: %r in %s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"Некорректная эл.почта у отчета \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Некорректный контекст \\\"%(context)s\\\" у действия \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"Некорректный домен в правиле \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not in \"\n\"the selection.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Нумерация\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"Некорректный контекст \\\"%(context)s\\\" у действия \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Некорректный префикс \\\"%(prefix)s\\\" в нумерации \\\"%(sequence)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Некорректный суффикс \\\"%(suffix)s\\\" в нумерации \\\"%(sequence)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"Последняя временная метка не может быть в будущем для нумерации \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"Отсутствует нумерация.\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Too many relations found: %r in %s\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\"Условие \\\"%(condition)s\\\" не является корректным выражением python для \"\n\"триггера \\\"%(trigger)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"Некорректный XML для вида \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\"Некорректный домен или условия поиска \\\"%(domain)s\\\" у действия \"\n\"\\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"You are not allowed to modify this record.\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Доступ модели\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"Кнопка модели\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"Открыть\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Очистить перевод\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Очистить перевод\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Sync\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Mark for Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Show\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"Данные модели\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"Поле модели\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"Доступ поля модели\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"Распечатать граф модели\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"Установка (обновление) модуля завершено\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"Начать установку (обновление) модуля\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"Мастер конфигурации модуля\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"Мастер конфигурации модуля\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"Запустить мастер конфигурации после установки модуля\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"Мастер конфигурации модуля\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"Зависимости\"\n\n#, fuzzy\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Комментарий\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"Правило\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"Правило группы\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Нумерация\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Строгая нумерация\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Тип нумерации\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"Сессия\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"Мастер сессии\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Перевод\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Очистить перевод\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Очистить перевод\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Экспорт перевода - файл\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Экспорт перевода - файл\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Применить перевод\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Применить перевод\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"Обновить перевод\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Триггер\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"Журнал триггера\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Иконка\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"Пользовательское меню\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Administration\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Эл.почта\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"Ошибка\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icons\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"Тип\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Localization\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"Использование\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Buttons\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Данные\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Установить / Обновить\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Комментарии\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Scheduler\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Export Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Set Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"User Interface\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"Ширина вида список\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"Меню Избранное\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Просмотр\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Просмотр\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"Просмотр поиска\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"Ширина вида список\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"Ширина вида список\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"Ширина просмотра списка\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Выбор\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Выбор\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"Действие формы\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"Форма связана\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"Открыть график\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"Открыть список\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"Печать формы\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Выбор\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Выбор\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Выбор\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Данные\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"Ссылка\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"Дни:\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"Часы\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"Минуты\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"Месяцы:\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"Недели\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"Переводы очищены успешно!\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"Открыть\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"Слева на право\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"Справа на лево\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"Для удаления\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Для обновления\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"Выполнено\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"Открыть\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"Для удаления\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Для обновления\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"Неизвестно\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Десятичная временная метка\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Шестнадцатиричная временная метка\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"Инкрементальная\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Десятичная временная метка\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Шестнадцатиричная временная метка\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"Инкрементальная\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Поле\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"Помощь\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Отчет\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"Выбор\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Просмотр\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"Кнопка мастера\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"Доска\"\n\n#, fuzzy\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"Календарь\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"Форма\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Графика\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"Вид\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"Основной\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"Основной\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"Основной\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"Основной\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"Основной\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"Последнее изменение\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"Следующий вызов\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"Следующий вызов\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"Формат даты\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"Формат числа\"\n\n#, fuzzy\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"Модули были установлены (обновлены)!\"\n\n#, fuzzy\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"Эта операция может занять несколько минут.\"\n\n#, fuzzy\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"База данных будет обновлена.\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\"Вы сможете настроить базу данных в зависимости от установленных модулей.\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Отмена обновления\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Обновить\"\n\n#, fuzzy\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Дата\"\n\n#, fuzzy\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"Время\"\n\n#, fuzzy\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"Пользователь\"\n\n#, fuzzy\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\"Если ни одна проверка не определена, правило выполняется всегда, если оно не\"\n\" глобальное\"\n\n#, fuzzy\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"Это правило выполняется, если по крайней мере одна проверка истинна\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"${day}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"${month}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"${year}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"День:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"Инкрементальная\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"Легенда (заполнители для префиксов, суффиксов)\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"Месяц:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"Временная метка\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"Год:\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"Очистить переводы?\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Применить переводы?\"\n\n#, fuzzy\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"Перевод должен быть уникальным\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отменить\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отменить\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"Печать\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"Ок\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отменить\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"Начать установку (обновление)\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Действующий\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отменить\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"Ок\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"Ок\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отменить\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"Далее\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отменить\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"Очистить\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отменить\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"Ок\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"Закрыть\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отменить\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Экспорт\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отменить\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"Применить\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"Ок\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отменить\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"Обновить\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"Закрыть\"\n"
  },
  {
    "path": "trytond/ir/locale/sl.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ključne besede\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"ID zapisa\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"Raba\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"Domene\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Pogledi\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Ukrep\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"Vrednost konteksta\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"Kontekstna domena\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"Kontekstni model\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"Domena\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"Domene\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ključne besede\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"Omejitev\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"Razvrstitev\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"PySON kontekst\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"PySON domena\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"PySON razvrstitev\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"PySON kriterij iskanja\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"ID zapisa\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"Kriterij iskanja\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"Raba\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Pogledi\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Ukrep\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"Število\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domena\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Ukrep\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Pogled\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Ukrep\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"Ključna beseda\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Ukrep\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"Neposreden tisk\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"Končnica\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"Po meri\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ključne besede\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Ime\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"ID zapisa\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"Pot\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"Vsebina\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"Vsebina\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"Ime vsebine\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"Interni naziv\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"Posamezen\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"Končnica predloge\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Prevedljivo\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"Raba\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Ukrep\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ključne besede\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"ID zapisa\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"URL ukrepa\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"Raba\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Ukrep\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ključne besede\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"ID zapisa\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"Raba\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"Okno\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"Ime okna\"\n\n#, fuzzy\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Vir\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Podatki\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"Velikost podatkov\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Opis\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"ID datoteke\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Zadnja sprememba\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Zadnji uporabnik\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"Povezava\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"Vir\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"Povzetek\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"Predpomnilnik\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Vir\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Vir\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Zadnja sprememba\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Zadnji uporabnik\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"Vir\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"Časovni žig\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"Jezik\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"Dnevi\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"Ure\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"Število intervalov\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"Minute\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"Naslednji zagon\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"Čas\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"Vir\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"Uporabnik\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"E-pošta\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Ime modela\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Poročilo\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"Končnica predloge\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Opis\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"Sporočilo\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"Izdelal\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Stanje\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"Povzetek\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Polja\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"Vir\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Izvoz\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"Šifra\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Datum\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Decimalna vejica\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"Smer\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Združevanje\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Decimalna vejica\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Združevanje\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Ločevalec tisočic\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Ločevalec tisočic\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Prevedljivo\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"Naprej\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Polja\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"Globalno iskanje\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"Informacije\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"Ime modela\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"Opis modela\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Opis\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Skupina\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Izdelava\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Brisanje\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Branje\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Pisanje\"\n\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Kliki\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"Pomoč\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"Ponastavitev\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"Ponastavil\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"Pravila\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Gumb\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"Gumbi s pravili\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Gumb\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"ID zapisa\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Gumb\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"Pogoj\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Opis\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"Številka uporabnika\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID vira\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"Identifikator v datotečnem sistemu\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"Vrednosti v datotečnem sistemu\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"Brez posodabljanja\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Izven sinhronizacije\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"Vrednosti\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"Opis polja\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"Pomoč\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"Vezni model\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"Vrsta polja\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Opis\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Polje\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Skupina\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Izdelava\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Brisanje\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Branje\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Pisanje\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Filter\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"Nivo\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"Podrejeni\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"Odvisnosti\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"Nadrejeni\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"Stanje\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"Verzija\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"Moduli za posodobitev\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Ukrep\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"Stanje\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"Odstotno\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"Stanje\"\n\n#, fuzzy\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Vir\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Zadnja sprememba\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Zadnji uporabnik\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"Sporočilo\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"Sporočilo\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"Vir\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"Neprebrano\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Zabeležka\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"Uporabnik\"\n\n#, fuzzy\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Podatki\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domena\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Skupina\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"Privzeto\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"Globalno\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Izdelava\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Brisanje\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Branje\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Pisanje\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"Preizkusi\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Zadnji časovni žig\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Prirastek\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Naslednja številka\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Naslednja številka\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Zapolnjevanje\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Predpona\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Pripona\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Odmik časovnega žiga\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Zaokroževanje časovnega žiga\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Zadnji časovni žig\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Prirastek\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Naslednja številka\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Naslednja številka\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Zapolnjevanje\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Predpona\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Pripona\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Odmik časovnega žiga\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Zaokroževanje časovnega žiga\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"Ključ\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Podatki\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"Nejasno\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Jezik\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"Polje\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"Razširjevalni modul\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID vira\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"Original\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"Prevod\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"Datoteka\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"Datoteka\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Jezik\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Jezik\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Jezik\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Ukrep\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"Pogoj\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"Število klicev\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"Minimalna zakasnitev\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"Ob izdelavi\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"Ob brisanju\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"Točno ob času\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"Ob pisanju\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"ID zapisa\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Prožilnik\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"SVG pot\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Ukrep\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"Ključne besede ukrepov\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"Podmeniji\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"Polno ime\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"Priljubljen\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Meni\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"Matični meni\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Meni\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"Uporabnik\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"Zgradba\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Podatki\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domena\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"Podpolja\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"Izpeljan iz\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"Prioriteta\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"Vrsta\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domena\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"Uporabnik\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Polje\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Uporabnik\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"Vrednosti\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"Pogled\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"Ime poddrevesa\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"Domena\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"Razširjeni vozli\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"Izbrani vozli\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"Uporabnik\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Polje\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"Uporabnik\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"Širina\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"Del domene, ki se ovrednoti ob vsaki osvežitvi\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"Privzeta meja za naštevni pogled\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"Privzeti iskalni kriterij za naštevni pogled\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\"Za enako končnico kot v predlogi pustite prazno. Za združljiv format glejte \"\n\"navodila za unoconv.\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"Označi, če predloga poročila velja za posamezen zapis.\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"Zaženi čarovnika v novem oknu\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Pythonski stavek, ki se preračuna z zapisom, dostopnim preko \\\"self\\\".\\n\"\n\"Če je stavek resničen, se sproži pravilo.\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Pythonski stavek, ki se preračuna z zapisom, dostopnim preko \\\"self\\\".\\n\"\n\"Če je stavek resničen, se sproži pravilo.\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Pythonski stavek, ki se preračuna z zapisom, dostopnim preko \\\"self\\\".\\n\"\n\"Če je stavek resničen, se sproži pravilo.\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"Modul, v katerem je ta model določen\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"Gumb, ki ponastavlja pravila\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\"Pythonski stavek, ki se preračuna z zapisom, dostopnim preko \\\"self\\\".\\n\"\n\"Če je stavek resničen, se sproži pravilo.\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"Id zapisa v zbirki podatkov\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"Id zapisa, viden v datotečnem sistemu\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"Modul, v katerem je to polje določeno\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"Vpis Pythonskega regularnega izraza izloči najdene modele iz grafa.\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\"Domena je ovrednotena s PYSON kontekstom, ki vsebuje:\\n\"\n\"- \\\"user\\\" kot trenutni uporabnik\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"Privzeto dodaj to pravilo vsem uporabnikom\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\"Naredi pravilo globalno,\\n\"\n\"tako da ga mora vsak uporabnik upoštevati\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"Pravilu je zadoščeno, če je vsaj en preizkus resničen\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\"Pythonski stavek, ki se preračuna z zapisom, dostopnim preko \\\"self\\\".\\n\"\n\"Če je stavek resničen, se sproži ukrep.\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\"Omeji število klicev \\\"funkcije ukrepa\\\" po posameznem zapisu.\\n\"\n\"0 za neomejeno število.\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\"Nastavi minimalno časovno zakasnitev za klic \\\"Funkcija ukrepa\\\" pri istem zapisu.\\n\"\n\"Pusti prazno za brez zakasnitve.\"\n\n#, fuzzy\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"PYSON domena\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Ukrep\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"E-pošta\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"E-pošta\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"Napaka\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icons\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Configure Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"Sporočilo\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Clicks\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Buttons\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Perform Pending Activation/Upgrade\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Module Configuration\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"Tip\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Export Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Set Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Show View\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"Stanje drevesnega pogleda\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Workflow Graph\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"Ukrep za okna\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"Domena okna za ukrepe\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"All\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"Odprto\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"All\"\n\n#, fuzzy\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Out of Sync\"\n\n#, fuzzy\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Local\"\n\n#, fuzzy\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"Pogled ukrepa za okna\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"Ključna beseda ukrepa\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"Ukrep za poročilo\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"Ukrep za URL\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"Ukrep za čarovnika\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Priloga\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"Predpomnilnik\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"Dnevi\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"Meseci\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"Konfiguracija\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"Časovni razporejevalnik\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Datum\"\n\n#, fuzzy\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"E-pošta\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"Napaka\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Izvoz\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"Postavka izvoza\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Jezik\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Bulgarian\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Català\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Czech\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"German\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"English\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Spanish\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Spanish (Latin American)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"French\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Hungarian\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italian\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Lao\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Lithuanian\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Dutch\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Polish\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Russian\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Slovenian\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Chinese Simplified\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Configure Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"Sporočilo\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Neveljaven kontekst \\\"%(context)s\\\" pri ukrepu \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\"Neveljavna domena ali iskalni kriterij \\\"%(domain)s\\\" pri ukrepu \"\n\"\\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Neveljaven pogled \\\"%(view)s\\\" za ukrep \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"Napačen model čarovnika v ukrepu ključne besede \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Aktivno\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"Ime modula mora biti enolično.\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"This record is part of the base configuration.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"Ime modula mora biti enolično.\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"Izdelano\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"Izdelal\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"Zabeležka\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"Počisti\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Datum\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"Datum\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"Domena\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"Pomoč\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Izbor\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Izbor\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Neveljavna definicija epošte na izpisu \\\"%s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Izbor\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Izbor\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"Izbor\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"Izbor\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"Tip\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" exceeds the \"\n\"digits limit of \\\"%(digits)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"The value of the field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not valid according\"\n\" to its domain.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"Izdelano\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"Izdelal\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Neveljaven kontekst \\\"%(context)s\\\" pri ukrepu \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Neveljaven kontekst \\\"%(context)s\\\" pri ukrepu \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Neveljaven kontekst \\\"%(context)s\\\" pri ukrepu \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"Model mora biti unikaten.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"Privzeti jezik mora biti prevedljiv.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"Privzetega jezika ni možno brisati.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Neveljaven format datuma \\\"%(format)s\\\" pri jeziku \\\"%(language)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Neveljavno združevanje \\\"%(grouping)s\\\" po jeziku \\\"%(language)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\"Pogoj \\\"%(condition)s\\\" na gumbnem pravilu \\\"%(rule)s\\\" ni veljaven PYSON \"\n\"izraz.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\"Nekateri aktivirani moduli so odvisni od modulov, ki jih želiš deaktivirati:\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"Modula, ki je ali bo aktiviran, ni mogoče odstraniti\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Ime\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Syntax error for reference %r in %s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Relation not found: %r in %s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"Neveljavna definicija epošte na izpisu \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"Neveljaven kontekst \\\"%(context)s\\\" pri ukrepu \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"Neveljavna domena pri pravilu \\\"%s\\\"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not in \"\n\"the selection.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Zap.št.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"Neveljaven kontekst \\\"%(context)s\\\" pri ukrepu \\\"%(action)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Neveljavna predpona \\\"%(prefix)s\\\" pri štetju \\\"%(sequence)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Neveljavna pripona \\\"%(suffix)s\\\" pri štetju \\\"%(sequence)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"Zadnji časovni žig pri štetju \\\"%s\\\" ne more biti v prihodnosti.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"Manjka zaporedna številka.\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Too many relations found: %r in %s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\"Prevoda %(name)s ni možno izvoziti, ker je prepisan prevod od modula \"\n\"%(overriding_module)s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\"Pogoj \\\"%(condition)s\\\" na prožilniku \\\"%(trigger)s\\\" ni veljaven PYSON \"\n\"izraz.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"Neveljaven XML za pogled \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\"Neveljavna domena ali iskalni kriterij \\\"%(domain)s\\\" pri ukrepu \"\n\"\\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"You are not allowed to modify this record.\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Dostop do modelov\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"Model gumba\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"Odprto\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Čiščenje prevodov\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Čiščenje prevodov\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Sync\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Mark for Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Show\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"Model ponastavitve gumba\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"Model klika na gumb\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"Model gumbnega pravila\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"Podatki modela\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"Polje modela\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"Dostop do polj\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"Izpis grafa modela\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Modul\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"Zaključek aktivacije modula\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"Začetek aktivacije modula\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"Zaključek konfiguracije modula\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"Začetek konfiguracije modula\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"Nastavitveni čarovnik po aktivaciji modula\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"Ostala konfiguracija modula\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"Odvisen modul\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Zabeležka\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"Prebrana zabeležka\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"Pravilo\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"Skupina pravil\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Štetje\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Strogo štetje\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Tip štetja\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"Seja\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"Čarovnik za sejo\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Prevod\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Čiščenje prevodov\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Čiščenje prevodov\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Izvozi prevod\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Izvozi prevod\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Nastavi prevod\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Nastavi prevod\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"Posodobitev prevodov\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Prožilnik\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"Dnevnik prožilnika\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Ikona\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"Meni uporabniškega vmesnika\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Administration\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"E-pošta\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"Napaka\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icons\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"Tip\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Localization\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"Sporočilo\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Buttons\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Perform Pending Activation/Upgrade\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Scheduler\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Export Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Set Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"User Interface\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"Stanje drevesnega pogleda\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"Priljubljeno\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Pogled\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Prikaz pogleda\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"Iskalni zaznamki\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"Stanje drevesnega pogleda\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"Stanje drevesnega pogleda\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"Velikost dreves\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Izbrani vozli\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Izbrani vozli\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"Ukrep za obrazec\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"Relacija\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"Diagramski prikaz\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"Drevesni prikaz\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"Izpis\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Izbrani vozli\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Izbrani vozli\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Izbrani vozli\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Podatki\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"Povezava\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"Dnevi\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"Ure\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"Minute\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"Meseci\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"Tedni\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"Prevodi uspešno počiščeni!\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Ukrep\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"Odprto\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"Z leve proti desni\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"Z desne proti levi\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"Aktivirano\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Deaktivirano\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"Za aktivirati\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"Za odstraniti\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Za nadgraditi\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"Zaključeno\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"Odprto\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"Aktivirano\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Deaktivirano\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"Za aktivirati\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"Za odstraniti\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Za nadgraditi\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"Neznano\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Desetiški časovni žig\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Šestnajstiški časovni žig\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"Prirastno\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Desetiški časovni žig\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Šestnajstiški časovni žig\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"Prirastno\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Polje\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"Pomoč\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Model\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Poročilo\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"Izbor\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Pogled\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"Gumb čarovnika\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"Deska\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"Koledar\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"Obrazec\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Diagram\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"Drevo\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"Splošno\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"Splošno\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"Splošno\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"Splošno\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"Splošno\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"Zadnja sprememba\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"Naslednji zagon\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"Naslednji zagon\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Enkratni zagon\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"Datumski format\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"Številčni format\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"Moduli nadgrajeni oziroma aktivirani.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"Ta operacija lahko traja nekaj minut.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"Sistem bo nadgrajen.\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"Konfiguracija modulov zaključena\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"Sedaj boste lahko skonfigurirali nameščene module.\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Prekliči aktivacijo\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Prekliči deaktivacijo\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Prekliči nadgradnjo\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Označi za aktivacijo\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Označi za deaktivacijo (beta)\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Označi za nadgradnjo\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Datum\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"Čas\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"Uporabnik\"\n\n#, fuzzy\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"Če pogoj ni določen, bo pravilo vedno veljavno, če ni globalno\"\n\n#, fuzzy\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"Pravilo je veljavno, če je vsaj en pogoj pravilen\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"${day}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"${month}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"${year}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"Dan:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"Prirastno\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"Napotek (prostornik za predpono, pripono)\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"Mesec:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"Časovni žig\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"Leto:\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"Počistim prevode?\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Sinhroniziram prevode?\"\n\n#, fuzzy\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"Prevod mora biti unikaten.\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Prekliči\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Prekliči\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"Natisni\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"V redu\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Prekliči\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"Nadgradi\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Aktivirano\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Prekliči\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"V redu\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"V redu\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"Prekliči\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"Naprej\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"Prekliči\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"Počisti\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Prekliči\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"V redu\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"Zapri\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Prekliči\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Izvozi\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Prekliči\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"Nastavi\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"V redu\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Prekliči\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"Posodobi\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"Zapri\"\n"
  },
  {
    "path": "trytond/ir/locale/tr.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Tanım\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"Languages\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Models Access\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Reports\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Tanım\"\n\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Tree State\"\n\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Alanlar\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Exports\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Alanlar\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Tanım\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Clicks\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Buttons\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Buttons\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Buttons\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Tanım\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Out of Sync\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Tanım\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Alan\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Filtre\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"Seviye\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Notes\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\n#, fuzzy\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Languages\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Triggers\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Alan\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"Views\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Alan\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icons\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Clicks\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Buttons\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Access\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Perform Pending Activation/Upgrade\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Module Configuration\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Clean Translations\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Export Translations\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Set Translations\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Show View\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Workflow Graph\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"All\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"All\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Out of Sync\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Local\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Attachments\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Exports\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Languages\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Bulgarian\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Català\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Czech\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"German\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"English\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Spanish\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Spanish (Latin American)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"French\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Hungarian\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Italian\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Lao\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Lithuanian\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Dutch\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Polish\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Russian\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Slovenian\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Chinese Simplified\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"You are not allowed to delete this record.\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"This record is part of the base configuration.\"\n\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"You are not allowed to delete this record.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Scheduled Actions\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Ad\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" exceeds the \"\n\"digits limit of \\\"%(digits)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"The value of the field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not valid according\"\n\" to its domain.\"\n\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Record Rules\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"Syntax error for reference %r in %s\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Relation not found: %r in %s\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Missing search function on field \\\"%s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not in \"\n\"the selection.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Sequences\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"\"\n\"The time value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" is not \"\n\"valid.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Too many relations found: %r in %s\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"The value \\\"%(value)s\\\" of field \\\"%(field)s\\\" on \\\"%(model)s\\\" doesn't exist.\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"You are not allowed to modify this record.\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Models Access\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Access\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Clean Translations\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Sync\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Mark for Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel Upgrade\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Show\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Configure Modules\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Sequences\"\n\n#, fuzzy\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Sequences Strict\"\n\n#, fuzzy\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Sequence Types\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Clean Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Export Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Export Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Set Translations\"\n\n#, fuzzy\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Set Translations\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Triggers\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Icons\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Window Actions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Reports\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URLs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Wizards\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Administration\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Attachments\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Config Wizard Items\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Exports\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Icons\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Languages\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Localization\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Models Access\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Buttons\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Fields Access\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Models\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Perform Pending Activation/Upgrade\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Modules\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Notes\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Record Rules\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Scheduler\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Sequences Strict\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Sequences\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Clean Translations\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Export Translations\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Translations\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Set Translations\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Synchronize Translations\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Triggers\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"User Interface\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Views\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Tree State\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Fields\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Views\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Show View\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"View Search\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"View Tree Width\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Scheduled Actions\"\n\n#, fuzzy\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Data\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Actions\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Alan\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Models\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Reports\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Views\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Graph\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Run Once\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Cancel Activation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Cancel Deactivation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Cancel Upgrade\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Mark for Activation\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Mark for Deactivation (beta)\"\n\n#, fuzzy\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Mark for Upgrade\"\n\n#, fuzzy\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Data\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"Clean Translations\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Synchronize Translations\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Actions\"\n\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Exports\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"\"\n"
  },
  {
    "path": "trytond/ir/locale/uk.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"Піктограма\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ключові слова\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"Записи\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"Використання\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"Домени\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"Перегляди\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"Дія\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"Значення контексту\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"Контекстний домен\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"Контекстна модель\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"Значення домену\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"Домени\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"Піктограма\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ключові слова\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"Обмеження\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"Значення порядку\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"Контекст PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"Домен PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"Порядок PySON\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"Критерії пошуку PySON\"\n\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"Записи\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"Критерії пошуку\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"Використання\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"Перегляди\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"Дія\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"Кількість\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"Домен\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"Дія\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"Перегляд\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"Дія\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"Ключове слово\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"Дія\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"Прямий друк\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"Розширення\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"Піктограма\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"Користувальницький\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ключові слова\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"Ім'я запису\"\n\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"Записи\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"Шлях\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"Вміст\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"Вміст\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"HTML вмісту\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"Ім'я вмісту\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"Внутрішнє ім'я\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"Одиночний\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"Розширення шаблону\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Перекладний\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"Використання\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"Дія\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"Піктограма\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ключові слова\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"Записи\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"Url-адреса дії\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"Використання\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"Дія\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"Піктограма\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"Ключові слова\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"Записи\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"Використання\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"Вікно\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"Ім'я майстра\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Копіювати до ресурсів\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Копіювати до видимих ресурсів\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"Дані\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"Розмір даних\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"Опис\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"ID файла\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Остання зміна\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Останній користувач\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"Посилання\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"Підсумок\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"Кеш\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Копіювати до ресурсів\"\n\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Копіювати до видимих ресурсів\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"Зображення\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"ID зображення\"\n\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Остання зміна\"\n\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Останній користувач\"\n\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"UUID\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"Аватар\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"Зображення\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"ID зображення\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"Розмір\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"Часова позначка\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Абревіатура\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"Індекс\"\n\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"Абревіатура\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"Індекс\"\n\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"Ім'я хоста\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"мова\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"День\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"Година\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"Номер інтервалу\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"Тип інтервалу\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"Метод\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"Хвилина\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"Наступний виклик\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"Час\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"День тижня\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"Адреси\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"Коли\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"Тіло\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"Одержувачі\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Приховані одержувачі\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Вторинні одержувачі\"\n\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"Тема\"\n\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"Користувач\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"Адреса\"\n\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"Ел.пошта\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"Тіло\"\n\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"Ім'я моделі\"\n\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"Одержувачі\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Приховані одержувачі\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"Приховані одержувачі\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"Одержувачі\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Вторинні одержувачі\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"Вторинні одержувачі\"\n\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"Звіти\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"Тема\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"Звіт\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"Шаблон\"\n\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"Опис\"\n\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"Повідомлення\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"Походження\"\n\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"Ким оброблено\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"Ким вирішено\"\n\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"Стан\"\n\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"Підсумок\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"Поля\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"Експорт\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"AM\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"Код\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"Дата\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Роздільник десятків\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"Напрямок\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Групування\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"Роздільник десятків\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"Групування\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Роздільник тисяч\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"Символ від'ємної валюти передує\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"Відокремлення пробілом від'ємного знака\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"Позиція від'ємного знака\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"Від'ємний знак\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"Символ додатної валюти передує\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"Відокремлення пробілом додатного знака\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"Позиція додатного знака\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"Батьківський код\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"Налаштування текстового пошуку PostgreSQL\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"PM\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"Додатний знак\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"Роздільник тисяч\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"Перекладний\"\n\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"Мови\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"Текст\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"Поля\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"Глобальний пошук\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"Інформація\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"Ім'я моделі\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"Опис моделі\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"Опис\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Створення\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Видалення\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Читання\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Запис\"\n\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"Кліки\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"Підтвердити\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"Довідка\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"Скинути\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"Ким скинуто\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"Правила\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"Мітка\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"Кнопка\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"Керована кнопка\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"Кнопка\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"ID запису\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"Кнопка\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"Умова\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"Опис\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"Кількість користувачів\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID ресурсу\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"Ідентифікатор у файловій системі\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"Значення у файловій системі\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"Немає оновлень\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"Не вдалося синхронізувати\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"Значення\"\n\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"Доступ\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"Опис поля\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"Довідка\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"Зв'язок моделі\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"Тип поля\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"Опис\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"Поле\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Створення\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Видалення\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Читання\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Запис\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"Фільтр\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"Рівень\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"Діти\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"Залежності\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"Батьки\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"Стан\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"Версія\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"Модулі для оновлення\"\n\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"Модулі\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"Дія\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"Стан\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"Відсоток\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"Стан\"\n\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"Копіювати до ресурсів\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"Копіювати до видимих ресурсів\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"Остання зміна\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"Останній користувач\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"Повідомлення\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"Повідомлення\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"Ресурс\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"Непрочитана\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"Примітка\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"Користувач\"\n\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"Дані\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"Коли вилучено з черги\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"Коли поставлено у чергу\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"Коли очікувалось\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"Коли завершено\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"Коли заплановано\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"Домен\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"За замовчуванням\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"Глобальний\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"Створення\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"Видалення\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"Читання\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"Запис\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"Тести\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Остання часова позначка\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Ім'я послідовності\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Число збільшення\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Наступне число\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Наступне число\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Кількість цифр\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Префікс\"\n\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Тип послідовності\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Суфікс\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Зміщення часової позначки\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Округлення часової позначки\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"Остання часова позначка\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Ім'я послідовності\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"Число збільшення\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"Наступне число\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"Наступне число\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"Кількість цифр\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"Префікс\"\n\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Тип послідовності\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"Суфікс\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"Зміщення часової позначки\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"Округлення часової позначки\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"Ім'я послідовності\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"Ключ\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"Дані\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"Нечіткий\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"Мова\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"Ім'я поля\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"Перевизначаючий модуль\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"ID ресурсу\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"Джерело\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"Значення перекладу\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"Файл\"\n\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"Ім'я файла\"\n\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"Мова\"\n\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"Мова\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"Мова\"\n\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"Дія\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"Умова\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"Кількість записів\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"Мінімальна затримка\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"При створенні\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"При видаленні\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"У час\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"При запису\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"ID запису\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"Тригер\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"Піктограма\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"Шлях до SVG\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"Дія\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"Ключові слова дії\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"Діти\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"Повне ім'я\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"Вибране\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"Піктограма\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"Меню\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"Батьківське меню\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"Меню\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"Користувач\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"Перегляд архітектури\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"Дані\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"Домен\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"Діти\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"Успадкований перегляд\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"Пріоритет\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"Тип перегляду\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"Домен\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"Користувач\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"Поле\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"Користувач\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"Значення\"\n\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"ID перегляду\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"Ім'я дитини\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"Домен\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"Розширені вузли\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"Вибрані вузли\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"Користувач\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"Поле\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"Користувач\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"Ширина\"\n\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Записи, над якими виконується дія.\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"Частина домену, яка буде оцінюватися під час кожного оновлення.\"\n\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"Обмеження за замовчуванням для перегляду списку.\"\n\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Записи, над якими виконується дія.\"\n\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"Критерії пошуку за замовчуванням для перегляду списку.\"\n\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"\"\n\"Залиште пустим для того самого розширення, що й у шаблоні. Дивіться \"\n\"документацію LibreOffice щодо сумісного формату.\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\"Вираз Genshi для обчислення імені за допомогою 'запису'.\\n\"\n\"Залиште пустим для імені за замовчуванням.\"\n\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Записи, над якими виконується дія.\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"Позначте, якщо шаблон працює лише для одного запису.\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"Зніміть позначку, щоб вимкнути переклади для цього звіту.\"\n\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Записи, над якими виконується дія.\"\n\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"Записи, над якими виконується дія.\"\n\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"Виконати майстер у новому вікні.\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"Поле, яке містить одержувачів.\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"Поле, яке містить вторинних одержувачів.\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Вираз PYSON, який генерує список прихованих одержувачів із записом, \"\n\"представленим \\\"self\\\".\"\n\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Вираз PYSON, який генерує список одержувачів із записом, представленим \"\n\"\\\"self\\\".\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"Поле, у якому містяться вторинні одержувачі.\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"\"\n\"Вираз PYSON, який генерує список вторинних одержувачів із записом, \"\n\"представленим \\\"self\\\".\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"Код виняткового батька\"\n\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"Модуль, у якому визначено цю модель.\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"Текст для підтвердження користувача під час натискання кнопки.\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"Кнопка, яка має скинути правила.\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\"Оператор PYSON, який оцінюється із записом, представленим \\\"self\\\"\\n\"\n\"Правило активується, якщо результат оцінки істинний.\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"Ідентифікатор запису у базі даних.\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"Ідентифікатор запису, відомий у файловій системі.\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\"Якщо позначено, доступ до моделі поля також перевіряється на записах, \"\n\"пов'язаних з цим полем.\"\n\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"Модуль, у якому визначено це поле.\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"\"\n\"Введення регулярного виразу Python виключає відповідні моделі з графіка.\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"Коли завдання має бути виконано.\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"Коли завдання можна розпочати.\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\"Домен оцінюється за контекстом PYSON, що містить:\\n\"\n\"- \\\"user\\\" у якості поточного користувача\"\n\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"Додати це правило всім користувачам за замовчуванням.\"\n\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\"Зробити правило глобальним, \\n\"\n\"всі користувачі повинні дотримуватися цього правила.\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"Відображається, коли виникла помилка доступу для цього правила.\"\n\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"Правило задовольняється, якщо принаймні один тест істинний.\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\"Оператор PYSON, який оцінюється із записом, представленим \\\"self\\\"\\n\"\n\"Дія виконується, якщо результат оцінки істинний.\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\"Обмежити кількість викликів функції дії для записів.\\n\"\n\"Без обмеження, якщо дорівнює 0.\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\"Мінімальна затримка між викликами функція дії для одного запису.\\n\"\n\"Без затримки, якщо не задана.\"\n\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"Домен PYSON.\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"Дія\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"Дії вікна\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"Дії\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Звіти\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"URL-адреси\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"Майстри\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Вкладення\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Майстри налаштування\"\n\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Дії\"\n\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Ел.пошта\"\n\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"Архіви ел.пошти\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"Шаблони ел.пошти\"\n\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"Помилки\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"Експорти\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Піктограми\"\n\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"Налаштувати мови\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Мови\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Меню\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"Меню\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"Повідомлення\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Доступ до моделей\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"Доступ\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"Кліки\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Кнопки\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Дані\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Доступ до полів\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"Доступ\"\n\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Поля\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"Моделі\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Виконати активацію/оновлення\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"Налаштувати модулі\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"Налаштування модуля\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"Модулі\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"Примітки\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Правила записів\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Послідовності\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Суворі послідовності\"\n\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"Типи\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Очистити переклади\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Експортувати переклади\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Переклади\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Переклади\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Встановити переклади\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Синхронізувати переклади\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Тригери\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"Перегляди\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"Пошуки переглядів\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"Показати перегляд\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"Додаткові перегляди\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Стан дерев\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"Ширини колонок\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Графік\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"Графік\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"Графік робочого процесу\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"Переклади\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"Вікно дії\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"Домен вікна дії\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Всі\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"Відкрити\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"Обробка\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"Всі\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"Не вдалося синхронізувати\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"Локальний\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"Модулі\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"Вікно дії\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"Ключове слово дії\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"Звіт дії\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"URL-адреса дії\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"Майстер дії\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"Вкладення\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"Аватар\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"Кеш аватара\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"Кеш\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"Пт\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"Пн\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"Сб\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"Нд\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"Чт\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"Вт\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"Ср\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"День\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"П'ятниця\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"Понеділок\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"Субота\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"Неділя\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"Четвер\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"Вівторок\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"Середа\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"Кві\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"Сер\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"Гру\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"Лют\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"Січ\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"Лип\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"Чер\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"Бер\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"Тра\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"Лис\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"Жов\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"Вер\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"Місяць\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"Квітень\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"Серпень\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"Грудень\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"Лютий\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"Січень\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"Липень\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"Червень\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"Березень\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"Травень\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"Листопад\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"Жовтень\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"Вересень\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"Налаштування\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"Демон\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"Дата\"\n\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"Ел.пошта\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"Адреса ел.пошти\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"Шаблон ел.пошти\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"Шаблон ел.пошти - Звіт\"\n\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"Помилка\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"Експортувати\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"Експортувати рядок\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"Мова\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"Болгарська\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"Каталонська\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"Чеська\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"Німецька\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"Англійська\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"Іспанська\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"Іспанська (латиноамериканська)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"Естонська\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"Перська\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"Фінська\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"Французька\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"Угорська\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"Індонезійська\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"Італійська\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"Лаоська\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"Литовська\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"Голландська\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"Польська\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"Португальська\"\n\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"Румунська\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"Російська\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"Словенська\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"Турецька\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"Китайська (спрощена)\"\n\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"Налаштувати мови\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"Повідомлення\"\n\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"Виклик кнопки \\\"%(button)s\\\" на \\\"%(model)s\\\" не дозволено.\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"Вам заборонено доступ до \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"Вам заборонено доступ до \\\"%(model)s.%(field)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"Вам заборонено виконувати майстер \\\"%(wizard)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"Вам заборонено виконувати майстер \\\"%(wizard)s\\\" на \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Недійсний контекст \\\"%(context)s\\\" для дії \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Недійсний домен або критерії пошуку \\\"%(domain)s\\\" для дії \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"Недійсний перегляд \\\"%(view)s\\\" для дії \\\"%(action)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"Неправильна модель майстра в дії ключового слова \\\"%(name)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"Активний\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"Зніміть позначку, щоб виключити з наступного використання.\"\n\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"Вкладення\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"Аватар\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"На ресурс дозволяється лише один аватар.\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"Розмір аватара має бути унікальним.\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"URL-адреса аватара\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"Аватари\"\n\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"Цей запис є частиною базової конфігурації.\"\n\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"Назва кнопки має бути унікальною для кожної моделі.\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Вам заборонено створювати записи \\\"%(model)s\\\" через принаймні одне з цих правил:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"Коли створено\"\n\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"Ким створено\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Вам заборонено видаляти записи \\\"%(ids)s\\\" із \\\"%(model)s\\\" через принаймні одне з цих правил:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"Ви не можете видалити цей запис.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"Ні\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"Логічний\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"Символ\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"Дата\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"Дата і час\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"Цифри\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"Домен\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"Число з плав.точкою\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"Довідка\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"Вибір довідки\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"Ключ, за яким слідує текст довідки, розділений \\\":\\\", по одному на рядок.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"JSON для вибору довідки\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"Ціле число\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"Недійсний домен у схемі \\\"%(schema)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Недійсний вибір довідки в схемі \\\"%(schema)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"Недійсний вибір у схемі \\\"%(schema)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"Мультивибір\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"Число\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"Вибір\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"Пара ключів і міток, розділених \\\":\\\", по одному на рядок.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"Вибір JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"Впорядкований вибір\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"Якщо вибір слід впорядкувати за міткою.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"Рядок\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"Так\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"\"\n\"Кількість цифр у значенні \\\"%(value)s\\\" для поля \\\"%(field)s\\\" у \"\n\"\\\"%(model)s\\\" перевищує ліміт \\\"%(digits)i\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"\"\n\"Значення поля \\\"%(field)s\\\" в \\\"%(model)s\\\" недійсне відповідно дойого \"\n\"домену.\"\n\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"Коли змінено\"\n\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"Ким змінено\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Недійсний текст у шаблоні ел.листа \\\"%(template)s\\\" з винятком \"\n\"\\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Недійсне поле PYSON %(field)s в шаблоні ел.листа \\\"%(template)s\\\" з винятком\"\n\" \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"\"\n\"Поле PYSON %(field)s у шаблоні ел.листа \\\"%(template)s\\\" має генерувати \"\n\"список.\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Недійсна тема в шаблоні ел.листа \\\"%(template)s\\\" з винятком \"\n\"\\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\"\n\"Значення \\\"%(value)s\\\" для поля \\\"%(field)s\\\" в \\\"%(model)s\\\" містить деякі \"\n\"недійсні символи \\\"%(chars)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"\"\n\"Записи неможливо видалити, оскільки вони використовуються полем \"\n\"\\\"%(field)s\\\" моделі \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"Значення \\\"%(value)s\\\" для поля \\\"%(field)s\\\" в \\\"%(model)s\\\" не існує.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"Не вдалося зберегти, будь ласка, повторіть спробу.\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"Ідентифікатор має бути позитивним.\"\n\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"Код мови має бути унікальним.\"\n\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"Мова за замовчуванням \\\"%(language)s\\\" має перекладатися.\"\n\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"Мова за замовчуванням \\\"%(language)s\\\" не може бути видалена.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Недійсний формат дати \\\"%(format)s\\\" для мови \\\"%(language)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"Недійсне групування \\\"%(grouping)s\\\" для мови \\\"%(language)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"\"\n\"Умова \\\"%(condition)s\\\" не є дійсним виразом PYSON для правила кнопки \"\n\"\\\"%(rule)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"\"\n\"Деякі активовані модулі залежать від тих, які ви намагаєтеся деактивувати:\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"\"\n\"Ви не можете видалити модуль, який активований або який ви збираєтесь \"\n\"активувати.\"\n\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"Примітки\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\"\n\"Ви намагаєтеся прочитати записи \\\"%(ids)s\\\" із \\\"%(model)s\\\", які більше не \"\n\"існують.\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Вам заборонено читати записи \\\"%(ids)s\\\" з \\\"%(model)s\\\" через принаймні одне з цих правил:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"Ім'я запису\"\n\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"\"\n\"Помилка рекурсії: запис \\\"%(rec_name)s\\\" з батьком \\\"%(parent_rec_name)s\\\" \"\n\"був налаштований як предок самого себе.\"\n\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Синтаксична помилка для посилання: %(value)r в полі \\\"%(field)s\\\" моделі \"\n\"\\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Не знайдено зв'язку: %(value)r в моделі \\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"Недійсне визначення ел.пошти для звіту \\\"%(name)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Недійсне визначення ім'я запису для звіту \\\"%(report)s\\\" з винятком \"\n\"\\\"%(exception)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Потрібно значення для поля \\\"%(field)s\\\" в \\\"%(model)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"Потрібно значення для поля \\\"%(field)s\\\" в \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"Ресурси, на які потрібно скопіювати цей запис.\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"Недійсний домен у правилі \\\"%(name)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Відсутня функція пошуку для поля \\\"%(field)s\\\" в \\\"%(model)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"\"\n\"Значення \\\"%(value)s\\\" для поля \\\"%(field)s\\\" в \\\"%(model)s\\\" не є одним із \"\n\"дозволених параметрів.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"Послідовність\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\"Ви не можете змінити тип послідовності, замість цього створіть нову \"\n\"послідовність.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"\"\n\"Недійсне \\\"Число збільшення\\\" (%(number_increment)s) або \\\"Наступний номер\\\"\"\n\" (%(number_next)s) з винятком \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Недійсний префікс \\\"%(affix)s\\\" для послідовності \\\"%(sequence)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"Недійсний суфікс \\\"%(affix)s\\\" для послідовності \\\"%(sequence)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"\"\n\"\\\"Остання часова позначка\\\" не може бути в майбутньому для послідовності \"\n\"\\\"%s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"Відсутня послідовність.\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"Відсутня функція setter для поля \\\"%(field)s\\\" в \\\"%(model)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"Значення поля \\\"%(field)s\\\" в \\\"%(model)s\\\" задовге (%(size)i > \"\n\"%(max_size)i).\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"\"\n\"Значення поля \\\"%(field)s\\\" в \\\"%(model)s\\\" задовге (%(size)i > \"\n\"%(max_size)i).\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"Недійсне значення часу \\\"%(value)s\\\" поля \\\"%(field)s\\\" в \\\"%(model)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"M\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"Р\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"д\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"г\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"х\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"с\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"т\"\n\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"Знайдено забагато зв'язків: %(value)r в \\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"\"\n\"Ви не можете експортувати переклад \\\"%(name)s\\\", оскільки він був \"\n\"перевизначений модулем \\\"%(overriding_module)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"\"\n\"Умова \\\"%(condition)s\\\" не є дійсним виразом PYSON для тригера \"\n\"\\\"%(trigger)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Синтаксична помилка для значення: %(value)r в полі \\\"%(field)s\\\" моделі \"\n\"\\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"Недійсний XML для перегляду \\\"%(name)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"Недійсний домен або критерії пошуку \\\"%(domain)s\\\" для пошуку \\\"%(search)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\"\n\"Ви намагаєтеся записати в записи \\\"%(ids)s\\\" із \\\"%(model)s\\\", які більше не\"\n\" існують.\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"Вам заборонено писати в записи \\\"%(ids)s\\\" з \\\"%(model)s\\\" через принаймні одне з цих правил:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"Вам заборонено змінювати цей запис.\"\n\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\"\n\"Синтаксична помилка для XML id: %(value)r в полі \\\"%(field)s\\\" моделі \"\n\"\\\"%(model)s\\\" (%(column)s).\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"Доступ до моделі\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"Ви впевнені, що хочете завантажити переклади мов?\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"Ви впевнені, що хочете видалити переклади мов?\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"Кнопка моделі\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"Виконати одноразово\"\n\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"Відкрити\"\n\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"Процес\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"Вирішити\"\n\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"Завантажити переклади\"\n\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"Вивантажити переклади\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"Синхронізувати\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"Позначити для активації\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"Скасувати активацію\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Позначити для деактивації (бета)\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Скасувати деактивацію\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Позначити для оновлення\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Скасувати оновлення\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"Показати\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"Скидання кнопки моделі\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"Натиснення кнопки моделі\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"Правило кнопки моделі\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"Дані моделі\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"Поле моделі\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"Доступ до поля моделі\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"Друкувати графік моделі\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"Модуль\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"Оновлення/активування модуля завершено\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"Початок активування/оновлення модуля\"\n\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"Налаштувати модулі\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"Майстер налаштування модуля завершено\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"Початковий майстер налаштування модуля\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"Майстер налаштування для виконання після активації модуля\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"Інший майстер налаштування модуля\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"Залежність модуля\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"Примітка\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"Прочитана примітка\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"Черга\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"Правило\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"Група правил\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"Послідовність\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"Сувора послідовність\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"Тип послідовності\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"Сеанс\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"Майстер сеансів\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"Переклад\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Очистити переклад\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"Очистити переклад\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"Експортувати переклад\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"Експортувати переклад\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Встановити переклад\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"Встановити переклад\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"Оновити переклад\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"Тригер\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"Журнал тригерів\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"Піктограма\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"Меню користувача\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"Дії\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"Дії\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"Дії вікна\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"Звіти\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"URL-адреси\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"Майстри\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"Адміністрування\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"Вкладення\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"Майстри налаштування\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"Дії\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"Ел.листи\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"Шаблони ел.листів\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"Помилки\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"Експорти\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"Піктограми\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"Типи\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"Мови\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"Локалізація\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"Меню\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"Повідомлення\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"Доступ до моделей\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"Кнопки\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"Дані\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"Доступ до полів\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"Моделі\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"Моделі\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"Виконати активацію/оновлення\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"Модулі\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"Модулі\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"Примітки\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"Правила записів\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"Планувальник\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"Послідовності\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"Суворі послідовності\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"Послідовності\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"Очистити переклади\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"Експортувати переклади\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"Переклади\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"Встановити переклади\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"Синхронізувати переклади\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"Тригери\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"Інтерфейс користувача\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"Перегляди\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"Пошуки переглядів\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"Додаткові перегляди\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"Стан дерев\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"Ширини колонок\"\n\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"Поля\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"Вибране меню\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"Перегляд\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"Показати перегляд\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"Пошуки переглядів\"\n\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"Додаткові перегляди\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"Стан дерев\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"Ширини колонок\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"Перераховані\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"Вибрані\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"Перераховані\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"Вибрані\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"Форма дії\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"Пов'язана форма\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"Відкрити графік\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"Відкрити дерево\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"Друк форми\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"Перераховані\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"Вибрані\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"Перераховані\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"Вибрані\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"Перераховані\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"Вибрані\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"Дані\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"Посилання\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"Дні\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"Години\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"Хвилини\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"Місяці\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"Тижні\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"Очистити помилки\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"Очистити чергу завдань\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"Виконати тригери у час\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"Дія\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"Завдання\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"Відкрити\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"Обробка\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"Вирішено\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"Зліва-направо\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"Справа-наліво\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"Активовано\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Не активовано\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"Підлягає активації\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"Підлягає видаленню\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Підлягає оновленню\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"Завершено\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"Відкрити\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"Активовано\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"Не активовано\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"Підлягає активації\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"Підлягає видаленню\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"Підлягає оновленню\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"Невідомий\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Десяткова часова позначка\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Шістнадцяткова часова позначка\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"Інкрементальний\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"Десяткова часова позначка\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"Шістнадцяткова часова позначка\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"Інкрементальний\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"Поле\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"Довідка\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"Модель\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"Звіт\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"Вибір\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"Перегляд\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"Кнопка майстра\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"Дошка\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"Календар\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"Форма\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"Графік\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"Форма списку\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"Дерево\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"Загальний\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"Редагувати\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"Загальний\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"Загальний\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"Загальний\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"Загальний\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"Документ\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"Час останньої модифікації\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"Коли\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"Кожні\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"Дата наступного виклику\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"Час наступного виклику\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"Виконати одноразово\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"Приховані одержувачі:\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"Одержувачі:\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"Вторинні одержувачі:\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"Походження\"\n\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"Тепер ви можете завантажувати додаткові переклади в систему.\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"Форматування дат\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"Форматування грошей\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"Форматування чисел\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"Модулі оновлено/активовано.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"Зверніть увагу, що ця операція може тривати декілька хвилин.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"Ваша система буде оновлена.\"\n\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"Тепер ви можете активувати додаткові модулі системи.\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"Налаштування виконано.\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"\"\n\"Ви зможете налаштувати свою інсталяцію залежно від встановлених модулів.\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"Скасувати активацію\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"Скасувати деактивацію\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"Скасувати оновлення\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"Позначити для активації\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"Позначити для деактивації (бета)\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"Позначити для оновлення\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"Дата\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"Час\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"Користувач\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"\"\n\"Якщо тест не визначено, правило завжди задовольняється, якщо воно не \"\n\"глобально.\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"Правило задовольняється, якщо принаймні один тест істинний.\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"${day}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"${month}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"${year}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"День:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"Інкрементальний\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"Легенда (заповнювачі для префікса, суфікса)\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"Місяць:\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"Часова позначка\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"Рік:\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"Очистити переклади?\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"Переклади успішно очищено.\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"Синхронізувати переклади?\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"Переклади успішно встановлено.\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Скасувати\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"Завантажити\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Скасувати\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"Друк\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"Гаразд\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Скасувати\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"Почати оновлення\"\n\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"Активувати\"\n\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Скасувати\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"Гаразд\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"Гаразд\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"Скасувати\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"Далі\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"Скасувати\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"Очистити\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Скасувати\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"Гаразд\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"Закрити\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Скасувати\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"Експортувати\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Скасувати\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"Встановити\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"Гаразд\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Скасувати\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"Оновити\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"Закрити\"\n"
  },
  {
    "path": "trytond/ir/locale/zh_CN.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,icon:\"\nmsgid \"Icon\"\nmsgstr \"图标\"\n\nmsgctxt \"field:ir.action,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"关键词\"\n\nmsgctxt \"field:ir.action,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,records:\"\nmsgid \"Records\"\nmsgstr \"记录 ID\"\n\nmsgctxt \"field:ir.action,type:\"\nmsgid \"Type\"\nmsgstr \"类型\"\n\nmsgctxt \"field:ir.action,usage:\"\nmsgid \"Usage\"\nmsgstr \"用法\"\n\nmsgctxt \"field:ir.action.act_window,act_window_domains:\"\nmsgid \"Domains\"\nmsgstr \"域配置\"\n\nmsgctxt \"field:ir.action.act_window,act_window_views:\"\nmsgid \"Views\"\nmsgstr \"视图\"\n\nmsgctxt \"field:ir.action.act_window,action:\"\nmsgid \"Action\"\nmsgstr \"操作\"\n\nmsgctxt \"field:ir.action.act_window,context:\"\nmsgid \"Context Value\"\nmsgstr \"上下文取值\"\n\nmsgctxt \"field:ir.action.act_window,context_domain:\"\nmsgid \"Context Domain\"\nmsgstr \"上下文域\"\n\nmsgctxt \"field:ir.action.act_window,context_model:\"\nmsgid \"Context Model\"\nmsgstr \"上下文模型\"\n\nmsgctxt \"field:ir.action.act_window,domain:\"\nmsgid \"Domain Value\"\nmsgstr \"域取值\"\n\nmsgctxt \"field:ir.action.act_window,domains:\"\nmsgid \"Domains\"\nmsgstr \"域\"\n\nmsgctxt \"field:ir.action.act_window,icon:\"\nmsgid \"Icon\"\nmsgstr \"图标\"\n\nmsgctxt \"field:ir.action.act_window,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"关键词\"\n\nmsgctxt \"field:ir.action.act_window,limit:\"\nmsgid \"Limit\"\nmsgstr \"限制\"\n\nmsgctxt \"field:ir.action.act_window,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.action.act_window,order:\"\nmsgid \"Order Value\"\nmsgstr \"顺序\"\n\nmsgctxt \"field:ir.action.act_window,pyson_context:\"\nmsgid \"PySON Context\"\nmsgstr \"PYSON 上下文\"\n\nmsgctxt \"field:ir.action.act_window,pyson_domain:\"\nmsgid \"PySON Domain\"\nmsgstr \"PYSON 域\"\n\nmsgctxt \"field:ir.action.act_window,pyson_order:\"\nmsgid \"PySON Order\"\nmsgstr \"PySON 顺序\"\n\nmsgctxt \"field:ir.action.act_window,pyson_search_value:\"\nmsgid \"PySON Search Criteria\"\nmsgstr \"PySON 查找条件\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,records:\"\nmsgid \"Records\"\nmsgstr \"记录 ID\"\n\nmsgctxt \"field:ir.action.act_window,res_model:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"field:ir.action.act_window,search_value:\"\nmsgid \"Search Criteria\"\nmsgstr \"查找条件\"\n\nmsgctxt \"field:ir.action.act_window,type:\"\nmsgid \"Type\"\nmsgstr \"类型\"\n\nmsgctxt \"field:ir.action.act_window,usage:\"\nmsgid \"Usage\"\nmsgstr \"用法\"\n\nmsgctxt \"field:ir.action.act_window,views:\"\nmsgid \"Views\"\nmsgstr \"视图\"\n\nmsgctxt \"field:ir.action.act_window.domain,act_window:\"\nmsgid \"Action\"\nmsgstr \"动作\"\n\nmsgctxt \"field:ir.action.act_window.domain,count:\"\nmsgid \"Count\"\nmsgstr \"计数\"\n\nmsgctxt \"field:ir.action.act_window.domain,domain:\"\nmsgid \"Domain\"\nmsgstr \"域\"\n\nmsgctxt \"field:ir.action.act_window.domain,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.action.act_window.view,act_window:\"\nmsgid \"Action\"\nmsgstr \"动作\"\n\nmsgctxt \"field:ir.action.act_window.view,view:\"\nmsgid \"View\"\nmsgstr \"视图\"\n\nmsgctxt \"field:ir.action.keyword,action:\"\nmsgid \"Action\"\nmsgstr \"动作\"\n\nmsgctxt \"field:ir.action.keyword,keyword:\"\nmsgid \"Keyword\"\nmsgstr \"关键词\"\n\nmsgctxt \"field:ir.action.keyword,model:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"field:ir.action.report,action:\"\nmsgid \"Action\"\nmsgstr \"动作\"\n\nmsgctxt \"field:ir.action.report,direct_print:\"\nmsgid \"Direct Print\"\nmsgstr \"直接打印\"\n\nmsgctxt \"field:ir.action.report,extension:\"\nmsgid \"Extension\"\nmsgstr \"扩展\"\n\nmsgctxt \"field:ir.action.report,icon:\"\nmsgid \"Icon\"\nmsgstr \"图标\"\n\nmsgctxt \"field:ir.action.report,is_custom:\"\nmsgid \"Is Custom\"\nmsgstr \"为自定义\"\n\nmsgctxt \"field:ir.action.report,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"关键词\"\n\nmsgctxt \"field:ir.action.report,model:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"field:ir.action.report,module:\"\nmsgid \"Module\"\nmsgstr \"模块\"\n\nmsgctxt \"field:ir.action.report,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,record_name:\"\nmsgid \"Record Name\"\nmsgstr \"记录名称\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,records:\"\nmsgid \"Records\"\nmsgstr \"记录 ID\"\n\nmsgctxt \"field:ir.action.report,report:\"\nmsgid \"Path\"\nmsgstr \"路径\"\n\nmsgctxt \"field:ir.action.report,report_content:\"\nmsgid \"Content\"\nmsgstr \"内容\"\n\nmsgctxt \"field:ir.action.report,report_content_custom:\"\nmsgid \"Content\"\nmsgstr \"内容\"\n\nmsgctxt \"field:ir.action.report,report_content_html:\"\nmsgid \"Content HTML\"\nmsgstr \"内容（HTML）\"\n\nmsgctxt \"field:ir.action.report,report_content_name:\"\nmsgid \"Content Name\"\nmsgstr \"内容名称\"\n\nmsgctxt \"field:ir.action.report,report_name:\"\nmsgid \"Internal Name\"\nmsgstr \"内部名称\"\n\nmsgctxt \"field:ir.action.report,single:\"\nmsgid \"Single\"\nmsgstr \"仅用于单记录\"\n\nmsgctxt \"field:ir.action.report,template_extension:\"\nmsgid \"Template Extension\"\nmsgstr \"模版扩展\"\n\nmsgctxt \"field:ir.action.report,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"可翻译\"\n\nmsgctxt \"field:ir.action.report,type:\"\nmsgid \"Type\"\nmsgstr \"类型\"\n\nmsgctxt \"field:ir.action.report,usage:\"\nmsgid \"Usage\"\nmsgstr \"用法\"\n\nmsgctxt \"field:ir.action.url,action:\"\nmsgid \"Action\"\nmsgstr \"动作\"\n\nmsgctxt \"field:ir.action.url,icon:\"\nmsgid \"Icon\"\nmsgstr \"图标\"\n\nmsgctxt \"field:ir.action.url,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"关键词\"\n\nmsgctxt \"field:ir.action.url,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,records:\"\nmsgid \"Records\"\nmsgstr \"记录 ID\"\n\nmsgctxt \"field:ir.action.url,type:\"\nmsgid \"Type\"\nmsgstr \"类型\"\n\nmsgctxt \"field:ir.action.url,url:\"\nmsgid \"Action Url\"\nmsgstr \"动作 Url\"\n\nmsgctxt \"field:ir.action.url,usage:\"\nmsgid \"Usage\"\nmsgstr \"用法\"\n\nmsgctxt \"field:ir.action.wizard,action:\"\nmsgid \"Action\"\nmsgstr \"动作\"\n\nmsgctxt \"field:ir.action.wizard,icon:\"\nmsgid \"Icon\"\nmsgstr \"图标\"\n\nmsgctxt \"field:ir.action.wizard,keywords:\"\nmsgid \"Keywords\"\nmsgstr \"关键词\"\n\nmsgctxt \"field:ir.action.wizard,model:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"field:ir.action.wizard,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,records:\"\nmsgid \"Records\"\nmsgstr \"记录 ID\"\n\nmsgctxt \"field:ir.action.wizard,type:\"\nmsgid \"Type\"\nmsgstr \"类型\"\n\nmsgctxt \"field:ir.action.wizard,usage:\"\nmsgid \"Usage\"\nmsgstr \"用法\"\n\nmsgctxt \"field:ir.action.wizard,window:\"\nmsgid \"Window\"\nmsgstr \"窗口\"\n\nmsgctxt \"field:ir.action.wizard,wiz_name:\"\nmsgid \"Wizard name\"\nmsgstr \"向导名称\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"复制到资源\"\n\nmsgctxt \"field:ir.attachment,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"复制到可见资源\"\n\nmsgctxt \"field:ir.attachment,data:\"\nmsgid \"Data\"\nmsgstr \"数据\"\n\nmsgctxt \"field:ir.attachment,data_size:\"\nmsgid \"Data size\"\nmsgstr \"数据大小\"\n\nmsgctxt \"field:ir.attachment,description:\"\nmsgid \"Description\"\nmsgstr \"描述\"\n\nmsgctxt \"field:ir.attachment,file_id:\"\nmsgid \"File ID\"\nmsgstr \"文件 ID\"\n\nmsgctxt \"field:ir.attachment,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"最后修改\"\n\nmsgctxt \"field:ir.attachment,last_user:\"\nmsgid \"Last User\"\nmsgstr \"最近使用的用户\"\n\nmsgctxt \"field:ir.attachment,link:\"\nmsgid \"Link\"\nmsgstr \"链接\"\n\nmsgctxt \"field:ir.attachment,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.attachment,resource:\"\nmsgid \"Resource\"\nmsgstr \"资源\"\n\nmsgctxt \"field:ir.attachment,summary:\"\nmsgid \"Summary\"\nmsgstr \"摘要\"\n\nmsgctxt \"field:ir.attachment,type:\"\nmsgid \"Type\"\nmsgstr \"类型\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,cache:\"\nmsgid \"Cache\"\nmsgstr \"缓存\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"复制到资源\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"复制到可见资源\"\n\nmsgctxt \"field:ir.avatar,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"最后修改\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,last_user:\"\nmsgid \"Last User\"\nmsgstr \"最近使用的用户\"\n\n#, fuzzy\nmsgctxt \"field:ir.avatar,resource:\"\nmsgid \"Resource\"\nmsgstr \"资源\"\n\nmsgctxt \"field:ir.avatar,uuid:\"\nmsgid \"UUID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,avatar:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image:\"\nmsgid \"Image\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,image_id:\"\nmsgid \"Image ID\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.avatar.cache,size:\"\nmsgid \"Size\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.cache,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.cache,timestamp:\"\nmsgid \"Timestamp\"\nmsgstr \"时间戳\"\n\nmsgctxt \"field:ir.calendar.day,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"缩写\"\n\nmsgctxt \"field:ir.calendar.day,index:\"\nmsgid \"Index\"\nmsgstr \"索引\"\n\nmsgctxt \"field:ir.calendar.day,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.calendar.month,abbreviation:\"\nmsgid \"Abbreviation\"\nmsgstr \"缩写\"\n\nmsgctxt \"field:ir.calendar.month,index:\"\nmsgid \"Index\"\nmsgstr \"索引\"\n\nmsgctxt \"field:ir.calendar.month,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.configuration,hostname:\"\nmsgid \"Hostname\"\nmsgstr \"主机名\"\n\nmsgctxt \"field:ir.configuration,language:\"\nmsgid \"language\"\nmsgstr \"语言\"\n\nmsgctxt \"field:ir.cron,day:\"\nmsgid \"Day\"\nmsgstr \"天\"\n\nmsgctxt \"field:ir.cron,hour:\"\nmsgid \"Hour\"\nmsgstr \"小时\"\n\nmsgctxt \"field:ir.cron,interval_number:\"\nmsgid \"Interval Number\"\nmsgstr \"间隔数\"\n\nmsgctxt \"field:ir.cron,interval_type:\"\nmsgid \"Interval Type\"\nmsgstr \"间隔类型\"\n\nmsgctxt \"field:ir.cron,method:\"\nmsgid \"Method\"\nmsgstr \"方法\"\n\nmsgctxt \"field:ir.cron,minute:\"\nmsgid \"Minute\"\nmsgstr \"分钟\"\n\nmsgctxt \"field:ir.cron,next_call:\"\nmsgid \"Next Call\"\nmsgstr \"下一次调用\"\n\n#, fuzzy\nmsgctxt \"field:ir.cron,timezone:\"\nmsgid \"Timezone\"\nmsgstr \"时间\"\n\nmsgctxt \"field:ir.cron,weekday:\"\nmsgid \"Day of Week\"\nmsgstr \"星期几\"\n\nmsgctxt \"field:ir.email,addresses:\"\nmsgid \"Addresses\"\nmsgstr \"地址\"\n\nmsgctxt \"field:ir.email,at:\"\nmsgid \"At\"\nmsgstr \"地址\"\n\nmsgctxt \"field:ir.email,body:\"\nmsgid \"Body\"\nmsgstr \"正文\"\n\nmsgctxt \"field:ir.email,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"收件人\"\n\nmsgctxt \"field:ir.email,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"隐藏收件人\"\n\nmsgctxt \"field:ir.email,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"次要收件人\"\n\nmsgctxt \"field:ir.email,resource:\"\nmsgid \"Resource\"\nmsgstr \"资源\"\n\nmsgctxt \"field:ir.email,subject:\"\nmsgid \"Subject\"\nmsgstr \"主题\"\n\nmsgctxt \"field:ir.email,user:\"\nmsgid \"User\"\nmsgstr \"用户\"\n\nmsgctxt \"field:ir.email.address,address:\"\nmsgid \"Address\"\nmsgstr \"地址\"\n\nmsgctxt \"field:ir.email.address,email:\"\nmsgid \"E-mail\"\nmsgstr \"电子邮箱\"\n\nmsgctxt \"field:ir.email.template,body:\"\nmsgid \"Body\"\nmsgstr \"正文\"\n\nmsgctxt \"field:ir.email.template,model:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"field:ir.email.template,model_name:\"\nmsgid \"Model Name\"\nmsgstr \"模型名称\"\n\nmsgctxt \"field:ir.email.template,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.email.template,recipients:\"\nmsgid \"Recipients\"\nmsgstr \"收件人\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"隐藏收件人\"\n\nmsgctxt \"field:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"Hidden Recipients\"\nmsgstr \"隐藏收件人\"\n\nmsgctxt \"field:ir.email.template,recipients_pyson:\"\nmsgid \"Recipients\"\nmsgstr \"收件人\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"次要收件人\"\n\nmsgctxt \"field:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"Secondary Recipients\"\nmsgstr \"次要收件人\"\n\nmsgctxt \"field:ir.email.template,reports:\"\nmsgid \"Reports\"\nmsgstr \"报告\"\n\nmsgctxt \"field:ir.email.template,subject:\"\nmsgid \"Subject\"\nmsgstr \"主题\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,report:\"\nmsgid \"Report\"\nmsgstr \"报告\"\n\nmsgctxt \"field:ir.email.template-ir.action.report,template:\"\nmsgid \"Template\"\nmsgstr \"模版\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,description:\"\nmsgid \"Description\"\nmsgstr \"描述\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,message:\"\nmsgid \"Message\"\nmsgstr \"消息\"\n\nmsgctxt \"field:ir.error,origin:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,processed_by:\"\nmsgid \"Processed by\"\nmsgstr \"创建者\"\n\nmsgctxt \"field:ir.error,solved_by:\"\nmsgid \"Solved by\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,state:\"\nmsgid \"State\"\nmsgstr \"状态\"\n\n#, fuzzy\nmsgctxt \"field:ir.error,summary:\"\nmsgid \"Summary\"\nmsgstr \"摘要\"\n\nmsgctxt \"field:ir.export,export_fields:\"\nmsgid \"Fields\"\nmsgstr \"字段\"\n\nmsgctxt \"field:ir.export,header:\"\nmsgid \"Header\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.export,resource:\"\nmsgid \"Resource\"\nmsgstr \"资源\"\n\nmsgctxt \"field:ir.export.line,export:\"\nmsgid \"Export\"\nmsgstr \"导出\"\n\nmsgctxt \"field:ir.export.line,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.lang,am:\"\nmsgid \"AM\"\nmsgstr \"上午\"\n\nmsgctxt \"field:ir.lang,code:\"\nmsgid \"Code\"\nmsgstr \"代码\"\n\nmsgctxt \"field:ir.lang,date:\"\nmsgid \"Date\"\nmsgstr \"日期\"\n\nmsgctxt \"field:ir.lang,decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"小数点\"\n\nmsgctxt \"field:ir.lang,direction:\"\nmsgid \"Direction\"\nmsgstr \"书写方向\"\n\nmsgctxt \"field:ir.lang,grouping:\"\nmsgid \"Grouping\"\nmsgstr \"分组\"\n\nmsgctxt \"field:ir.lang,mon_decimal_point:\"\nmsgid \"Decimal Separator\"\nmsgstr \"小数点\"\n\nmsgctxt \"field:ir.lang,mon_grouping:\"\nmsgid \"Grouping\"\nmsgstr \"分组\"\n\nmsgctxt \"field:ir.lang,mon_thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"千位分隔符\"\n\nmsgctxt \"field:ir.lang,n_cs_precedes:\"\nmsgid \"Negative Currency Symbol Precedes\"\nmsgstr \"负货币符号前置\"\n\nmsgctxt \"field:ir.lang,n_sep_by_space:\"\nmsgid \"Negative Separate by Space\"\nmsgstr \"负号按空格分开\"\n\nmsgctxt \"field:ir.lang,n_sign_posn:\"\nmsgid \"Negative Sign Position\"\nmsgstr \"负号位置\"\n\nmsgctxt \"field:ir.lang,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.lang,negative_sign:\"\nmsgid \"Negative Sign\"\nmsgstr \"负号\"\n\nmsgctxt \"field:ir.lang,p_cs_precedes:\"\nmsgid \"Positive Currency Symbol Precedes\"\nmsgstr \"正货币符号前置\"\n\nmsgctxt \"field:ir.lang,p_sep_by_space:\"\nmsgid \"Positive Separate by Space\"\nmsgstr \"正号按空格分开\"\n\nmsgctxt \"field:ir.lang,p_sign_posn:\"\nmsgid \"Positive Sign Position\"\nmsgstr \"正号位置\"\n\nmsgctxt \"field:ir.lang,parent:\"\nmsgid \"Parent Code\"\nmsgstr \"上级代码\"\n\nmsgctxt \"field:ir.lang,pg_text_search:\"\nmsgid \"PostgreSQL Text Search Configuration\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.lang,pm:\"\nmsgid \"PM\"\nmsgstr \"下午\"\n\nmsgctxt \"field:ir.lang,positive_sign:\"\nmsgid \"Positive Sign\"\nmsgstr \"正号\"\n\nmsgctxt \"field:ir.lang,thousands_sep:\"\nmsgid \"Thousands Separator\"\nmsgstr \"千位分隔符\"\n\nmsgctxt \"field:ir.lang,translatable:\"\nmsgid \"Translatable\"\nmsgstr \"可以翻译\"\n\nmsgctxt \"field:ir.lang.config.start,languages:\"\nmsgid \"Languages\"\nmsgstr \"语言\"\n\nmsgctxt \"field:ir.message,text:\"\nmsgid \"Text\"\nmsgstr \"文本\"\n\nmsgctxt \"field:ir.model,fields:\"\nmsgid \"Fields\"\nmsgstr \"字段\"\n\nmsgctxt \"field:ir.model,global_search_p:\"\nmsgid \"Global Search\"\nmsgstr \"全局查找\"\n\nmsgctxt \"field:ir.model,info:\"\nmsgid \"Information\"\nmsgstr \"信息\"\n\nmsgctxt \"field:ir.model,model:\"\nmsgid \"Model Name\"\nmsgstr \"模型名称\"\n\nmsgctxt \"field:ir.model,module:\"\nmsgid \"Module\"\nmsgstr \"模块\"\n\nmsgctxt \"field:ir.model,name:\"\nmsgid \"Model Description\"\nmsgstr \"模型描述\"\n\nmsgctxt \"field:ir.model.access,description:\"\nmsgid \"Description\"\nmsgstr \"描述\"\n\nmsgctxt \"field:ir.model.access,group:\"\nmsgid \"Group\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.model.access,model:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"field:ir.model.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"创建访问权限\"\n\nmsgctxt \"field:ir.model.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"删除访问权限\"\n\nmsgctxt \"field:ir.model.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"读权限\"\n\nmsgctxt \"field:ir.model.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"写权限\"\n\nmsgctxt \"field:ir.model.button,clicks:\"\nmsgid \"Clicks\"\nmsgstr \"点击\"\n\nmsgctxt \"field:ir.model.button,confirm:\"\nmsgid \"Confirm\"\nmsgstr \"确认\"\n\nmsgctxt \"field:ir.model.button,help:\"\nmsgid \"Help\"\nmsgstr \"帮助\"\n\nmsgctxt \"field:ir.model.button,model:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"field:ir.model.button,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.model.button,reset:\"\nmsgid \"Reset\"\nmsgstr \"重置\"\n\nmsgctxt \"field:ir.model.button,reset_by:\"\nmsgid \"Reset by\"\nmsgstr \"重置者\"\n\nmsgctxt \"field:ir.model.button,rules:\"\nmsgid \"Rules\"\nmsgstr \"规则\"\n\nmsgctxt \"field:ir.model.button,string:\"\nmsgid \"Label\"\nmsgstr \"标签\"\n\nmsgctxt \"field:ir.model.button-button.reset,button:\"\nmsgid \"Button\"\nmsgstr \"按钮\"\n\nmsgctxt \"field:ir.model.button-button.reset,button_ruled:\"\nmsgid \"Button Ruled\"\nmsgstr \"规则按钮\"\n\nmsgctxt \"field:ir.model.button.click,button:\"\nmsgid \"Button\"\nmsgstr \"按钮\"\n\nmsgctxt \"field:ir.model.button.click,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"记录 ID\"\n\nmsgctxt \"field:ir.model.button.rule,button:\"\nmsgid \"Button\"\nmsgstr \"按钮\"\n\nmsgctxt \"field:ir.model.button.rule,condition:\"\nmsgid \"Condition\"\nmsgstr \"条件\"\n\nmsgctxt \"field:ir.model.button.rule,description:\"\nmsgid \"Description\"\nmsgstr \"描述\"\n\nmsgctxt \"field:ir.model.button.rule,number_user:\"\nmsgid \"Number of User\"\nmsgstr \"用户数\"\n\nmsgctxt \"field:ir.model.data,db_id:\"\nmsgid \"Resource ID\"\nmsgstr \"资源 ID\"\n\nmsgctxt \"field:ir.model.data,fs_id:\"\nmsgid \"Identifier on File System\"\nmsgstr \"文件系统里的标识\"\n\nmsgctxt \"field:ir.model.data,fs_values:\"\nmsgid \"Values on File System\"\nmsgstr \"文件系统里的取值\"\n\nmsgctxt \"field:ir.model.data,model:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"field:ir.model.data,module:\"\nmsgid \"Module\"\nmsgstr \"模块\"\n\nmsgctxt \"field:ir.model.data,noupdate:\"\nmsgid \"No Update\"\nmsgstr \"不更新\"\n\nmsgctxt \"field:ir.model.data,out_of_sync:\"\nmsgid \"Out of Sync\"\nmsgstr \"未同步\"\n\nmsgctxt \"field:ir.model.data,values:\"\nmsgid \"Values\"\nmsgstr \"取值\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.field,access:\"\nmsgid \"Access\"\nmsgstr \"访问权限\"\n\nmsgctxt \"field:ir.model.field,field_description:\"\nmsgid \"Field Description\"\nmsgstr \"字段描述\"\n\nmsgctxt \"field:ir.model.field,help:\"\nmsgid \"Help\"\nmsgstr \"帮助\"\n\nmsgctxt \"field:ir.model.field,model:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"field:ir.model.field,module:\"\nmsgid \"Module\"\nmsgstr \"模块\"\n\nmsgctxt \"field:ir.model.field,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.model.field,relation:\"\nmsgid \"Model Relation\"\nmsgstr \"模型关系\"\n\nmsgctxt \"field:ir.model.field,ttype:\"\nmsgid \"Field Type\"\nmsgstr \"字段类型\"\n\nmsgctxt \"field:ir.model.field.access,description:\"\nmsgid \"Description\"\nmsgstr \"描述\"\n\nmsgctxt \"field:ir.model.field.access,field:\"\nmsgid \"Field\"\nmsgstr \"字段\"\n\nmsgctxt \"field:ir.model.field.access,group:\"\nmsgid \"Group\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.model.field.access,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"新建访问权限\"\n\nmsgctxt \"field:ir.model.field.access,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"删除访问权限\"\n\nmsgctxt \"field:ir.model.field.access,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"读权限\"\n\nmsgctxt \"field:ir.model.field.access,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"写权限\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,filter:\"\nmsgid \"Filter\"\nmsgstr \"筛选\"\n\nmsgctxt \"field:ir.model.print_model_graph.start,level:\"\nmsgid \"Level\"\nmsgstr \"层级\"\n\nmsgctxt \"field:ir.module,childs:\"\nmsgid \"Childs\"\nmsgstr \"子项\"\n\nmsgctxt \"field:ir.module,dependencies:\"\nmsgid \"Dependencies\"\nmsgstr \"依赖\"\n\nmsgctxt \"field:ir.module,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.module,parents:\"\nmsgid \"Parents\"\nmsgstr \"父级\"\n\nmsgctxt \"field:ir.module,state:\"\nmsgid \"State\"\nmsgstr \"状态\"\n\nmsgctxt \"field:ir.module,version:\"\nmsgid \"Version\"\nmsgstr \"版本\"\n\nmsgctxt \"field:ir.module.activate_upgrade.start,module_info:\"\nmsgid \"Modules to update\"\nmsgstr \"待更新模块\"\n\n#, fuzzy\nmsgctxt \"field:ir.module.config.start,modules:\"\nmsgid \"Modules\"\nmsgstr \"模块\"\n\nmsgctxt \"field:ir.module.config_wizard.item,action:\"\nmsgid \"Action\"\nmsgstr \"动作\"\n\nmsgctxt \"field:ir.module.config_wizard.item,state:\"\nmsgid \"State\"\nmsgstr \"状态\"\n\nmsgctxt \"field:ir.module.config_wizard.other,percentage:\"\nmsgid \"Percentage\"\nmsgstr \"百分比\"\n\nmsgctxt \"field:ir.module.dependency,module:\"\nmsgid \"Module\"\nmsgstr \"模块\"\n\nmsgctxt \"field:ir.module.dependency,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.module.dependency,state:\"\nmsgid \"State\"\nmsgstr \"状态\"\n\nmsgctxt \"field:ir.note,copy_to_resources:\"\nmsgid \"Copy to Resources\"\nmsgstr \"复制到资源\"\n\nmsgctxt \"field:ir.note,copy_to_resources_visible:\"\nmsgid \"Copy to Resources Visible\"\nmsgstr \"复制到可见资源\"\n\nmsgctxt \"field:ir.note,last_modification:\"\nmsgid \"Last Modification\"\nmsgstr \"上次修改\"\n\nmsgctxt \"field:ir.note,last_user:\"\nmsgid \"Last User\"\nmsgstr \"最近访问的用户\"\n\nmsgctxt \"field:ir.note,message:\"\nmsgid \"Message\"\nmsgstr \"消息\"\n\nmsgctxt \"field:ir.note,message_wrapped:\"\nmsgid \"Message\"\nmsgstr \"消息\"\n\nmsgctxt \"field:ir.note,resource:\"\nmsgid \"Resource\"\nmsgstr \"资源\"\n\nmsgctxt \"field:ir.note,unread:\"\nmsgid \"Unread\"\nmsgstr \"未读\"\n\nmsgctxt \"field:ir.note.read,note:\"\nmsgid \"Note\"\nmsgstr \"备注\"\n\nmsgctxt \"field:ir.note.read,user:\"\nmsgid \"User\"\nmsgstr \"用户\"\n\nmsgctxt \"field:ir.queue,data:\"\nmsgid \"Data\"\nmsgstr \"数据\"\n\nmsgctxt \"field:ir.queue,dequeued_at:\"\nmsgid \"Dequeued at\"\nmsgstr \"出列时间\"\n\nmsgctxt \"field:ir.queue,enqueued_at:\"\nmsgid \"Enqueued at\"\nmsgstr \"出列时间\"\n\nmsgctxt \"field:ir.queue,expected_at:\"\nmsgid \"Expected at\"\nmsgstr \"预期时间\"\n\nmsgctxt \"field:ir.queue,finished_at:\"\nmsgid \"Finished at\"\nmsgstr \"完成时间\"\n\nmsgctxt \"field:ir.queue,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.queue,scheduled_at:\"\nmsgid \"Scheduled at\"\nmsgstr \"预定时间\"\n\nmsgctxt \"field:ir.rule,domain:\"\nmsgid \"Domain\"\nmsgstr \"域\"\n\nmsgctxt \"field:ir.rule,rule_group:\"\nmsgid \"Group\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.rule.group,default_p:\"\nmsgid \"Default\"\nmsgstr \"默认\"\n\nmsgctxt \"field:ir.rule.group,global_p:\"\nmsgid \"Global\"\nmsgstr \"全局\"\n\nmsgctxt \"field:ir.rule.group,model:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"field:ir.rule.group,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.rule.group,perm_create:\"\nmsgid \"Create Access\"\nmsgstr \"创建访问权限\"\n\nmsgctxt \"field:ir.rule.group,perm_delete:\"\nmsgid \"Delete Access\"\nmsgstr \"删除访问权限\"\n\nmsgctxt \"field:ir.rule.group,perm_read:\"\nmsgid \"Read Access\"\nmsgstr \"读权限\"\n\nmsgctxt \"field:ir.rule.group,perm_write:\"\nmsgid \"Write Access\"\nmsgstr \"写权限\"\n\nmsgctxt \"field:ir.rule.group,rules:\"\nmsgid \"Tests\"\nmsgstr \"测试\"\n\nmsgctxt \"field:ir.sequence,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"上一时间戳\"\n\nmsgctxt \"field:ir.sequence,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"序列名\"\n\nmsgctxt \"field:ir.sequence,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"递增数\"\n\nmsgctxt \"field:ir.sequence,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"下一个序号\"\n\nmsgctxt \"field:ir.sequence,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"下一个序号\"\n\nmsgctxt \"field:ir.sequence,padding:\"\nmsgid \"Number padding\"\nmsgstr \"数字填充\"\n\nmsgctxt \"field:ir.sequence,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"前缀\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"序列类型\"\n\nmsgctxt \"field:ir.sequence,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"后缀\"\n\nmsgctxt \"field:ir.sequence,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"时间偏移\"\n\nmsgctxt \"field:ir.sequence,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"时间戳舍入\"\n\nmsgctxt \"field:ir.sequence,type:\"\nmsgid \"Type\"\nmsgstr \"类型\"\n\nmsgctxt \"field:ir.sequence.strict,last_timestamp:\"\nmsgid \"Last Timestamp\"\nmsgstr \"上一时间戳\"\n\nmsgctxt \"field:ir.sequence.strict,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"序列名称\"\n\nmsgctxt \"field:ir.sequence.strict,number_increment:\"\nmsgid \"Increment Number\"\nmsgstr \"递增数\"\n\nmsgctxt \"field:ir.sequence.strict,number_next:\"\nmsgid \"Next Number\"\nmsgstr \"下一个序号\"\n\nmsgctxt \"field:ir.sequence.strict,number_next_internal:\"\nmsgid \"Next Number\"\nmsgstr \"下一个序号\"\n\nmsgctxt \"field:ir.sequence.strict,padding:\"\nmsgid \"Number padding\"\nmsgstr \"数字填充\"\n\nmsgctxt \"field:ir.sequence.strict,prefix:\"\nmsgid \"Prefix\"\nmsgstr \"前缀\"\n\n#, fuzzy\nmsgctxt \"field:ir.sequence.strict,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"序列类型\"\n\nmsgctxt \"field:ir.sequence.strict,suffix:\"\nmsgid \"Suffix\"\nmsgstr \"后缀\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_offset:\"\nmsgid \"Timestamp Offset\"\nmsgstr \"时间偏移\"\n\nmsgctxt \"field:ir.sequence.strict,timestamp_rounding:\"\nmsgid \"Timestamp Rounding\"\nmsgstr \"时间戳舍入\"\n\nmsgctxt \"field:ir.sequence.strict,type:\"\nmsgid \"Type\"\nmsgstr \"类型\"\n\nmsgctxt \"field:ir.sequence.type,name:\"\nmsgid \"Sequence Name\"\nmsgstr \"序列名\"\n\nmsgctxt \"field:ir.session,key:\"\nmsgid \"Key\"\nmsgstr \"密匙\"\n\nmsgctxt \"field:ir.session.wizard,data:\"\nmsgid \"Data\"\nmsgstr \"数据\"\n\nmsgctxt \"field:ir.translation,fuzzy:\"\nmsgid \"Fuzzy\"\nmsgstr \"模糊\"\n\nmsgctxt \"field:ir.translation,lang:\"\nmsgid \"Language\"\nmsgstr \"语言\"\n\nmsgctxt \"field:ir.translation,model:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"field:ir.translation,module:\"\nmsgid \"Module\"\nmsgstr \"模块\"\n\nmsgctxt \"field:ir.translation,name:\"\nmsgid \"Field Name\"\nmsgstr \"字段名称\"\n\nmsgctxt \"field:ir.translation,overriding_module:\"\nmsgid \"Overriding Module\"\nmsgstr \"覆盖模块\"\n\nmsgctxt \"field:ir.translation,res_id:\"\nmsgid \"Resource ID\"\nmsgstr \"资源 ID\"\n\nmsgctxt \"field:ir.translation,src:\"\nmsgid \"Source\"\nmsgstr \"源\"\n\nmsgctxt \"field:ir.translation,type:\"\nmsgid \"Type\"\nmsgstr \"类型\"\n\nmsgctxt \"field:ir.translation,value:\"\nmsgid \"Translation Value\"\nmsgstr \"翻译值\"\n\nmsgctxt \"field:ir.translation.export.result,file:\"\nmsgid \"File\"\nmsgstr \"文件\"\n\nmsgctxt \"field:ir.translation.export.result,filename:\"\nmsgid \"Filename\"\nmsgstr \"文件名\"\n\nmsgctxt \"field:ir.translation.export.result,language:\"\nmsgid \"Language\"\nmsgstr \"语言\"\n\nmsgctxt \"field:ir.translation.export.result,module:\"\nmsgid \"Module\"\nmsgstr \"模块\"\n\nmsgctxt \"field:ir.translation.export.start,language:\"\nmsgid \"Language\"\nmsgstr \"语言\"\n\nmsgctxt \"field:ir.translation.export.start,module:\"\nmsgid \"Module\"\nmsgstr \"模块\"\n\nmsgctxt \"field:ir.translation.update.start,language:\"\nmsgid \"Language\"\nmsgstr \"语言\"\n\nmsgctxt \"field:ir.trigger,action:\"\nmsgid \"Action\"\nmsgstr \"操作\"\n\nmsgctxt \"field:ir.trigger,condition:\"\nmsgid \"Condition\"\nmsgstr \"条件\"\n\nmsgctxt \"field:ir.trigger,limit_number:\"\nmsgid \"Limit Number\"\nmsgstr \"数量限制\"\n\nmsgctxt \"field:ir.trigger,minimum_time_delay:\"\nmsgid \"Minimum Delay\"\nmsgstr \"最小延迟\"\n\nmsgctxt \"field:ir.trigger,model:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"field:ir.trigger,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.trigger,on_create:\"\nmsgid \"On Create\"\nmsgstr \"创建时触发\"\n\nmsgctxt \"field:ir.trigger,on_delete:\"\nmsgid \"On Delete\"\nmsgstr \"删除时触发\"\n\nmsgctxt \"field:ir.trigger,on_time:\"\nmsgid \"On Time\"\nmsgstr \"时间触发\"\n\nmsgctxt \"field:ir.trigger,on_write:\"\nmsgid \"On Write\"\nmsgstr \"写入时触发\"\n\nmsgctxt \"field:ir.trigger.log,record_id:\"\nmsgid \"Record ID\"\nmsgstr \"记录 ID\"\n\nmsgctxt \"field:ir.trigger.log,trigger:\"\nmsgid \"Trigger\"\nmsgstr \"触发器\"\n\nmsgctxt \"field:ir.ui.icon,icon:\"\nmsgid \"Icon\"\nmsgstr \"图标\"\n\nmsgctxt \"field:ir.ui.icon,module:\"\nmsgid \"Module\"\nmsgstr \"模块\"\n\nmsgctxt \"field:ir.ui.icon,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.ui.icon,path:\"\nmsgid \"SVG Path\"\nmsgstr \"SVG 路径\"\n\nmsgctxt \"field:ir.ui.menu,action:\"\nmsgid \"Action\"\nmsgstr \"动作\"\n\nmsgctxt \"field:ir.ui.menu,action_keywords:\"\nmsgid \"Action Keywords\"\nmsgstr \"动作关键词\"\n\nmsgctxt \"field:ir.ui.menu,childs:\"\nmsgid \"Children\"\nmsgstr \"子项\"\n\nmsgctxt \"field:ir.ui.menu,complete_name:\"\nmsgid \"Complete Name\"\nmsgstr \"全称\"\n\nmsgctxt \"field:ir.ui.menu,favorite:\"\nmsgid \"Favorite\"\nmsgstr \"最喜欢的\"\n\nmsgctxt \"field:ir.ui.menu,icon:\"\nmsgid \"Icon\"\nmsgstr \"图标\"\n\nmsgctxt \"field:ir.ui.menu,name:\"\nmsgid \"Menu\"\nmsgstr \"菜单\"\n\nmsgctxt \"field:ir.ui.menu,parent:\"\nmsgid \"Parent Menu\"\nmsgstr \"上一级菜单\"\n\nmsgctxt \"field:ir.ui.menu.favorite,menu:\"\nmsgid \"Menu\"\nmsgstr \"菜单\"\n\nmsgctxt \"field:ir.ui.menu.favorite,user:\"\nmsgid \"User\"\nmsgstr \"用户\"\n\nmsgctxt \"field:ir.ui.view,arch:\"\nmsgid \"View Architecture\"\nmsgstr \"视图结构\"\n\nmsgctxt \"field:ir.ui.view,data:\"\nmsgid \"Data\"\nmsgstr \"数据\"\n\nmsgctxt \"field:ir.ui.view,domain:\"\nmsgid \"Domain\"\nmsgstr \"域\"\n\nmsgctxt \"field:ir.ui.view,field_childs:\"\nmsgid \"Children Field\"\nmsgstr \"子字段\"\n\nmsgctxt \"field:ir.ui.view,inherit:\"\nmsgid \"Inherited View\"\nmsgstr \"继承的视图\"\n\nmsgctxt \"field:ir.ui.view,model:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"field:ir.ui.view,module:\"\nmsgid \"Module\"\nmsgstr \"模块\"\n\nmsgctxt \"field:ir.ui.view,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.ui.view,priority:\"\nmsgid \"Priority\"\nmsgstr \"优先级\"\n\nmsgctxt \"field:ir.ui.view,type:\"\nmsgid \"View Type\"\nmsgstr \"视图类型\"\n\nmsgctxt \"field:ir.ui.view_search,domain:\"\nmsgid \"Domain\"\nmsgstr \"域\"\n\nmsgctxt \"field:ir.ui.view_search,model:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"field:ir.ui.view_search,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:ir.ui.view_search,user:\"\nmsgid \"User\"\nmsgstr \"用户\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,field:\"\nmsgid \"Field\"\nmsgstr \"字段\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,user:\"\nmsgid \"User\"\nmsgstr \"用户\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,value:\"\nmsgid \"Value\"\nmsgstr \"取值\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.view_tree_optional,view_id:\"\nmsgid \"View ID\"\nmsgstr \"视图\"\n\nmsgctxt \"field:ir.ui.view_tree_state,child_name:\"\nmsgid \"Child Name\"\nmsgstr \"子项名称\"\n\nmsgctxt \"field:ir.ui.view_tree_state,domain:\"\nmsgid \"Domain\"\nmsgstr \"域\"\n\nmsgctxt \"field:ir.ui.view_tree_state,model:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"field:ir.ui.view_tree_state,nodes:\"\nmsgid \"Expanded Nodes\"\nmsgstr \"已展开的节点\"\n\nmsgctxt \"field:ir.ui.view_tree_state,selected_nodes:\"\nmsgid \"Selected Nodes\"\nmsgstr \"已选定的节点\"\n\nmsgctxt \"field:ir.ui.view_tree_state,user:\"\nmsgid \"User\"\nmsgstr \"用户\"\n\nmsgctxt \"field:ir.ui.view_tree_width,field:\"\nmsgid \"Field\"\nmsgstr \"字段\"\n\nmsgctxt \"field:ir.ui.view_tree_width,model:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"field:ir.ui.view_tree_width,user:\"\nmsgid \"User\"\nmsgstr \"用户\"\n\nmsgctxt \"field:ir.ui.view_tree_width,width:\"\nmsgid \"Width\"\nmsgstr \"宽度\"\n\n#, fuzzy\nmsgctxt \"help:ir.action,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"必须将此记录复制的资源.\"\n\nmsgctxt \"help:ir.action.act_window,context_domain:\"\nmsgid \"Part of the domain that will be evaluated on each refresh.\"\nmsgstr \"每次刷新都要重新执行域的某些部分.\"\n\nmsgctxt \"help:ir.action.act_window,limit:\"\nmsgid \"Default limit for the list view.\"\nmsgstr \"列表视图默认限制.\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.act_window,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"必须将此记录复制的资源.\"\n\nmsgctxt \"help:ir.action.act_window,search_value:\"\nmsgid \"Default search criteria for the list view.\"\nmsgstr \"列表视图的默认搜索条件.\"\n\nmsgctxt \"help:ir.action.report,extension:\"\nmsgid \"\"\n\"Leave empty for the same as template, see LibreOffice documentation for \"\n\"compatible format.\"\nmsgstr \"对于同一模板保留为空，有关兼容格式，请参阅LibreOffice文档.\"\n\nmsgctxt \"help:ir.action.report,record_name:\"\nmsgid \"\"\n\"A Genshi expression to compute the name using 'record'.\\n\"\n\"Leave empty for the default name.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.report,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"必须将此记录复制的资源.\"\n\nmsgctxt \"help:ir.action.report,single:\"\nmsgid \"Check if the template works only for one record.\"\nmsgstr \"检查模板是否仅适用于一条记录.\"\n\nmsgctxt \"help:ir.action.report,translatable:\"\nmsgid \"Uncheck to disable translations for this report.\"\nmsgstr \"取消此项，可以禁用报告的翻译功能.\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.url,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"必须将此记录复制的资源.\"\n\n#, fuzzy\nmsgctxt \"help:ir.action.wizard,records:\"\nmsgid \"The records on which the action runs.\"\nmsgstr \"必须将此记录复制的资源.\"\n\nmsgctxt \"help:ir.action.wizard,window:\"\nmsgid \"Run wizard in a new window.\"\nmsgstr \"在新窗口中运行向导.\"\n\nmsgctxt \"help:ir.email.template,recipients:\"\nmsgid \"The field that contains the recipient(s).\"\nmsgstr \"包含收件人的字段.\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"包含次要收件人的字段.\"\n\nmsgctxt \"help:ir.email.template,recipients_hidden_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of hidden recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"一个 PYSON 表达式，它生成一个隐藏收件人列表，其中记录由 \\\"self\\\" 表示.\"\n\nmsgctxt \"help:ir.email.template,recipients_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of recipients with the record \"\n\"represented by \\\"self\\\".\"\nmsgstr \"一个 PYSON 表达式，它生成一个收件人列表，其中记录由 \\\"self\\\" 表示.\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary:\"\nmsgid \"The field that contains the secondary recipient(s).\"\nmsgstr \"包含次要收件人的字段.\"\n\nmsgctxt \"help:ir.email.template,recipients_secondary_pyson:\"\nmsgid \"\"\n\"A PYSON expression that generates a list of secondary recipients with the \"\n\"record represented by \\\"self\\\".\"\nmsgstr \"一个 PYSON 表达式，它生成一个次要收件人列表，其中记录由 \\\"self\\\" 表示.\"\n\nmsgctxt \"help:ir.export,header:\"\nmsgid \"Check to include field names on the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,code:\"\nmsgid \"RFC 4646 tag.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.lang,parent:\"\nmsgid \"Code of the exceptional parent\"\nmsgstr \"特殊父级的代码\"\n\nmsgctxt \"help:ir.model,module:\"\nmsgid \"Module in which this model is defined.\"\nmsgstr \"定义该模型的模块.\"\n\nmsgctxt \"help:ir.model.button,confirm:\"\nmsgid \"Text to ask user confirmation when clicking the button.\"\nmsgstr \"单击按钮时询问用户确认的文本.\"\n\nmsgctxt \"help:ir.model.button,reset_by:\"\nmsgid \"Button that should reset the rules.\"\nmsgstr \"用于重置当前规则的按钮.\"\n\nmsgctxt \"help:ir.model.button.rule,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with the record represented by \\\"self\\\"\\n\"\n\"It activate the rule if true.\"\nmsgstr \"\"\n\"一个 PYSON 表达式将会和一条记录一同执行，这条记录用 “self” 表示.\\n\"\n\" 符合条件则触发该动作.\"\n\nmsgctxt \"help:ir.model.data,db_id:\"\nmsgid \"The id of the record in the database.\"\nmsgstr \"数据库中记录的 ID.\"\n\nmsgctxt \"help:ir.model.data,fs_id:\"\nmsgid \"The id of the record as known on the file system.\"\nmsgstr \"文件系统里对应记录的 ID.\"\n\nmsgctxt \"help:ir.model.field,access:\"\nmsgid \"\"\n\"If checked, the access right on the model of the field is also tested \"\n\"against the relation of the field.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.model.field,module:\"\nmsgid \"Module in which this field is defined.\"\nmsgstr \"定义该字段的模块.\"\n\nmsgctxt \"help:ir.model.print_model_graph.start,filter:\"\nmsgid \"\"\n\"Entering a Python Regular Expression will exclude matching models from the \"\n\"graph.\"\nmsgstr \"输入的 Python 正则表达式将从图中排除匹配的的模型.\"\n\nmsgctxt \"help:ir.queue,expected_at:\"\nmsgid \"When the task should be done.\"\nmsgstr \"任务完成时间.\"\n\nmsgctxt \"help:ir.queue,scheduled_at:\"\nmsgid \"When the task can start.\"\nmsgstr \"任务可以开始的时间.\"\n\n#, fuzzy\nmsgctxt \"help:ir.rule,domain:\"\nmsgid \"\"\n\"Domain is evaluated with a PYSON context containing:\\n\"\n\"- \\\"user\\\" as the current user\\n\"\n\"- \\\"groups\\\" as list of ids from the current user\"\nmsgstr \"\"\n\"域将会和一条 PYSON 表达式一同执行，这条表达式内容中包含:\\n\"\n\"- \\\"user\\\" 代表当前用户\"\n\nmsgctxt \"help:ir.rule.group,default_p:\"\nmsgid \"Add this rule to all users by default.\"\nmsgstr \"默认情况下，将此规则添加到所有用户.\"\n\nmsgctxt \"help:ir.rule.group,global_p:\"\nmsgid \"\"\n\"Make the rule global \\n\"\n\"so every users must follow this rule.\"\nmsgstr \"\"\n\"让规则全局化\\n\"\n\"所以, 每个用户都必须遵循这个规则.\"\n\nmsgctxt \"help:ir.rule.group,name:\"\nmsgid \"Displayed to users when access error is raised for this rule.\"\nmsgstr \"将此条规则导致的访问错误显示给用户.\"\n\nmsgctxt \"help:ir.rule.group,rules:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"任意一项测试结果为真，即判断符合规则.\"\n\nmsgctxt \"help:ir.trigger,condition:\"\nmsgid \"\"\n\"A PYSON statement evaluated with record represented by \\\"self\\\"\\n\"\n\"It triggers the action if true.\"\nmsgstr \"\"\n\"一个 PYSON 表达式, 这个表达式与 \\\"self\\\" 表示的记录一同执行,\\n\"\n\"如果为真，则触发该操作.\"\n\nmsgctxt \"help:ir.trigger,limit_number:\"\nmsgid \"\"\n\"Limit the number of call to \\\"Action Function\\\" by records.\\n\"\n\"0 for no limit.\"\nmsgstr \"\"\n\"限制数据调用“动作方法”次数\\n\"\n\" 0表示无限制.\"\n\nmsgctxt \"help:ir.trigger,minimum_time_delay:\"\nmsgid \"\"\n\"Set a minimum time delay between call to \\\"Action Function\\\" for the same record.\\n\"\n\"empty for no delay.\"\nmsgstr \"\"\n\"当同一条记录调用 \\\"动作函数\\\" 时, 设置两次动作之间的最小延迟时间.\\n\"\n\"留空表示不延迟.\"\n\nmsgctxt \"help:ir.ui.view_search,domain:\"\nmsgid \"The PYSON domain.\"\nmsgstr \"PYSON 域.\"\n\nmsgctxt \"model:ir.action,name:\"\nmsgid \"Action\"\nmsgstr \"动作\"\n\nmsgctxt \"model:ir.action,name:act_action_act_window_form\"\nmsgid \"Window Actions\"\nmsgstr \"窗口动作\"\n\nmsgctxt \"model:ir.action,name:act_action_form\"\nmsgid \"Actions\"\nmsgstr \"操作\"\n\nmsgctxt \"model:ir.action,name:act_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"报告\"\n\nmsgctxt \"model:ir.action,name:act_action_url_form\"\nmsgid \"URLs\"\nmsgstr \"网址\"\n\nmsgctxt \"model:ir.action,name:act_action_wizard_form\"\nmsgid \"Wizards\"\nmsgstr \"向导\"\n\nmsgctxt \"model:ir.action,name:act_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"附件\"\n\nmsgctxt \"model:ir.action,name:act_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"配置向导项\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_cron_form\"\nmsgid \"Actions\"\nmsgstr \"操作\"\n\nmsgctxt \"model:ir.action,name:act_email_form\"\nmsgid \"E-mails\"\nmsgstr \"电子邮箱\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_email_form_relate\"\nmsgid \"E-mail Archives\"\nmsgstr \"电子邮件地址\"\n\nmsgctxt \"model:ir.action,name:act_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"电子邮件模板\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_error_form\"\nmsgid \"Errors\"\nmsgstr \"错误\"\n\nmsgctxt \"model:ir.action,name:act_export_form\"\nmsgid \"Exports\"\nmsgstr \"导出\"\n\nmsgctxt \"model:ir.action,name:act_icon_form\"\nmsgid \"Icons\"\nmsgstr \"图标\"\n\nmsgctxt \"model:ir.action,name:act_lang_config\"\nmsgid \"Configure Languages\"\nmsgstr \"配置语言\"\n\nmsgctxt \"model:ir.action,name:act_lang_form\"\nmsgid \"Languages\"\nmsgstr \"语言\"\n\nmsgctxt \"model:ir.action,name:act_menu_list\"\nmsgid \"Menu\"\nmsgstr \"菜单\"\n\nmsgctxt \"model:ir.action,name:act_menu_tree\"\nmsgid \"Menu\"\nmsgstr \"菜单\"\n\nmsgctxt \"model:ir.action,name:act_message_form\"\nmsgid \"Message\"\nmsgstr \"消息\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"模型访问权限\"\n\nmsgctxt \"model:ir.action,name:act_model_access_form_relate_model\"\nmsgid \"Access\"\nmsgstr \"访问权限\"\n\nmsgctxt \"model:ir.action,name:act_model_button_click_form_relate_model_button\"\nmsgid \"Clicks\"\nmsgstr \"点击\"\n\nmsgctxt \"model:ir.action,name:act_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"按钮\"\n\nmsgctxt \"model:ir.action,name:act_model_data_form\"\nmsgid \"Data\"\nmsgstr \"数据\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"字段访问权限\"\n\nmsgctxt \"model:ir.action,name:act_model_field_access_form_relate_field\"\nmsgid \"Access\"\nmsgstr \"访问权限\"\n\nmsgctxt \"model:ir.action,name:act_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"字段\"\n\nmsgctxt \"model:ir.action,name:act_model_form\"\nmsgid \"Models\"\nmsgstr \"模型\"\n\nmsgctxt \"model:ir.action,name:act_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"挂起激活 / 升级\"\n\nmsgctxt \"model:ir.action,name:act_module_config\"\nmsgid \"Configure Modules\"\nmsgstr \"配置模块\"\n\nmsgctxt \"model:ir.action,name:act_module_config_wizard\"\nmsgid \"Module Configuration\"\nmsgstr \"模块配置\"\n\nmsgctxt \"model:ir.action,name:act_module_form\"\nmsgid \"Modules\"\nmsgstr \"模块\"\n\nmsgctxt \"model:ir.action,name:act_note_form\"\nmsgid \"Notes\"\nmsgstr \"注释\"\n\nmsgctxt \"model:ir.action,name:act_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"记录规则\"\n\nmsgctxt \"model:ir.action,name:act_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"序列\"\n\nmsgctxt \"model:ir.action,name:act_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"严格的序列\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_sequence_type_form\"\nmsgid \"Types\"\nmsgstr \"类型\"\n\nmsgctxt \"model:ir.action,name:act_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"清理翻译\"\n\nmsgctxt \"model:ir.action,name:act_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"导出翻译\"\n\nmsgctxt \"model:ir.action,name:act_translation_form\"\nmsgid \"Translations\"\nmsgstr \"翻译\"\n\nmsgctxt \"model:ir.action,name:act_translation_report\"\nmsgid \"Translations\"\nmsgstr \"翻译\"\n\nmsgctxt \"model:ir.action,name:act_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"设置翻译\"\n\nmsgctxt \"model:ir.action,name:act_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"同步翻译\"\n\nmsgctxt \"model:ir.action,name:act_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"触发器\"\n\nmsgctxt \"model:ir.action,name:act_view_form\"\nmsgid \"Views\"\nmsgstr \"视图\"\n\nmsgctxt \"model:ir.action,name:act_view_search\"\nmsgid \"View Search\"\nmsgstr \"搜索视图\"\n\nmsgctxt \"model:ir.action,name:act_view_show\"\nmsgid \"Show View\"\nmsgstr \"显示视图\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_view_tree_optional_form\"\nmsgid \"View Tree Optional\"\nmsgstr \"视图树状态\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"树状态\"\n\nmsgctxt \"model:ir.action,name:act_view_tree_width_form\"\nmsgid \"View Tree Width\"\nmsgstr \"视图树宽度\"\n\nmsgctxt \"model:ir.action,name:print_model_graph\"\nmsgid \"Graph\"\nmsgstr \"图\"\n\nmsgctxt \"model:ir.action,name:report_model_graph\"\nmsgid \"Graph\"\nmsgstr \"图\"\n\nmsgctxt \"model:ir.action,name:report_model_workflow_graph\"\nmsgid \"Workflow Graph\"\nmsgstr \"工作流程图\"\n\nmsgctxt \"model:ir.action,name:wizard_translation_report\"\nmsgid \"Translations\"\nmsgstr \"翻译\"\n\nmsgctxt \"model:ir.action.act_window,name:\"\nmsgid \"Action act window\"\nmsgstr \"动作窗口\"\n\nmsgctxt \"model:ir.action.act_window.domain,name:\"\nmsgid \"Action act window domain\"\nmsgstr \"动作窗口域\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_all\"\nmsgid \"All\"\nmsgstr \"全部\"\n\n#, fuzzy\nmsgctxt \"model:ir.action.act_window.domain,name:act_error_form_domain_open\"\nmsgid \"Open\"\nmsgstr \"打开\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_error_form_domain_processing\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_all\"\nmsgid \"All\"\nmsgstr \"全部\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_model_data_form_domain_out_of_sync\"\nmsgid \"Out of Sync\"\nmsgstr \"未同步\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_local\"\nmsgid \"Local\"\nmsgstr \"本地\"\n\nmsgctxt \"\"\n\"model:ir.action.act_window.domain,name:act_translation_form_domain_module\"\nmsgid \"Modules\"\nmsgstr \"模块\"\n\nmsgctxt \"model:ir.action.act_window.view,name:\"\nmsgid \"Action act window view\"\nmsgstr \"动作窗口视图\"\n\nmsgctxt \"model:ir.action.keyword,name:\"\nmsgid \"Action keyword\"\nmsgstr \"动作关键词\"\n\nmsgctxt \"model:ir.action.report,name:\"\nmsgid \"Action report\"\nmsgstr \"动作报表\"\n\nmsgctxt \"model:ir.action.url,name:\"\nmsgid \"Action URL\"\nmsgstr \"动作 Url\"\n\nmsgctxt \"model:ir.action.wizard,name:\"\nmsgid \"Action wizard\"\nmsgstr \"动作向导\"\n\nmsgctxt \"model:ir.attachment,name:\"\nmsgid \"Attachment\"\nmsgstr \"附件\"\n\nmsgctxt \"model:ir.avatar,name:\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.avatar.cache,name:\"\nmsgid \"Avatar Cache\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.cache,name:\"\nmsgid \"Cache\"\nmsgstr \"缓存\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Friday\"\nmsgid \"Fri\"\nmsgstr \"星期五\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Monday\"\nmsgid \"Mon\"\nmsgstr \"星期一\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Saturday\"\nmsgid \"Sat\"\nmsgstr \"星期六\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Sunday\"\nmsgid \"Sun\"\nmsgstr \"星期日\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Thursday\"\nmsgid \"Thu\"\nmsgstr \"星期四\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Tuesday\"\nmsgid \"Tue\"\nmsgstr \"星期二\"\n\nmsgctxt \"model:ir.calendar.day,abbreviation:Wednesday\"\nmsgid \"Wed\"\nmsgstr \"星期三\"\n\nmsgctxt \"model:ir.calendar.day,name:\"\nmsgid \"Day\"\nmsgstr \"日\"\n\nmsgctxt \"model:ir.calendar.day,name:Friday\"\nmsgid \"Friday\"\nmsgstr \"星期五\"\n\nmsgctxt \"model:ir.calendar.day,name:Monday\"\nmsgid \"Monday\"\nmsgstr \"星期一\"\n\nmsgctxt \"model:ir.calendar.day,name:Saturday\"\nmsgid \"Saturday\"\nmsgstr \"星期六\"\n\nmsgctxt \"model:ir.calendar.day,name:Sunday\"\nmsgid \"Sunday\"\nmsgstr \"星期日\"\n\nmsgctxt \"model:ir.calendar.day,name:Thursday\"\nmsgid \"Thursday\"\nmsgstr \"星期四\"\n\nmsgctxt \"model:ir.calendar.day,name:Tuesday\"\nmsgid \"Tuesday\"\nmsgstr \"星期二\"\n\nmsgctxt \"model:ir.calendar.day,name:Wednesday\"\nmsgid \"Wednesday\"\nmsgstr \"星期三\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:April\"\nmsgid \"Apr\"\nmsgstr \"四月\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:August\"\nmsgid \"Aug\"\nmsgstr \"八月\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:December\"\nmsgid \"Dec\"\nmsgstr \"十二月\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:February\"\nmsgid \"Feb\"\nmsgstr \"二月\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:January\"\nmsgid \"Jan\"\nmsgstr \"一月\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:July\"\nmsgid \"Jul\"\nmsgstr \"七月\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:June\"\nmsgid \"Jun\"\nmsgstr \"六月\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:March\"\nmsgid \"Mar\"\nmsgstr \"三月\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:May\"\nmsgid \"May\"\nmsgstr \"五月\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:November\"\nmsgid \"Nov\"\nmsgstr \"十一月\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:October\"\nmsgid \"Oct\"\nmsgstr \"十月\"\n\nmsgctxt \"model:ir.calendar.month,abbreviation:September\"\nmsgid \"Sep\"\nmsgstr \"九月\"\n\nmsgctxt \"model:ir.calendar.month,name:\"\nmsgid \"Month\"\nmsgstr \"月\"\n\nmsgctxt \"model:ir.calendar.month,name:April\"\nmsgid \"April\"\nmsgstr \"四月\"\n\nmsgctxt \"model:ir.calendar.month,name:August\"\nmsgid \"August\"\nmsgstr \"八月\"\n\nmsgctxt \"model:ir.calendar.month,name:December\"\nmsgid \"December\"\nmsgstr \"十二月\"\n\nmsgctxt \"model:ir.calendar.month,name:February\"\nmsgid \"February\"\nmsgstr \"二月\"\n\nmsgctxt \"model:ir.calendar.month,name:January\"\nmsgid \"January\"\nmsgstr \"一月\"\n\nmsgctxt \"model:ir.calendar.month,name:July\"\nmsgid \"July\"\nmsgstr \"七月\"\n\nmsgctxt \"model:ir.calendar.month,name:June\"\nmsgid \"June\"\nmsgstr \"六月\"\n\nmsgctxt \"model:ir.calendar.month,name:March\"\nmsgid \"March\"\nmsgstr \"三月\"\n\nmsgctxt \"model:ir.calendar.month,name:May\"\nmsgid \"May\"\nmsgstr \"五月\"\n\nmsgctxt \"model:ir.calendar.month,name:November\"\nmsgid \"November\"\nmsgstr \"十一月\"\n\nmsgctxt \"model:ir.calendar.month,name:October\"\nmsgid \"October\"\nmsgstr \"十月\"\n\nmsgctxt \"model:ir.calendar.month,name:September\"\nmsgid \"September\"\nmsgstr \"九月\"\n\nmsgctxt \"model:ir.configuration,name:\"\nmsgid \"Configuration\"\nmsgstr \"设置\"\n\nmsgctxt \"model:ir.cron,name:\"\nmsgid \"Cron\"\nmsgstr \"计划任务\"\n\nmsgctxt \"model:ir.date,name:\"\nmsgid \"Date\"\nmsgstr \"日期\"\n\nmsgctxt \"model:ir.email,name:\"\nmsgid \"Email\"\nmsgstr \"电子邮箱\"\n\nmsgctxt \"model:ir.email.address,name:\"\nmsgid \"Email Address\"\nmsgstr \"电子邮件地址\"\n\nmsgctxt \"model:ir.email.template,name:\"\nmsgid \"Email Template\"\nmsgstr \"电子邮件模板\"\n\nmsgctxt \"model:ir.email.template-ir.action.report,name:\"\nmsgid \"Email Template - Report\"\nmsgstr \"电子邮件模板 - 报告\"\n\n#, fuzzy\nmsgctxt \"model:ir.error,name:\"\nmsgid \"Error\"\nmsgstr \"错误\"\n\nmsgctxt \"model:ir.export,name:\"\nmsgid \"Export\"\nmsgstr \"导出\"\n\nmsgctxt \"model:ir.export.line,name:\"\nmsgid \"Export line\"\nmsgstr \"导出行\"\n\nmsgctxt \"model:ir.lang,name:\"\nmsgid \"Language\"\nmsgstr \"语言\"\n\nmsgctxt \"model:ir.lang,name:lang_bg\"\nmsgid \"Bulgarian\"\nmsgstr \"保加利亚语\"\n\nmsgctxt \"model:ir.lang,name:lang_ca\"\nmsgid \"Català\"\nmsgstr \"加泰罗尼亚语\"\n\nmsgctxt \"model:ir.lang,name:lang_cs\"\nmsgid \"Czech\"\nmsgstr \"捷克语\"\n\nmsgctxt \"model:ir.lang,name:lang_de\"\nmsgid \"German\"\nmsgstr \"德语\"\n\nmsgctxt \"model:ir.lang,name:lang_en\"\nmsgid \"English\"\nmsgstr \"英语\"\n\nmsgctxt \"model:ir.lang,name:lang_es\"\nmsgid \"Spanish\"\nmsgstr \"西班牙语\"\n\nmsgctxt \"model:ir.lang,name:lang_es_419\"\nmsgid \"Spanish (Latin American)\"\nmsgstr \"西班牙语(拉丁美洲)\"\n\nmsgctxt \"model:ir.lang,name:lang_et\"\nmsgid \"Estonian\"\nmsgstr \"爱沙尼亚语\"\n\nmsgctxt \"model:ir.lang,name:lang_fa\"\nmsgid \"Persian\"\nmsgstr \"波斯语\"\n\nmsgctxt \"model:ir.lang,name:lang_fi\"\nmsgid \"Finnish\"\nmsgstr \"芬兰语\"\n\nmsgctxt \"model:ir.lang,name:lang_fr\"\nmsgid \"French\"\nmsgstr \"法语\"\n\nmsgctxt \"model:ir.lang,name:lang_hu\"\nmsgid \"Hungarian\"\nmsgstr \"匈牙利语\"\n\nmsgctxt \"model:ir.lang,name:lang_id\"\nmsgid \"Indonesian\"\nmsgstr \"印度尼西亚语\"\n\nmsgctxt \"model:ir.lang,name:lang_it\"\nmsgid \"Italian\"\nmsgstr \"意大利语\"\n\nmsgctxt \"model:ir.lang,name:lang_lo\"\nmsgid \"Lao\"\nmsgstr \"老挝语\"\n\nmsgctxt \"model:ir.lang,name:lang_lt\"\nmsgid \"Lithuanian\"\nmsgstr \"立陶宛语\"\n\nmsgctxt \"model:ir.lang,name:lang_nl\"\nmsgid \"Dutch\"\nmsgstr \"荷兰语\"\n\nmsgctxt \"model:ir.lang,name:lang_pl\"\nmsgid \"Polish\"\nmsgstr \"波兰语\"\n\nmsgctxt \"model:ir.lang,name:lang_pt\"\nmsgid \"Portuguese\"\nmsgstr \"葡萄牙语\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang,name:lang_ro\"\nmsgid \"Romanian\"\nmsgstr \"爱沙尼亚语\"\n\nmsgctxt \"model:ir.lang,name:lang_ru\"\nmsgid \"Russian\"\nmsgstr \"俄语\"\n\nmsgctxt \"model:ir.lang,name:lang_sl\"\nmsgid \"Slovenian\"\nmsgstr \"斯洛文尼亚语\"\n\nmsgctxt \"model:ir.lang,name:lang_tr\"\nmsgid \"Turkish\"\nmsgstr \"土耳其语\"\n\nmsgctxt \"model:ir.lang,name:lang_zh_CN\"\nmsgid \"Chinese Simplified\"\nmsgstr \"中文简体\"\n\n#, fuzzy\nmsgctxt \"model:ir.lang.config.start,name:\"\nmsgid \"Configure languages\"\nmsgstr \"配置语言\"\n\nmsgctxt \"model:ir.message,name:\"\nmsgid \"Message\"\nmsgstr \"消息\"\n\nmsgctxt \"model:ir.message,text:msg_ID\"\nmsgid \"ID\"\nmsgstr \"ID\"\n\nmsgctxt \"model:ir.message,text:msg_access_button_error\"\nmsgid \"Calling button \\\"%(button)s on \\\"%(model)s\\\" is not allowed.\"\nmsgstr \"不允许在 \\\"%(model)s\\\" 上点击按钮 \\\"%(button)s.\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_error\"\nmsgid \"You are not allowed to access \\\"%(model)s\\\".\"\nmsgstr \"没有访问 \\\"%(model)s\\\" 的权限.\"\n\nmsgctxt \"model:ir.message,text:msg_access_rule_field_error\"\nmsgid \"You are not allowed to access \\\"%(model)s.%(field)s\\\".\"\nmsgstr \"没有访问 \\\"%(model)s.%(field)s\\\" 的权限.\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\".\"\nmsgstr \"没有运行向导程序 \\\"%(wizard)s\\\" 的权限.\"\n\nmsgctxt \"model:ir.message,text:msg_access_wizard_model_error\"\nmsgid \"You are not allowed to execute wizard \\\"%(wizard)s\\\" on \\\"%(model)s\\\".\"\nmsgstr \"没有权限在 \\\"%(model)s\\\" 上运行向导程序 \\\"%(wizard)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_context\"\nmsgid \"Invalid context \\\"%(context)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"动作 \\\"%(action)s\\\" 的内容 \\\"%(context)s\\\" 设置无效.\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"动作 \\\"%(action)s\\\" 的域或找条件 \\\"%(domain)s\\\" 无效.\"\n\nmsgctxt \"model:ir.message,text:msg_action_invalid_views\"\nmsgid \"Invalid view \\\"%(view)s\\\" for action \\\"%(action)s\\\".\"\nmsgstr \"动作\\\"%(action)s\\\" 的视图 \\\"%(view)s\\\" 无效.\"\n\nmsgctxt \"model:ir.message,text:msg_action_wrong_wizard_model\"\nmsgid \"Wrong wizard model in keyword action \\\"%(name)s\\\".\"\nmsgstr \"关键字操作 \\\"%(name)s\\\" 的向导模型有误.\"\n\nmsgctxt \"model:ir.message,text:msg_active\"\nmsgid \"Active\"\nmsgstr \"启用\"\n\nmsgctxt \"model:ir.message,text:msg_active_help\"\nmsgid \"Uncheck to exclude from future use.\"\nmsgstr \"如果以后不使用，就取消选择.\"\n\nmsgctxt \"model:ir.message,text:msg_attachments\"\nmsgid \"Attachments\"\nmsgstr \"附件\"\n\nmsgctxt \"model:ir.message,text:msg_avatar\"\nmsgid \"Avatar\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_resource_unique\"\nmsgid \"Only one avatar is allowed per resource.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_avatar_size_unique\"\nmsgid \"The size of an avatar must be unique.\"\nmsgstr \"模块名称必须唯一！\"\n\nmsgctxt \"model:ir.message,text:msg_avatar_url\"\nmsgid \"Avatar URL\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_avatars\"\nmsgid \"Avatars\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_base_config_record\"\nmsgid \"This record is part of the base configuration.\"\nmsgstr \"该记录是基本配置的一部分。\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_button_name_unique\"\nmsgid \"The name of the button must be unique per model.\"\nmsgstr \"模块名称必须唯一！\"\n\nmsgctxt \"model:ir.message,text:msg_create_rule_error\"\nmsgid \"\"\n\"You are not allowed to create records of \\\"%(model)s\\\" because they fail on at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"不允许创建\\\"%(model)s\\\"的记录，因为在以下规则中，至少有一条不满足：\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_created_at\"\nmsgid \"Created at\"\nmsgstr \"创建日期\"\n\nmsgctxt \"model:ir.message,text:msg_created_by\"\nmsgid \"Created by\"\nmsgstr \"创建者\"\n\nmsgctxt \"model:ir.message,text:msg_delete_rule_error\"\nmsgid \"\"\n\"You are not allowed to delete records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at lease one of those rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"不允许删除模型 \\\"%(model)s\\\" 的记录 \\\"%(ids)s\\\" ， 由于下面的规则（至少一条）:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_delete_xml_record\"\nmsgid \"You are not allowed to delete this record.\"\nmsgstr \"没有权限删除此记录.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_no\"\nmsgid \"No\"\nmsgstr \"十一月\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_boolean\"\nmsgid \"Boolean\"\nmsgstr \"布尔型\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_char\"\nmsgid \"Char\"\nmsgstr \"字符型\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_date\"\nmsgid \"Date\"\nmsgstr \"日期\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_datetime\"\nmsgid \"DateTime\"\nmsgstr \"日期时间\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_digits\"\nmsgid \"Digits\"\nmsgstr \"数字\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_domain\"\nmsgid \"Domain\"\nmsgstr \"域\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_float\"\nmsgid \"Float\"\nmsgstr \"浮点型\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_help\"\nmsgid \"Help\"\nmsgstr \"帮助\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection\"\nmsgid \"Help Selection\"\nmsgstr \"选择\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_help\"\nmsgid \"The key followed by the help text separated by a \\\":\\\", one per line.\"\nmsgstr \"每行用 \\\":\\\" 分隔的一些键和标签.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_help_selection_json\"\nmsgid \"Help Selection JSON\"\nmsgstr \"选择 JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_integer\"\nmsgid \"Integer\"\nmsgstr \"整型\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_domain\"\nmsgid \"Invalid domain in schema \\\"%(schema)s\\\".\"\nmsgstr \"模式 \\\"%(schema)s\\\" 中的域无效.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_help_selection\"\nmsgid \"Invalid help selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"模式\\\"%(schema)s\\\"中的选择无效.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_invalid_selection\"\nmsgid \"Invalid selection in schema \\\"%(schema)s\\\".\"\nmsgstr \"模式\\\"%(schema)s\\\"中的选择无效.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_multiselection\"\nmsgid \"MultiSelection\"\nmsgstr \"多选\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_name\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_numeric\"\nmsgid \"Numeric\"\nmsgstr \"数值型\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection\"\nmsgid \"Selection\"\nmsgstr \"选择\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_help\"\nmsgid \"A couple of key and label separated by \\\":\\\" per line.\"\nmsgstr \"每行用 \\\":\\\" 分隔的一些键和标签.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_json\"\nmsgid \"Selection JSON\"\nmsgstr \"选择 JSON\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted\"\nmsgid \"Selection Sorted\"\nmsgstr \"选择（已排序）\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_selection_sorted_help\"\nmsgid \"If the selection must be sorted on label.\"\nmsgstr \"如果所选内容必须按标签排序.\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_string\"\nmsgid \"String\"\nmsgstr \"字符串\"\n\nmsgctxt \"model:ir.message,text:msg_dict_schema_type\"\nmsgid \"Type\"\nmsgstr \"类型\"\n\nmsgctxt \"model:ir.message,text:msg_dict_yes\"\nmsgid \"Yes\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_digits_validation_record\"\nmsgid \"\"\n\"The number of digits in the value \\\"%(value)r\\\" for field \\\"%(field)s\\\" in \"\n\"\\\"%(record)s\\\" of \\\"%(model)s\\\" exceeds the limit of \\\"%(digits)i\\\".\"\nmsgstr \"模型 \\\"%(model)s\\\" 的字段 \\\"%(field)s\\\", 其数字取值 \\\"%(value)s\\\" 的位数超出了 \\\"%(digits)i\\\" 的限制.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_domain_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid according to its domain.\"\nmsgstr \"模型 \\\"%(model)s\\\" 的字段 \\\"%(field)s\\\"，其取值\\\"%(value)s\\\" 对于其域来说，是无效取值.\"\n\nmsgctxt \"model:ir.message,text:msg_edited_at\"\nmsgid \"Edited at\"\nmsgstr \"编辑时间\"\n\nmsgctxt \"model:ir.message,text:msg_edited_by\"\nmsgid \"Edited by\"\nmsgstr \"编辑者\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_body\"\nmsgid \"\"\n\"Invalid body in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"电子邮件模板 \\\"%(template)s\\\" 中的正文无效，异常为 \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson\"\nmsgid \"\"\n\"Invalid PYSON %(field)s in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"电子邮件模板 \\\"%(template)s\\\" 中的 PYSON %(field)s无效，异常为 \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_field_pyson_type\"\nmsgid \"\"\n\"The PYSON %(field)s in e-mail template \\\"%(template)s\\\" must generate a \"\n\"list.\"\nmsgstr \"电子邮件模板 \\\"%(template)s\\\" 中的 PYSON %(field)s 必须生成一个列表.\"\n\nmsgctxt \"model:ir.message,text:msg_email_template_invalid_subject\"\nmsgid \"\"\n\"Invalid subject in e-mail template \\\"%(template)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"电子邮件模板 \\\"%(template)s\\\" 中的主题无效，异常为 \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_field_model_name\"\nmsgid \"%(field)s (model name)\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_field_string\"\nmsgid \"%(field)s (string)\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_forbidden_char_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" contains some invalid chars \\\"%(chars)s\\\".\"\nmsgstr \"\\\"%(model)s\\\" 中字段 \\\"%(field)s\\\" 的值 \\\"%(value)s\\\" 包含一些无效字符 \\\"%(chars)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_exist\"\nmsgid \"\"\n\"The records could not be deleted because they are used by field \"\n\"\\\"%(field)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"记录无法删除，因为 \\\"%(model)s\\\" 的字段 \\\"%(field)s\\\" 正在使用此记录.\"\n\nmsgctxt \"model:ir.message,text:msg_foreign_model_missing\"\nmsgid \"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" does not exist.\"\nmsgstr \"模型 \\\"%(model)s\\\" 的字段 \\\"%(field)s\\\" 对应的取值 \\\"%(value)s\\\" 不存在.\"\n\nmsgctxt \"model:ir.message,text:msg_html_editor_save_fail\"\nmsgid \"Failed to save, please retry.\"\nmsgstr \"保存失败，请重试。\"\n\nmsgctxt \"model:ir.message,text:msg_id_positive\"\nmsgid \"ID must be positive.\"\nmsgstr \"ID 必须为正.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_code_unique\"\nmsgid \"The code on language must be unique.\"\nmsgstr \"模型必须唯一！\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_default_translatable\"\nmsgid \"The default language \\\"%(language)s\\\" must be translatable.\"\nmsgstr \"默认语言必须设置为可翻译.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_language_delete_default\"\nmsgid \"The default language \\\"%(language)s\\\" can not be deleted.\"\nmsgstr \"默认语言不可删除.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_date\"\nmsgid \"Invalid date format \\\"%(format)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"语言\\\"%(language)s\\\"中的日期格式 \\\"%(format)s\\\"设置无效.\"\n\nmsgctxt \"model:ir.message,text:msg_language_invalid_grouping\"\nmsgid \"Invalid grouping \\\"%(grouping)s\\\" for language \\\"%(language)s\\\".\"\nmsgstr \"语言\\\"%(language)s\\\"中的分组 \\\"%(grouping)s\\\"设置无效.\"\n\nmsgctxt \"model:ir.message,text:msg_model_invalid_condition\"\nmsgid \"\"\n\"The condition \\\"%(condition)s\\\" is not a valid PYSON expression for button \"\n\"rule \\\"%(rule)s\\\".\"\nmsgstr \"对按钮规则\\\"%(rule)s\\\"来说，条件\\\"%(condition)s\\\" 不是合法的 PYSON 表达式.\"\n\nmsgctxt \"model:ir.message,text:msg_module_deactivate_dependency\"\nmsgid \"\"\n\"Some activated modules depend on the ones you are trying to deactivate:\"\nmsgstr \"某些已激活的模块依赖准备卸载的模块:\"\n\nmsgctxt \"model:ir.message,text:msg_module_delete_state\"\nmsgid \"\"\n\"You can not remove a module that is activated or that is about to be \"\n\"activated.\"\nmsgstr \"无法移除未安装或者待安装状态的模块.\"\n\nmsgctxt \"model:ir.message,text:msg_notes\"\nmsgid \"Notes\"\nmsgstr \"注释\"\n\nmsgctxt \"model:ir.message,text:msg_read_error\"\nmsgid \"\"\n\"You are trying to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't exist\"\n\" anymore.\"\nmsgstr \"\\\"%(model)s\\\" 的记录 \\\"%(ids)s\\\" 已经不存在了，无法读取.\"\n\nmsgctxt \"model:ir.message,text:msg_read_rule_error\"\nmsgid \"\"\n\"You are not allowed to read records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"不允许读取模型 \\\"%(model)s\\\" 的记录 \\\"%(ids)s\\\" ， 由于下面的规则（至少一条）:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_record_name\"\nmsgid \"Record Name\"\nmsgstr \"记录名称\"\n\nmsgctxt \"model:ir.message,text:msg_recursion_error\"\nmsgid \"\"\n\"Recursion error: Record \\\"%(rec_name)s\\\" with parent \\\"%(parent_rec_name)s\\\"\"\n\" was configured as ancestor of itself.\"\nmsgstr \"递归错误：记录 \\\"%(rec_name)s\\\"和父项\\\"%(parent_rec_name)s\\\" 已配置为其自身的祖先.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_reference_syntax_error\"\nmsgid \"\"\n\"Syntax error for reference: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"\\\"%(field)s\\\" 的取值 \\\"%(value)r\\\" 有语法错误.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_relation_not_found\"\nmsgid \"Relation not found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"找不到关系: 模型 \\\"%(model)s\\\" 中的 \\\"%(value)r\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_report_invalid_email\"\nmsgid \"Invalid email definition for report \\\"%(name)s\\\".\"\nmsgstr \"报表 \\\"%(name)s\\\" 的电子邮件定义无效.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_report_invalid_record_name\"\nmsgid \"\"\n\"Invalid record name definition for report \\\"%(report)s\\\" with exception \"\n\"\\\"%(exception)s\\\".\"\nmsgstr \"电子邮件模板 \\\"%(template)s\\\" 中的正文无效，异常为 \\\"%(exception)s\\\".\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"模型\\\"%(model)s\\\"的字段\\\"%(field)s\\\"需要有取值.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_required_validation_record\"\nmsgid \"A value is required for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \\\"%(model)s\\\".\"\nmsgstr \"模型\\\"%(model)s\\\"的字段\\\"%(field)s\\\"需要有取值.\"\n\nmsgctxt \"model:ir.message,text:msg_resource_copy_help\"\nmsgid \"The resources to which this record must be copied.\"\nmsgstr \"必须将此记录复制的资源.\"\n\nmsgctxt \"model:ir.message,text:msg_rule_invalid_domain\"\nmsgid \"Invalid domain in rule \\\"%(name)s\\\".\"\nmsgstr \"规则\\\"%(name)s\\\"的域配置无效.\"\n\nmsgctxt \"model:ir.message,text:msg_search_function_missing\"\nmsgid \"Missing search function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"模型 \\\"%(model)s\\\" 的字段 \\\"%(field)s\\\" 缺少搜索函数.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_selection_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not one of the allowed options.\"\nmsgstr \"模型 \\\"%(model)s\\\" 的字段 \\\"%(field)s\\\"，其取值\\\"%(value)s\\\" 不在允许的选项范围内.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence\"\nmsgid \"Sequence\"\nmsgstr \"序列\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_change_sequence_type\"\nmsgid \"\"\n\"You cannot change the sequence type of a sequence instead create a new \"\n\"sequence.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_number_increment_next\"\nmsgid \"\"\n\"Invalid \\\"Increment Number\\\" (%(number_increment)s) or \\\"Next Number\\\" \"\n\"(%(number_next)s) with exception \\\"%(exception)s\\\".\"\nmsgstr \"电子邮件模板 \\\"%(template)s\\\" 中的正文无效，异常为 \\\"%(exception)s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_prefix\"\nmsgid \"Invalid prefix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"序列 \\\"%(sequence)s\\\"前缀\\\"%(prefix)s\\\"无效.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_invalid_suffix\"\nmsgid \"Invalid suffix \\\"%(affix)s\\\" for sequence \\\"%(sequence)s\\\".\"\nmsgstr \"序列 \\\"%(sequence)s\\\"后缀\\\"%(suffix)s\\\"无效.\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_last_timestamp_future\"\nmsgid \"The \\\"Last Timestamp\\\" cannot be in the future for sequence \\\"%s\\\".\"\nmsgstr \"\\\"最近一个时间戳\\\"不能超过序列\\\"%s\\\".\"\n\nmsgctxt \"model:ir.message,text:msg_sequence_missing\"\nmsgid \"Missing sequence.\"\nmsgstr \"序列缺失.\"\n\nmsgctxt \"model:ir.message,text:msg_setter_function_missing\"\nmsgid \"Missing setter function for field \\\"%(field)s\\\" in \\\"%(model)s\\\".\"\nmsgstr \"模型 \\\"%(model)s\\\" 的字段\\\"%(field)s\\\" 没有 setter 函数.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(model)s\\\" is too long\"\n\" (%(size)i > %(max_size)i).\"\nmsgstr \"模型 \\\"%(model)s\\\" 的字段 \\\"%(field)s\\\" ，其取值位数太长(%(size)i > %(max_size)i).\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_size_validation_record\"\nmsgid \"\"\n\"The value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is too long (%(size)i > %(max_size)i).\"\nmsgstr \"模型 \\\"%(model)s\\\" 的字段 \\\"%(field)s\\\" ，其取值位数太长(%(size)i > %(max_size)i).\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_time_format_validation_record\"\nmsgid \"\"\n\"The time value \\\"%(value)s\\\" for field \\\"%(field)s\\\" in \\\"%(record)s\\\" of \"\n\"\\\"%(model)s\\\" is not valid.\"\nmsgstr \"模型 \\\"%(model)s\\\" 的字段\\\"%(field)s\\\"，时间取值 \\\"%(value)s\\\" 无效.\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_M\"\nmsgid \"M\"\nmsgstr \"月\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_Y\"\nmsgid \"Y\"\nmsgstr \"年\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_d\"\nmsgid \"d\"\nmsgstr \"日\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_h\"\nmsgid \"h\"\nmsgstr \"小时\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_m\"\nmsgid \"m\"\nmsgstr \"分钟\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_s\"\nmsgid \"s\"\nmsgstr \"秒\"\n\nmsgctxt \"model:ir.message,text:msg_timedelta_w\"\nmsgid \"w\"\nmsgstr \"周\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_too_many_relations_found\"\nmsgid \"Too many relations found: %(value)r in \\\"%(model)s\\\" (%(column)s).\"\nmsgstr \"发现太多的关系：\\\"%(value)r\\\" in \\\"%(model)s”.\"\n\nmsgctxt \"model:ir.message,text:msg_translation_overridden\"\nmsgid \"\"\n\"You can not export translation \\\"%(name)s\\\" because it has been overridden \"\n\"by module \\\"%(overriding_module)s\\\".\"\nmsgstr \"无法导出翻译 “%(name)s”，因为它已被模块“%(overriding_module)s”覆盖.\"\n\nmsgctxt \"model:ir.message,text:msg_trigger_invalid_condition\"\nmsgid \"\"\n\"Condition \\\"%(condition)s\\\" is not a valid PYSON expression for trigger \"\n\"\\\"%(trigger)s\\\".\"\nmsgstr \"触发器\\\"%(trigger)s\\\"设置的条件\\\"%(condition)s\\\" 不是合法的 PYSON 表达式.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_value_syntax_error\"\nmsgid \"\"\n\"Syntax error for value: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"XML id 语法错误：\\\"%(field)s\\\" 的取值 \\\"%(value)r\\\" .\"\n\nmsgctxt \"model:ir.message,text:msg_view_invalid_xml\"\nmsgid \"Invalid XML for view \\\"%(name)s\\\".\"\nmsgstr \"视图 \\\"%(name)s\\\" 对应的XML不合法.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_view_search_invalid_domain\"\nmsgid \"Invalid domain or search criteria \\\"%(domain)s\\\" for search \\\"%(search)s\\\".\"\nmsgstr \"动作 \\\"%(action)s\\\" 的域或找条件 \\\"%(domain)s\\\" 无效.\"\n\nmsgctxt \"model:ir.message,text:msg_write_error\"\nmsgid \"\"\n\"You are trying to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" that don't \"\n\"exist anymore.\"\nmsgstr \"\\\"%(model)s\\\" 的记录 \\\"%(ids)s\\\" 已经不存在了，无法写入.\"\n\nmsgctxt \"model:ir.message,text:msg_write_rule_error\"\nmsgid \"\"\n\"You are not allowed to write to records \\\"%(ids)s\\\" of \\\"%(model)s\\\" because of at least one of these rules:\\n\"\n\"%(rules)s\"\nmsgstr \"\"\n\"不允许写入模型 \\\"%(model)s\\\" 的记录 \\\"%(ids)s\\\" ， 由于下面的规则（至少一条）:\\n\"\n\"%(rules)s\"\n\nmsgctxt \"model:ir.message,text:msg_write_xml_record\"\nmsgid \"You are not allowed to modify this record.\"\nmsgstr \"你无权修改此记录.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_xml_id_syntax_error\"\nmsgid \"\"\n\"Syntax error for XML id: %(value)r in \\\"%(field)s\\\" of \\\"%(model)s\\\" \"\n\"(%(column)s).\"\nmsgstr \"XML id 语法错误：\\\"%(field)s\\\" 的取值 \\\"%(value)r\\\" .\"\n\nmsgctxt \"model:ir.model,name:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"model:ir.model.access,name:\"\nmsgid \"Model access\"\nmsgstr \"模型访问权限\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_load_translations_button\"\nmsgid \"Are you sure you want to load languages' translations?\"\nmsgstr \"确定要加载语言翻译?\"\n\nmsgctxt \"model:ir.model.button,confirm:lang_unload_translations_button\"\nmsgid \"Are you sure you want to remove languages' translations?\"\nmsgstr \"确定要删除语言翻译？\"\n\nmsgctxt \"model:ir.model.button,name:\"\nmsgid \"Model Button\"\nmsgstr \"模型按钮\"\n\nmsgctxt \"model:ir.model.button,string:cron_run_once_button\"\nmsgid \"Run Once\"\nmsgstr \"仅运行一次\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_open_button\"\nmsgid \"Open\"\nmsgstr \"打开\"\n\n#, fuzzy\nmsgctxt \"model:ir.model.button,string:error_process_button\"\nmsgid \"Process\"\nmsgstr \"访问权限\"\n\nmsgctxt \"model:ir.model.button,string:error_solve_button\"\nmsgid \"Solve\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:lang_load_translations_button\"\nmsgid \"Load translations\"\nmsgstr \"加载翻译\"\n\nmsgctxt \"model:ir.model.button,string:lang_unload_translations_button\"\nmsgid \"Unload translations\"\nmsgstr \"卸载翻译\"\n\nmsgctxt \"model:ir.model.button,string:model_data_sync_button\"\nmsgid \"Sync\"\nmsgstr \"同步\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_button\"\nmsgid \"Mark for Activation\"\nmsgstr \"标记为激活\"\n\nmsgctxt \"model:ir.model.button,string:module_activate_cancel_button\"\nmsgid \"Cancel Activation\"\nmsgstr \"取消激活\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_button\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"标记为停用（测试版）\"\n\nmsgctxt \"model:ir.model.button,string:module_deactivate_cancel_button\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"取消停用\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_button\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"标记为升级\"\n\nmsgctxt \"model:ir.model.button,string:module_upgrade_cancel_button\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"取消升级\"\n\nmsgctxt \"model:ir.model.button,string:view_show_button\"\nmsgid \"Show\"\nmsgstr \"显示\"\n\nmsgctxt \"model:ir.model.button-button.reset,name:\"\nmsgid \"Model Button Reset\"\nmsgstr \"模型按钮重置\"\n\nmsgctxt \"model:ir.model.button.click,name:\"\nmsgid \"Model Button Click\"\nmsgstr \"模型按钮点击\"\n\nmsgctxt \"model:ir.model.button.rule,name:\"\nmsgid \"Model Button Rule\"\nmsgstr \"模型按钮规则\"\n\nmsgctxt \"model:ir.model.data,name:\"\nmsgid \"Model data\"\nmsgstr \"模型数据\"\n\nmsgctxt \"model:ir.model.field,name:\"\nmsgid \"Model field\"\nmsgstr \"模型字段\"\n\nmsgctxt \"model:ir.model.field.access,name:\"\nmsgid \"Model Field Access\"\nmsgstr \"模型字段权限\"\n\nmsgctxt \"model:ir.model.print_model_graph.start,name:\"\nmsgid \"Print Model Graph\"\nmsgstr \"打印模型图\"\n\nmsgctxt \"model:ir.module,name:\"\nmsgid \"Module\"\nmsgstr \"模块\"\n\nmsgctxt \"model:ir.module.activate_upgrade.done,name:\"\nmsgid \"Module Activate Upgrade Done\"\nmsgstr \"模块安装升级完成\"\n\nmsgctxt \"model:ir.module.activate_upgrade.start,name:\"\nmsgid \"Module Activate Upgrade Start\"\nmsgstr \"模块安装升级开始\"\n\n#, fuzzy\nmsgctxt \"model:ir.module.config.start,name:\"\nmsgid \"Configure Modules\"\nmsgstr \"配置模块\"\n\nmsgctxt \"model:ir.module.config_wizard.done,name:\"\nmsgid \"Module Config Wizard Done\"\nmsgstr \"模块设置向导完成\"\n\nmsgctxt \"model:ir.module.config_wizard.first,name:\"\nmsgid \"Module Config Wizard First\"\nmsgstr \"模块设置向导开始\"\n\nmsgctxt \"model:ir.module.config_wizard.item,name:\"\nmsgid \"Config wizard to run after activating a module\"\nmsgstr \"激活模块后运行的配置向导\"\n\nmsgctxt \"model:ir.module.config_wizard.other,name:\"\nmsgid \"Module Config Wizard Other\"\nmsgstr \"模块设置向导其他\"\n\nmsgctxt \"model:ir.module.dependency,name:\"\nmsgid \"Module dependency\"\nmsgstr \"模块依赖关系\"\n\nmsgctxt \"model:ir.note,name:\"\nmsgid \"Note\"\nmsgstr \"注释\"\n\nmsgctxt \"model:ir.note.read,name:\"\nmsgid \"Note Read\"\nmsgstr \"注释阅读\"\n\nmsgctxt \"model:ir.queue,name:\"\nmsgid \"Queue\"\nmsgstr \"队列\"\n\nmsgctxt \"model:ir.rule,name:\"\nmsgid \"Rule\"\nmsgstr \"规则\"\n\nmsgctxt \"model:ir.rule.group,name:\"\nmsgid \"Rule group\"\nmsgstr \"规则组\"\n\nmsgctxt \"model:ir.sequence,name:\"\nmsgid \"Sequence\"\nmsgstr \"序列\"\n\nmsgctxt \"model:ir.sequence.strict,name:\"\nmsgid \"Sequence Strict\"\nmsgstr \"严格序列\"\n\nmsgctxt \"model:ir.sequence.type,name:\"\nmsgid \"Sequence type\"\nmsgstr \"序列类型\"\n\nmsgctxt \"model:ir.session,name:\"\nmsgid \"Session\"\nmsgstr \"会话\"\n\nmsgctxt \"model:ir.session.wizard,name:\"\nmsgid \"Session Wizard\"\nmsgstr \"Session 设置向导\"\n\nmsgctxt \"model:ir.translation,name:\"\nmsgid \"Translation\"\nmsgstr \"翻译\"\n\nmsgctxt \"model:ir.translation.clean.start,name:\"\nmsgid \"Clean translation\"\nmsgstr \"清理翻译\"\n\nmsgctxt \"model:ir.translation.clean.succeed,name:\"\nmsgid \"Clean translation\"\nmsgstr \"清理翻译\"\n\nmsgctxt \"model:ir.translation.export.result,name:\"\nmsgid \"Export translation\"\nmsgstr \"导出翻译\"\n\nmsgctxt \"model:ir.translation.export.start,name:\"\nmsgid \"Export translation\"\nmsgstr \"导出翻译\"\n\nmsgctxt \"model:ir.translation.set.start,name:\"\nmsgid \"Set Translation\"\nmsgstr \"设置翻译\"\n\nmsgctxt \"model:ir.translation.set.succeed,name:\"\nmsgid \"Set Translation\"\nmsgstr \"设置翻译\"\n\nmsgctxt \"model:ir.translation.update.start,name:\"\nmsgid \"Update translation\"\nmsgstr \"更新翻译\"\n\nmsgctxt \"model:ir.trigger,name:\"\nmsgid \"Trigger\"\nmsgstr \"触发器\"\n\nmsgctxt \"model:ir.trigger.log,name:\"\nmsgid \"Trigger Log\"\nmsgstr \"触发器日志\"\n\nmsgctxt \"model:ir.ui.icon,name:\"\nmsgid \"Icon\"\nmsgstr \"图标\"\n\nmsgctxt \"model:ir.ui.menu,name:\"\nmsgid \"UI menu\"\nmsgstr \"UI 菜单\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_act_action\"\nmsgid \"Actions\"\nmsgstr \"动作\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action\"\nmsgid \"Actions\"\nmsgstr \"动作\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_act_window\"\nmsgid \"Window Actions\"\nmsgstr \"窗口动作\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_report_form\"\nmsgid \"Reports\"\nmsgstr \"报告\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_url\"\nmsgid \"URLs\"\nmsgstr \"网址\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_action_wizard\"\nmsgid \"Wizards\"\nmsgstr \"向导\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_administration\"\nmsgid \"Administration\"\nmsgstr \"管理\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_attachment_form\"\nmsgid \"Attachments\"\nmsgstr \"附件\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_config_wizard_item_form\"\nmsgid \"Config Wizard Items\"\nmsgstr \"配置向导项\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_cron_form\"\nmsgid \"Actions\"\nmsgstr \"操作\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_form\"\nmsgid \"E-mails\"\nmsgstr \"电子邮箱\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_email_template_form\"\nmsgid \"E-mail Templates\"\nmsgstr \"电子邮件模板\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_error_form\"\nmsgid \"Errors\"\nmsgstr \"错误\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_export_form\"\nmsgid \"Exports\"\nmsgstr \"导出\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_icon_form\"\nmsgid \"Icons\"\nmsgstr \"图标\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_ir_sequence_type\"\nmsgid \"Types\"\nmsgstr \"类型\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_lang_form\"\nmsgid \"Languages\"\nmsgstr \"语言\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_localization\"\nmsgid \"Localization\"\nmsgstr \"本地化\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_menu_list\"\nmsgid \"Menu\"\nmsgstr \"菜单\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_message_form\"\nmsgid \"Message\"\nmsgstr \"消息\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_access_form\"\nmsgid \"Models Access\"\nmsgstr \"模型访问权限\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_button_form\"\nmsgid \"Buttons\"\nmsgstr \"按钮\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_data_form\"\nmsgid \"Data\"\nmsgstr \"数据\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_field_access_form\"\nmsgid \"Fields Access\"\nmsgstr \"字段访问权限\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_model_form\"\nmsgid \"Models\"\nmsgstr \"模型\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_models\"\nmsgid \"Models\"\nmsgstr \"模型\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_activate_upgrade\"\nmsgid \"Perform Pending Activation/Upgrade\"\nmsgstr \"执行 \\\"未完成的安装\\\"/ \\\"升级\\\"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_module_form\"\nmsgid \"Modules\"\nmsgstr \"模块\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_modules\"\nmsgid \"Modules\"\nmsgstr \"模块\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_note_form\"\nmsgid \"Notes\"\nmsgstr \"注释\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_rule_group_form\"\nmsgid \"Record Rules\"\nmsgstr \"记录规则\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_scheduler\"\nmsgid \"Scheduler\"\nmsgstr \"调度器\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_form\"\nmsgid \"Sequences\"\nmsgstr \"序列\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequence_strict_form\"\nmsgid \"Sequences Strict\"\nmsgstr \"严格序列\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_sequences\"\nmsgid \"Sequences\"\nmsgstr \"序列\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_clean\"\nmsgid \"Clean Translations\"\nmsgstr \"清理翻译\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_export\"\nmsgid \"Export Translations\"\nmsgstr \"导出翻译\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_form\"\nmsgid \"Translations\"\nmsgstr \"翻译\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_set\"\nmsgid \"Set Translations\"\nmsgstr \"设置翻译\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_translation_update\"\nmsgid \"Synchronize Translations\"\nmsgstr \"同步翻译\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_trigger_form\"\nmsgid \"Triggers\"\nmsgstr \"触发器\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_ui\"\nmsgid \"User Interface\"\nmsgstr \"用户界面\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view\"\nmsgid \"Views\"\nmsgstr \"视图\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_search\"\nmsgid \"View Search\"\nmsgstr \"搜索视图\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_optional\"\nmsgid \"View Tree Optional\"\nmsgstr \"视图树状态\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_state\"\nmsgid \"Tree State\"\nmsgstr \"树状态\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_view_tree_width\"\nmsgid \"View Tree Width\"\nmsgstr \"视图树宽度\"\n\nmsgctxt \"model:ir.ui.menu,name:model_model_fields_form\"\nmsgid \"Fields\"\nmsgstr \"字段\"\n\nmsgctxt \"model:ir.ui.menu.favorite,name:\"\nmsgid \"Menu Favorite\"\nmsgstr \"最喜欢的菜单\"\n\nmsgctxt \"model:ir.ui.view,name:\"\nmsgid \"View\"\nmsgstr \"视图\"\n\nmsgctxt \"model:ir.ui.view.show.start,name:\"\nmsgid \"Show view\"\nmsgstr \"显示视图\"\n\nmsgctxt \"model:ir.ui.view_search,name:\"\nmsgid \"View Search\"\nmsgstr \"搜索视图\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.view_tree_optional,name:\"\nmsgid \"View Tree Optional\"\nmsgstr \"视图树状态\"\n\nmsgctxt \"model:ir.ui.view_tree_state,name:\"\nmsgid \"View Tree State\"\nmsgstr \"视图树状态\"\n\nmsgctxt \"model:ir.ui.view_tree_width,name:\"\nmsgid \"View Tree Width\"\nmsgstr \"视图树宽度\"\n\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action,records:\"\nmsgid \"Selected\"\nmsgstr \"已选定的节点\"\n\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.act_window,records:\"\nmsgid \"Selected\"\nmsgstr \"已选定的节点\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Action form\"\nmsgstr \"动作表单\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Form relate\"\nmsgstr \"关联表单\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open Graph\"\nmsgstr \"打开表单\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Open tree\"\nmsgstr \"打开树形列表\"\n\nmsgctxt \"selection:ir.action.keyword,keyword:\"\nmsgid \"Print form\"\nmsgstr \"打印表单\"\n\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.report,records:\"\nmsgid \"Selected\"\nmsgstr \"已选定的节点\"\n\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.url,records:\"\nmsgid \"Selected\"\nmsgstr \"已选定的节点\"\n\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Listed\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.action.wizard,records:\"\nmsgid \"Selected\"\nmsgstr \"已选定的节点\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Data\"\nmsgstr \"数据\"\n\nmsgctxt \"selection:ir.attachment,type:\"\nmsgid \"Link\"\nmsgstr \"链接\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Days\"\nmsgstr \"日\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Hours\"\nmsgstr \"小时\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Minutes\"\nmsgstr \"分钟\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Months\"\nmsgstr \"月\"\n\nmsgctxt \"selection:ir.cron,interval_type:\"\nmsgid \"Weeks\"\nmsgstr \"周\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Errors\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Clean Task Queue\"\nmsgstr \"清空任务队列\"\n\nmsgctxt \"selection:ir.cron,method:\"\nmsgid \"Run On Time Triggers\"\nmsgstr \"运行基于时间的触发器\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Action\"\nmsgstr \"操作\"\n\nmsgctxt \"selection:ir.error,origin:\"\nmsgid \"Task\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Open\"\nmsgstr \"打开\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Processing\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.error,state:\"\nmsgid \"Solved\"\nmsgstr \"\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Left-to-right\"\nmsgstr \"从左向右\"\n\nmsgctxt \"selection:ir.lang,direction:\"\nmsgid \"Right-to-left\"\nmsgstr \"从右向左\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Activated\"\nmsgstr \"已启用\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"Not Activated\"\nmsgstr \"没有激活\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be activated\"\nmsgstr \"待启用\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be removed\"\nmsgstr \"待删除\"\n\nmsgctxt \"selection:ir.module,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"待升级\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Done\"\nmsgstr \"完成\"\n\nmsgctxt \"selection:ir.module.config_wizard.item,state:\"\nmsgid \"Open\"\nmsgstr \"打开\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Activated\"\nmsgstr \"已启用\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Not Activated\"\nmsgstr \"未启用\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be activated\"\nmsgstr \"待启用\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be removed\"\nmsgstr \"待删除\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"To be upgraded\"\nmsgstr \"待升级\"\n\nmsgctxt \"selection:ir.module.dependency,state:\"\nmsgid \"Unknown\"\nmsgstr \"未知\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"十进制时间戳\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"十六进制时间戳\"\n\nmsgctxt \"selection:ir.sequence,type:\"\nmsgid \"Incremental\"\nmsgstr \"升序\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Decimal Timestamp\"\nmsgstr \"十进制时间戳\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Hexadecimal Timestamp\"\nmsgstr \"十六进制时间戳\"\n\nmsgctxt \"selection:ir.sequence.strict,type:\"\nmsgid \"Incremental\"\nmsgstr \"升序\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Field\"\nmsgstr \"字段\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Help\"\nmsgstr \"帮助\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Model\"\nmsgstr \"模型\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Report\"\nmsgstr \"报告\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Selection\"\nmsgstr \"选择\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"View\"\nmsgstr \"视图\"\n\nmsgctxt \"selection:ir.translation,type:\"\nmsgid \"Wizard Button\"\nmsgstr \"向导按钮\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Board\"\nmsgstr \"面板\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Calendar\"\nmsgstr \"日历\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Form\"\nmsgstr \"表单\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Graph\"\nmsgstr \"图\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"List Form\"\nmsgstr \"清单表格\"\n\nmsgctxt \"selection:ir.ui.view,type:\"\nmsgid \"Tree\"\nmsgstr \"树\"\n\nmsgctxt \"view:ir.action.act_window:\"\nmsgid \"General\"\nmsgstr \"常规\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"Edit\"\nmsgstr \"编辑\"\n\nmsgctxt \"view:ir.action.report:\"\nmsgid \"General\"\nmsgstr \"常规\"\n\nmsgctxt \"view:ir.action.url:\"\nmsgid \"General\"\nmsgstr \"常规\"\n\nmsgctxt \"view:ir.action.wizard:\"\nmsgid \"General\"\nmsgstr \"常规\"\n\nmsgctxt \"view:ir.action:\"\nmsgid \"General\"\nmsgstr \"常规\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Document\"\nmsgstr \"\"\n\nmsgctxt \"view:ir.attachment:\"\nmsgid \"Last Modification Time\"\nmsgstr \"最近更改时间\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"At\"\nmsgstr \"在\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Every\"\nmsgstr \"每\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Date\"\nmsgstr \"下一次调用\"\n\n#, fuzzy\nmsgctxt \"view:ir.cron:\"\nmsgid \"Next Call Time\"\nmsgstr \"下一次调用\"\n\nmsgctxt \"view:ir.cron:\"\nmsgid \"Run Once\"\nmsgstr \"仅运行一次\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Hidden Recipients:\"\nmsgstr \"隐藏收件人:\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Recipients:\"\nmsgstr \"收件人:\"\n\nmsgctxt \"view:ir.email.template:\"\nmsgid \"Secondary Recipients:\"\nmsgstr \"次要收件人:\"\n\nmsgctxt \"view:ir.error:\"\nmsgid \"Origin\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:ir.lang.config.start:\"\nmsgid \"You can now load additional translations to the system.\"\nmsgstr \"现在你可以将其他翻译加载到系统中.\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Date Formatting\"\nmsgstr \"日期格式\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Monetary Formatting\"\nmsgstr \"货币格式\"\n\nmsgctxt \"view:ir.lang:\"\nmsgid \"Numbers Formatting\"\nmsgstr \"数字格式\"\n\nmsgctxt \"view:ir.module.activate_upgrade.done:\"\nmsgid \"The modules have been upgraded / activated.\"\nmsgstr \"模块已升级/激活.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Note that this operation may take a few minutes.\"\nmsgstr \"注意：本操作可能需要几分钟时间.\"\n\nmsgctxt \"view:ir.module.activate_upgrade.start:\"\nmsgid \"Your system will be upgraded.\"\nmsgstr \"系统将要升级.\"\n\n#, fuzzy\nmsgctxt \"view:ir.module.config.start:\"\nmsgid \"You can now activate additional modules to the system.\"\nmsgstr \"现在你可以将其他翻译加载到系统中.\"\n\nmsgctxt \"view:ir.module.config_wizard.done:\"\nmsgid \"The configuration is done.\"\nmsgstr \"设置完成.\"\n\nmsgctxt \"view:ir.module.config_wizard.first:\"\nmsgid \"\"\n\"You will be able to configure your installation depending on the modules you\"\n\" have installed.\"\nmsgstr \"您将可以根据已安装的模块配置安装.\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Activation\"\nmsgstr \"取消激活\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Deactivation\"\nmsgstr \"取消 “取消激活” 操作\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Cancel Upgrade\"\nmsgstr \"取消升级\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Activation\"\nmsgstr \"标记为激活\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Deactivation (beta)\"\nmsgstr \"标记为停用（测试版）\"\n\nmsgctxt \"view:ir.module:\"\nmsgid \"Mark for Upgrade\"\nmsgstr \"标记为升级\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Date\"\nmsgstr \"日期\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"Time\"\nmsgstr \"时间\"\n\nmsgctxt \"view:ir.note:\"\nmsgid \"User\"\nmsgstr \"用户\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"\"\n\"If there is no test defined, the rule is always satisfied if not global.\"\nmsgstr \"如果没有定义测试，只要不是全局的，则始终满足规则.\"\n\nmsgctxt \"view:ir.rule.group:\"\nmsgid \"The rule is satisfied if at least one test is True.\"\nmsgstr \"任意一项测试结果为真，即判断符合规则.\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${day}\"\nmsgstr \"${day}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${month}\"\nmsgstr \"${month}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"${year}\"\nmsgstr \"${year}\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Day:\"\nmsgstr \"天：\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Incremental\"\nmsgstr \"升序\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Legend (Placeholders for prefix, suffix)\"\nmsgstr \"前缀、后缀占位符\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Month:\"\nmsgstr \"月份：\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Timestamp\"\nmsgstr \"时间戳\"\n\nmsgctxt \"view:ir.sequence:\"\nmsgid \"Year:\"\nmsgstr \"年：\"\n\nmsgctxt \"view:ir.translation.clean.start:\"\nmsgid \"Clean Translations?\"\nmsgstr \"清理翻译 ?\"\n\nmsgctxt \"view:ir.translation.clean.succeed:\"\nmsgid \"Translations cleaned successfully.\"\nmsgstr \"翻译已成功清理.\"\n\nmsgctxt \"view:ir.translation.set.start:\"\nmsgid \"Synchronize Translations?\"\nmsgstr \"需要同步翻译吗？\"\n\nmsgctxt \"view:ir.translation.set.succeed:\"\nmsgid \"Translations set successfully.\"\nmsgstr \"翻译设置成功.\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\nmsgctxt \"wizard_button:ir.lang.config,start,load:\"\nmsgid \"Load\"\nmsgstr \"加载\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\nmsgctxt \"wizard_button:ir.model.print_model_graph,start,print_:\"\nmsgid \"Print\"\nmsgstr \"打印\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.activate_upgrade,done,next_:\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\nmsgctxt \"wizard_button:ir.module.activate_upgrade,start,upgrade:\"\nmsgid \"Start Upgrade\"\nmsgstr \"开始升级\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,activate:\"\nmsgid \"Activate\"\nmsgstr \"已启用\"\n\n#, fuzzy\nmsgctxt \"wizard_button:ir.module.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,done,end:\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,action:\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,first,end:\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,action:\"\nmsgid \"Next\"\nmsgstr \"下一步\"\n\nmsgctxt \"wizard_button:ir.module.config_wizard,other,end:\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,clean:\"\nmsgid \"Clean\"\nmsgstr \"清理\"\n\nmsgctxt \"wizard_button:ir.translation.clean,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\nmsgctxt \"wizard_button:ir.translation.clean,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\nmsgctxt \"wizard_button:ir.translation.export,result,end:\"\nmsgid \"Close\"\nmsgstr \"关闭\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\nmsgctxt \"wizard_button:ir.translation.export,start,export:\"\nmsgid \"Export\"\nmsgstr \"导出\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\nmsgctxt \"wizard_button:ir.translation.set,start,set_:\"\nmsgid \"Set\"\nmsgstr \"设置\"\n\nmsgctxt \"wizard_button:ir.translation.set,succeed,end:\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\nmsgctxt \"wizard_button:ir.translation.update,start,update:\"\nmsgid \"Update\"\nmsgstr \"更新\"\n\nmsgctxt \"wizard_button:ir.ui.view.show,start,end:\"\nmsgid \"Close\"\nmsgstr \"关闭\"\n"
  },
  {
    "path": "trytond/ir/message.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.cache import Cache\nfrom trytond.model import ModelSQL, ModelView, fields\nfrom trytond.pool import Pool\nfrom trytond.transaction import Transaction\n\n\nclass Message(ModelSQL, ModelView):\n    \"Message\"\n    __name__ = \"ir.message\"\n\n    _message_cache = Cache('ir.message', size_limit=10240, context=False)\n    text = fields.Text(\"Text\", required=True, translate=True)\n\n    @classmethod\n    def gettext(cls, *args, **variables):\n        pool = Pool()\n        ModelData = pool.get('ir.model.data')\n        module, message_id, language = args\n\n        key = (module, message_id, language)\n        text = cls._message_cache.get(key)\n        if text is None:\n            message_id = ModelData.get_id(module, message_id)\n            with Transaction().set_context(language=language):\n                message = cls(message_id)\n\n            text = message.text\n            cls._message_cache.set(key, text)\n        return text if not variables else text % variables\n\n    @classmethod\n    def write(cls, messages, values, *args):\n        super(Message, cls).write(messages, values, *args)\n        cls._message_cache.clear()\n\n    @classmethod\n    def delete(cls, messages):\n        super(Message, cls).delete(messages)\n        cls._message_cache.clear()\n\n    @classmethod\n    def search_rec_name(cls, name, clause):\n        return [('text',) + tuple(clause[1:])]\n"
  },
  {
    "path": "trytond/ir/message.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <record model=\"ir.ui.view\" id=\"message_view_tree\">\n            <field name=\"model\">ir.message</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">message_list</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"message_view_form\">\n            <field name=\"model\">ir.message</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">message_form</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_message_form\">\n            <field name=\"name\">Message</field>\n            <field name=\"res_model\">ir.message</field>\n        </record>\n        <record model=\"ir.action.act_window.view\" id=\"act_message_form_view1\">\n            <field name=\"view\" ref=\"message_view_tree\"/>\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"act_window\" ref=\"act_message_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\" id=\"act_message_form_view2\">\n            <field name=\"view\" ref=\"message_view_form\"/>\n            <field name=\"sequence\" eval=\"20\"/>\n            <field name=\"act_window\" ref=\"act_message_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_localization\"\n            action=\"act_message_form\"\n            sequence=\"20\"\n            id=\"menu_message_form\"/>\n    </data>\n    <data grouped=\"1\">\n        <record model=\"ir.message\" id=\"msg_ID\">\n            <field name=\"text\">ID</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_created_by\">\n            <field name=\"text\">Created by</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_created_at\">\n            <field name=\"text\">Created at</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_edited_by\">\n            <field name=\"text\">Edited by</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_edited_at\">\n            <field name=\"text\">Edited at</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_record_name\">\n            <field name=\"text\">Record Name</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_active\">\n            <field name=\"text\">Active</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_active_help\">\n            <field name=\"text\">Uncheck to exclude from future use.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_name\">\n            <field name=\"text\">Name</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_string\">\n            <field name=\"text\">String</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_help\">\n            <field name=\"text\">Help</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_type\">\n            <field name=\"text\">Type</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_boolean\">\n            <field name=\"text\">Boolean</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_integer\">\n            <field name=\"text\">Integer</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_char\">\n            <field name=\"text\">Char</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_float\">\n            <field name=\"text\">Float</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_numeric\">\n            <field name=\"text\">Numeric</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_date\">\n            <field name=\"text\">Date</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_datetime\">\n            <field name=\"text\">DateTime</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_selection\">\n            <field name=\"text\">Selection</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_multiselection\">\n            <field name=\"text\">MultiSelection</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_digits\">\n            <field name=\"text\">Digits</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_domain\">\n            <field name=\"text\">Domain</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_selection_help\">\n            <field name=\"text\">A couple of key and label separated by \":\" per line.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_selection_sorted\">\n            <field name=\"text\">Selection Sorted</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_selection_sorted_help\">\n            <field name=\"text\">If the selection must be sorted on label.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_help_selection\">\n            <field name=\"text\">Help Selection</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_help_selection_help\">\n            <field name=\"text\">The key followed by the help text separated by a \":\", one per line.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_selection_json\">\n            <field name=\"text\">Selection JSON</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_help_selection_json\">\n            <field name=\"text\">Help Selection JSON</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_yes\">\n            <field name=\"text\">Yes</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_no\">\n            <field name=\"text\">No</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_sequence\">\n            <field name=\"text\">Sequence</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_id_positive\">\n            <field name=\"text\">ID must be positive.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_write_xml_record\">\n            <field name=\"text\">You are not allowed to modify this record.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_delete_xml_record\">\n            <field name=\"text\">You are not allowed to delete this record.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_base_config_record\">\n            <field name=\"text\">This record is part of the base configuration.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_relation_not_found\">\n            <field name=\"text\">Relation not found: %(value)r in \"%(model)s\" (%(column)s).</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_too_many_relations_found\">\n            <field name=\"text\">Too many relations found: %(value)r in \"%(model)s\" (%(column)s).</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_value_syntax_error\">\n            <field name=\"text\">Syntax error for value: %(value)r in \"%(field)s\" of \"%(model)s\" (%(column)s).</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_reference_syntax_error\">\n            <field name=\"text\">Syntax error for reference: %(value)r in \"%(field)s\" of \"%(model)s\" (%(column)s).</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_xml_id_syntax_error\">\n            <field name=\"text\">Syntax error for XML id: %(value)r in \"%(field)s\" of \"%(model)s\" (%(column)s).</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_domain_validation_record\">\n            <field name=\"text\">The value \"%(value)s\" for field \"%(field)s\" in \"%(record)s\" of \"%(model)s\" is not valid according to its domain.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_required_validation\">\n            <field name=\"text\">A value is required for field \"%(field)s\" in \"%(model)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_required_validation_record\">\n            <field name=\"text\">A value is required for field \"%(field)s\" in \"%(record)s\" of \"%(model)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_size_validation\">\n            <field name=\"text\">The value \"%(value)s\" for field \"%(field)s\" in \"%(model)s\" is too long (%(size)i > %(max_size)i).</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_size_validation_record\">\n            <field name=\"text\">The value \"%(value)s\" for field \"%(field)s\" in \"%(record)s\" of \"%(model)s\" is too long (%(size)i > %(max_size)i).</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_digits_validation_record\">\n            <field name=\"text\">The number of digits in the value \"%(value)r\" for field \"%(field)s\" in \"%(record)s\" of \"%(model)s\" exceeds the limit of \"%(digits)i\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_forbidden_char_validation_record\">\n            <field name=\"text\">The value \"%(value)s\" for field \"%(field)s\" in \"%(record)s\" of \"%(model)s\" contains some invalid chars \"%(chars)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_selection_validation_record\">\n            <field name=\"text\">The value \"%(value)s\" for field \"%(field)s\" in \"%(record)s\" of \"%(model)s\" is not one of the allowed options.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_time_format_validation_record\">\n            <field name=\"text\">The time value \"%(value)s\" for field \"%(field)s\" in \"%(record)s\" of \"%(model)s\" is not valid.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_foreign_model_missing\">\n            <field name=\"text\">The value \"%(value)s\" for field \"%(field)s\" in \"%(model)s\" does not exist.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_foreign_model_exist\">\n            <field name=\"text\">The records could not be deleted because they are used by field \"%(field)s\" of \"%(model)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_access_rule_error\">\n            <field name=\"text\">You are not allowed to access \"%(model)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_access_rule_field_error\">\n            <field name=\"text\">You are not allowed to access \"%(model)s.%(field)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_create_rule_error\">\n            <field name=\"text\">You are not allowed to create records of \"%(model)s\" because they fail on at least one of these rules:\n%(rules)s</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_read_rule_error\">\n            <field name=\"text\">You are not allowed to read records \"%(ids)s\" of \"%(model)s\" because of at least one of these rules:\n%(rules)s</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_read_error\">\n            <field name=\"text\">You are trying to read records \"%(ids)s\" of \"%(model)s\" that don't exist anymore.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_write_rule_error\">\n            <field name=\"text\">You are not allowed to write to records \"%(ids)s\" of \"%(model)s\" because of at least one of these rules:\n%(rules)s</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_write_error\">\n            <field name=\"text\">You are trying to write to records \"%(ids)s\" of \"%(model)s\" that don't exist anymore.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_delete_rule_error\">\n            <field name=\"text\">You are not allowed to delete records \"%(ids)s\" of \"%(model)s\" because of at lease one of those rules:\n%(rules)s</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_invalid_domain\">\n            <field name=\"text\">Invalid domain in schema \"%(schema)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_invalid_selection\">\n            <field name=\"text\">Invalid selection in schema \"%(schema)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_dict_schema_invalid_help_selection\">\n            <field name=\"text\">Invalid help selection in schema \"%(schema)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_recursion_error\">\n            <field name=\"text\">Recursion error: Record \"%(rec_name)s\" with parent \"%(parent_rec_name)s\" was configured as ancestor of itself.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_search_function_missing\">\n            <field name=\"text\">Missing search function for field \"%(field)s\" in \"%(model)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_setter_function_missing\">\n            <field name=\"text\">Missing setter function for field \"%(field)s\" in \"%(model)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_access_button_error\">\n            <field name=\"text\">Calling button \"%(button)s on \"%(model)s\" is not allowed.</field>\n        </record>\n\n        <record model=\"ir.message\" id=\"msg_view_invalid_xml\">\n            <field name=\"text\">Invalid XML for view \"%(name)s\".</field>\n        </record>\n\n        <record model=\"ir.message\" id=\"msg_action_wrong_wizard_model\">\n            <field name=\"text\">Wrong wizard model in keyword action \"%(name)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_report_invalid_email\">\n            <field name=\"text\">Invalid email definition for report \"%(name)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_report_invalid_record_name\">\n            <field name=\"text\">Invalid record name definition for report \"%(report)s\" with exception \"%(exception)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_action_invalid_views\">\n            <field name=\"text\">Invalid view \"%(view)s\" for action \"%(action)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_action_invalid_domain\">\n            <field name=\"text\">Invalid domain or search criteria \"%(domain)s\" for action \"%(action)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_action_invalid_context\">\n            <field name=\"text\">Invalid context \"%(context)s\" for action \"%(action)s\".</field>\n        </record>\n\n        <record model=\"ir.message\" id=\"msg_model_invalid_condition\">\n            <field name=\"text\">The condition \"%(condition)s\" is not a valid PYSON expression for button rule \"%(rule)s\".</field>\n        </record>\n\n        <record model=\"ir.message\" id=\"msg_sequence_missing\">\n            <field name=\"text\">Missing sequence.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_sequence_invalid_prefix\">\n            <field name=\"text\">Invalid prefix \"%(affix)s\" for sequence \"%(sequence)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_sequence_invalid_suffix\">\n            <field name=\"text\">Invalid suffix \"%(affix)s\" for sequence \"%(sequence)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_sequence_last_timestamp_future\">\n            <field name=\"text\">The \"Last Timestamp\" cannot be in the future for sequence \"%s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_sequence_change_sequence_type\">\n            <field name=\"text\">You cannot change the sequence type of a sequence instead create a new sequence.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_sequence_invalid_number_increment_next\">\n            <field name=\"text\">Invalid \"Increment Number\" (%(number_increment)s) or \"Next Number\" (%(number_next)s) with exception \"%(exception)s\".</field>\n        </record>\n\n        <record model=\"ir.message\" id=\"msg_language_invalid_grouping\">\n            <field name=\"text\">Invalid grouping \"%(grouping)s\" for language \"%(language)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_language_invalid_date\">\n            <field name=\"text\">Invalid date format \"%(format)s\" for language \"%(language)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_language_default_translatable\">\n            <field name=\"text\">The default language \"%(language)s\" must be translatable.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_language_delete_default\">\n            <field name=\"text\">The default language \"%(language)s\" can not be deleted.</field>\n        </record>\n\n        <record model=\"ir.message\" id=\"msg_rule_invalid_domain\">\n            <field name=\"text\">Invalid domain in rule \"%(name)s\".</field>\n        </record>\n\n        <record model=\"ir.message\" id=\"msg_translation_overridden\">\n            <field name=\"text\">You can not export translation \"%(name)s\" because it has been overridden by module \"%(overriding_module)s\".</field>\n        </record>\n\n\n        <record model=\"ir.message\" id=\"msg_module_delete_state\">\n            <field name=\"text\">You can not remove a module that is activated or that is about to be activated.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_module_deactivate_dependency\">\n            <field name=\"text\">Some activated modules depend on the ones you are trying to deactivate:</field>\n        </record>\n\n        <record model=\"ir.message\" id=\"msg_trigger_invalid_condition\">\n            <field name=\"text\">Condition \"%(condition)s\" is not a valid PYSON expression for trigger \"%(trigger)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_html_editor_save_fail\">\n            <field name=\"text\">Failed to save, please retry.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_timedelta_Y\">\n            <field name=\"text\">Y</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_timedelta_M\">\n            <field name=\"text\">M</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_timedelta_w\">\n            <field name=\"text\">w</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_timedelta_d\">\n            <field name=\"text\">d</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_timedelta_h\">\n            <field name=\"text\">h</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_timedelta_m\">\n            <field name=\"text\">m</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_timedelta_s\">\n            <field name=\"text\">s</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_resource_copy_help\">\n            <field name=\"text\">The resources to which this record must be copied.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_attachments\">\n            <field name=\"text\">Attachments</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_notes\">\n            <field name=\"text\">Notes</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_access_wizard_error\">\n            <field name=\"text\">You are not allowed to execute wizard \"%(wizard)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_access_wizard_model_error\">\n            <field name=\"text\">You are not allowed to execute wizard \"%(wizard)s\" on \"%(model)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_email_template_invalid_subject\">\n            <field name=\"text\">Invalid subject in e-mail template \"%(template)s\" with exception \"%(exception)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_email_template_invalid_body\">\n            <field name=\"text\">Invalid body in e-mail template \"%(template)s\" with exception \"%(exception)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_email_template_invalid_field_pyson\">\n            <field name=\"text\">Invalid PYSON %(field)s in e-mail template \"%(template)s\" with exception \"%(exception)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_email_template_invalid_field_pyson_type\">\n            <field name=\"text\">The PYSON %(field)s in e-mail template \"%(template)s\" must generate a list.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_avatar_resource_unique\">\n            <field name=\"text\">Only one avatar is allowed per resource.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_avatar_size_unique\">\n            <field name=\"text\">The size of an avatar must be unique.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_avatar\">\n            <field name=\"text\">Avatar</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_avatars\">\n            <field name=\"text\">Avatars</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_avatar_url\">\n            <field name=\"text\">Avatar URL</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_language_code_unique\">\n            <field name=\"text\">The code on language must be unique.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_button_name_unique\">\n            <field name=\"text\">The name of the button must be unique per model.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_view_search_invalid_domain\">\n            <field name=\"text\">Invalid domain or search criteria \"%(domain)s\" for search \"%(search)s\".</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_field_string\">\n            <field name=\"text\">%(field)s (string)</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_field_model_name\">\n            <field name=\"text\">%(field)s (model name)</field>\n        </record>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/model.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport heapq\nimport json\nimport logging\nimport re\nfrom collections import defaultdict\nfrom itertools import groupby\n\nfrom sql import Literal, Null\nfrom sql.aggregate import Max\nfrom sql.conditionals import Case\nfrom sql.operators import Equal\n\nfrom trytond.cache import Cache\nfrom trytond.i18n import gettext\nfrom trytond.model import (\n    DeactivableMixin, EvalEnvironment, Exclude, Index, ModelSingleton,\n    ModelSQL, ModelView, Unique, Workflow, fields)\nfrom trytond.model.exceptions import AccessError, ValidationError\nfrom trytond.pool import Pool\nfrom trytond.protocols.jsonrpc import JSONDecoder, JSONEncoder\nfrom trytond.pyson import Bool, Eval, PYSONDecoder\nfrom trytond.report import Report\nfrom trytond.rpc import RPC\nfrom trytond.tools import cursor_dict, grouped_slice, is_instance_method\nfrom trytond.tools.string_ import StringMatcher\nfrom trytond.transaction import Transaction\nfrom trytond.wizard import Button, StateAction, StateView, Wizard\n\nlogger = logging.getLogger(__name__)\n\n\nclass ConditionError(ValidationError):\n    pass\n\n\nclass Model(ModelSQL, ModelView):\n    \"Model\"\n    __name__ = 'ir.model'\n    _order_name = 'model'\n    name = fields.Char('Model Description', translate=True, loading='lazy',\n        states={\n            'readonly': Bool(Eval('module')),\n            },\n        depends=['module'])\n    model = fields.Char('Model Name', required=True,\n        states={\n            'readonly': Bool(Eval('module')),\n            },\n        depends=['module'])\n    info = fields.Text('Information',\n        states={\n            'readonly': Bool(Eval('module')),\n            },\n        depends=['module'])\n    module = fields.Char('Module',\n       help=\"Module in which this model is defined.\", readonly=True)\n    global_search_p = fields.Boolean('Global Search')\n    fields = fields.One2Many('ir.model.field', 'model', 'Fields',\n       required=True)\n    _get_names_cache = Cache('ir.model.get_names')\n\n    @classmethod\n    def __setup__(cls):\n        super(Model, cls).__setup__()\n        table = cls.__table__()\n        cls._sql_constraints += [\n            ('model_uniq', Unique(table, table.model),\n                'The model must be unique!'),\n            ]\n        cls._order.insert(0, ('model', 'ASC'))\n        cls.__rpc__.update({\n                'list_models': RPC(),\n                'list_history': RPC(),\n                'get_notification': RPC(),\n                'get_names': RPC(),\n                'global_search': RPC(),\n                })\n\n    @classmethod\n    def register(cls, model, module_name):\n        cursor = Transaction().connection.cursor()\n\n        ir_model = cls.__table__()\n        cursor.execute(*ir_model.select(ir_model.id,\n                where=ir_model.model == model.__name__))\n        model_id = None\n        if cursor.rowcount == -1 or cursor.rowcount is None:\n            data = cursor.fetchone()\n            if data:\n                model_id, = data\n        elif cursor.rowcount != 0:\n            model_id, = cursor.fetchone()\n        if not model_id:\n            cursor.execute(*ir_model.insert(\n                    [ir_model.model, ir_model.name, ir_model.info,\n                        ir_model.module],\n                    [[\n                            model.__name__, model._get_name(), model.__doc__,\n                            module_name]]))\n            cursor.execute(*ir_model.select(ir_model.id,\n                    where=ir_model.model == model.__name__))\n            (model_id,) = cursor.fetchone()\n        elif model.__doc__:\n            cursor.execute(*ir_model.update(\n                    [ir_model.name, ir_model.info],\n                    [model._get_name(), model.__doc__],\n                    where=ir_model.id == model_id))\n        cls._get_names_cache.clear()\n        return model_id\n\n    @classmethod\n    def clean(cls):\n        pool = Pool()\n        transaction = Transaction()\n        cursor = transaction.connection.cursor()\n        ir_model = cls.__table__()\n        cursor.execute(*ir_model.select(ir_model.model, ir_model.id))\n        for model, id_ in cursor:\n            try:\n                pool.get(model)\n            except KeyError:\n                logger.info(\"remove model: %s\", model)\n                try:\n                    cls.delete([cls(id_)])\n                    transaction.commit()\n                except Exception:\n                    transaction.rollback()\n                    logger.error(\n                        \"could not delete model: %s\", model, exc_info=True)\n\n    @classmethod\n    def list_models(cls):\n        'Return a list of all models names'\n        models = cls.search([], order=[\n                ('module', 'ASC'),  # Optimization assumption\n                ('model', 'ASC'),\n                ('id', 'ASC'),\n                ])\n        return [m.model for m in models]\n\n    @classmethod\n    def list_history(cls):\n        'Return a list of all models with history'\n        return [name for name, model in Pool().iterobject()\n            if getattr(model, '_history', False)]\n\n    @classmethod\n    def get_notification(cls):\n        \"Return a dictionary of model to notify with the depending fields\"\n        return {\n            name: list(model._on_change_notify_depends)\n            for name, model in Pool().iterobject()\n            if issubclass(model, ModelView)\n            and model._on_change_notify_depends}\n\n    @classmethod\n    def get_name_items(cls):\n        \"Return a list of couple mapping models to names\"\n        items = cls._get_names_cache.get('items')\n        if items is None:\n            models = cls.search([])\n            items = [(m.model, m.name) for m in models]\n            cls._get_names_cache.set('items', items)\n        return items\n\n    @classmethod\n    def get_names(cls):\n        \"Return a dictionary mapping models to names\"\n        dict_ = cls._get_names_cache.get('dict')\n        if dict_ is None:\n            dict_ = dict(cls.get_name_items())\n            cls._get_names_cache.set('dict', dict_)\n        return dict_\n\n    @classmethod\n    def global_search(cls, text, limit, menu='ir.ui.menu'):\n        \"\"\"\n        Search on models for text including menu\n        Returns a list of tuple (ratio, model, model_name, id, name, icon)\n        The size of the list is limited to limit\n        \"\"\"\n        pool = Pool()\n        ModelAccess = pool.get('ir.model.access')\n\n        if not limit > 0:\n            raise ValueError('limit must be > 0: %r' % (limit,))\n\n        models = cls.search(['OR',\n                ('global_search_p', '=', True),\n                ('model', '=', menu),\n                ])\n        access = ModelAccess.get_access([m.model for m in models])\n        s = StringMatcher()\n        if isinstance(text, bytes):\n            text = text.decode('utf-8')\n        s.set_seq2(text)\n\n        def generate():\n            for model in models:\n                if not access[model.model]['read']:\n                    continue\n                Model = pool.get(model.model)\n                if not hasattr(Model, 'search_global'):\n                    continue\n                for record, name, icon in Model.search_global(text):\n                    if isinstance(name, bytes):\n                        name = name.decode('utf-8')\n                    s.set_seq1(name)\n                    yield (s.ratio(), model.model, model.rec_name,\n                        record.id, name, icon)\n        return heapq.nlargest(int(limit), generate())\n\n    @classmethod\n    def get_name(cls, model):\n        return cls.get_names().get(model, model)\n\n\nclass ModelField(ModelSQL, ModelView):\n    \"Model field\"\n    __name__ = 'ir.model.field'\n    name = fields.Char('Name', required=True,\n        states={\n            'readonly': Bool(Eval('module')),\n            },\n        depends=['module'])\n    relation = fields.Char('Model Relation',\n        states={\n            'readonly': Bool(Eval('module')),\n            },\n        depends=['module'])\n    model = fields.Many2One('ir.model', 'Model', required=True,\n        ondelete='CASCADE',\n        states={\n            'readonly': Bool(Eval('module')),\n            },\n        depends=['module'])\n    field_description = fields.Char('Field Description', translate=True,\n        loading='lazy',\n        states={\n            'readonly': Bool(Eval('module')),\n            },\n        depends=['module'])\n    ttype = fields.Char('Field Type',\n        states={\n            'readonly': Bool(Eval('module')),\n            },\n        depends=['module'])\n    help = fields.Text('Help', translate=True, loading='lazy',\n        states={\n            'readonly': Bool(Eval('module')),\n            },\n        depends=['module'])\n    module = fields.Char('Module',\n       help=\"Module in which this field is defined.\")\n    access = fields.Boolean(\n        \"Access\",\n        states={\n            'invisible': ~Eval('relation'),\n            },\n        depends=['relation'],\n        help=\"If checked, the access right on the model of the field \"\n        \"is also tested against the relation of the field.\")\n\n    _get_name_cache = Cache('ir.model.field.get_name')\n\n    @classmethod\n    def __setup__(cls):\n        super(ModelField, cls).__setup__()\n        table = cls.__table__()\n        cls._sql_constraints += [\n            ('name_model_uniq', Unique(table, table.name, table.model),\n                'The field name in model must be unique!'),\n            ]\n        cls._order.insert(0, ('name', 'ASC'))\n\n    @classmethod\n    def register(cls, model, module_name, model_id):\n        pool = Pool()\n        Model = pool.get('ir.model')\n        cursor = Transaction().connection.cursor()\n\n        ir_model_field = cls.__table__()\n        ir_model = Model.__table__()\n\n        cursor.execute(*ir_model_field.join(ir_model,\n                condition=ir_model_field.model == ir_model.id\n                ).select(ir_model_field.id.as_('id'),\n                ir_model_field.name.as_('name'),\n                ir_model_field.field_description.as_('field_description'),\n                ir_model_field.ttype.as_('ttype'),\n                ir_model_field.relation.as_('relation'),\n                ir_model_field.module.as_('module'),\n                ir_model_field.help.as_('help'),\n                ir_model_field.access.as_('access'),\n                where=ir_model.model == model.__name__))\n        model_fields = {f['name']: f for f in cursor_dict(cursor)}\n\n        for field_name, field in model._fields.items():\n            if hasattr(field, 'model_name'):\n                relation = field.model_name\n            elif hasattr(field, 'relation_name'):\n                relation = field.relation_name\n            else:\n                relation = None\n            access = field_name in model.__access__\n\n            if field_name not in model_fields:\n                cursor.execute(*ir_model_field.insert(\n                        [ir_model_field.model, ir_model_field.name,\n                            ir_model_field.field_description,\n                            ir_model_field.ttype, ir_model_field.relation,\n                            ir_model_field.help, ir_model_field.module,\n                            ir_model_field.access],\n                        [[\n                                model_id, field_name,\n                                field.string,\n                                field._type, relation,\n                                field.help, module_name,\n                                access]]))\n            elif (model_fields[field_name]['field_description'] != field.string\n                    or model_fields[field_name]['ttype'] != field._type\n                    or model_fields[field_name]['relation'] != relation\n                    or model_fields[field_name]['help'] != field.help\n                    or model_fields[field_name]['access'] != access):\n                cursor.execute(*ir_model_field.update(\n                        [ir_model_field.field_description,\n                            ir_model_field.ttype, ir_model_field.relation,\n                            ir_model_field.help, ir_model_field.access],\n                        [field.string, field._type, relation, field.help,\n                            access],\n                        where=(ir_model_field.id\n                            == model_fields[field_name]['id'])))\n\n    @classmethod\n    def clean(cls):\n        pool = Pool()\n        IrModel = pool.get('ir.model')\n        transaction = Transaction()\n        cursor = transaction.connection.cursor()\n        ir_model = IrModel.__table__()\n        ir_model_field = cls.__table__()\n        cursor.execute(*ir_model_field\n            .join(ir_model, condition=ir_model_field.model == ir_model.id)\n            .select(ir_model.model, ir_model_field.name, ir_model_field.id))\n        for model, field, id_ in cursor:\n            Model = pool.get(model)\n            if field not in Model._fields:\n                logger.info(\"remove field: %s.%s\", model, field)\n                try:\n                    cls.delete([cls(id_)])\n                    transaction.commit()\n                except Exception:\n                    transaction.rollback()\n                    logger.error(\n                        \"could not delete field: %s.%s\", model, field,\n                        exc_info=True)\n\n    @staticmethod\n    def default_name():\n        return 'No Name'\n\n    @staticmethod\n    def default_field_description():\n        return 'No description available'\n\n    def get_rec_name(self, name):\n        if self.field_description:\n            return '%s (%s)' % (self.field_description, self.name)\n        else:\n            return self.name\n\n    @classmethod\n    def search_rec_name(cls, name, clause):\n        if clause[1].startswith('!') or clause[1].startswith('not '):\n            bool_op = 'AND'\n        else:\n            bool_op = 'OR'\n        return [bool_op,\n            ('field_description',) + tuple(clause[1:]),\n            ('name',) + tuple(clause[1:]),\n            ]\n\n    @classmethod\n    def get_name(cls, model, field):\n        name = cls._get_name_cache.get((model, field))\n        if name is None:\n            fields = cls.search([\n                    ('model.model', '=', model),\n                    ('name', '=', field),\n                    ], limit=1)\n            if fields:\n                field, = fields\n                name = field.field_description\n                cls._get_name_cache.set((model, field), name)\n            else:\n                name = field\n        return name\n\n    @classmethod\n    def read(cls, ids, fields_names):\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        Model = pool.get('ir.model')\n\n        to_delete = []\n        if Transaction().context.get('language'):\n            if 'field_description' in fields_names \\\n                    or 'help' in fields_names:\n                if 'model' not in fields_names:\n                    fields_names.append('model')\n                    to_delete.append('model')\n                if 'name' not in fields_names:\n                    fields_names.append('name')\n                    to_delete.append('name')\n\n        res = super(ModelField, cls).read(ids, fields_names)\n\n        if (Transaction().context.get('language')\n                and ('field_description' in fields_names\n                    or 'help' in fields_names)):\n            model_ids = set()\n            for rec in res:\n                if isinstance(rec['model'], (list, tuple)):\n                    model_ids.add(rec['model'][0])\n                else:\n                    model_ids.add(rec['model'])\n            model_ids = list(model_ids)\n            cursor = Transaction().connection.cursor()\n            model = Model.__table__()\n            cursor.execute(*model.select(model.id, model.model,\n                    where=model.id.in_(model_ids)))\n            id2model = dict(cursor)\n\n            trans_args = []\n            for rec in res:\n                if isinstance(rec['model'], (list, tuple)):\n                    model_id = rec['model'][0]\n                else:\n                    model_id = rec['model']\n                if 'field_description' in fields_names:\n                    trans_args.append((id2model[model_id] + ',' + rec['name'],\n                        'field', Transaction().language, None))\n                if 'help' in fields_names:\n                    trans_args.append((id2model[model_id] + ',' + rec['name'],\n                            'help', Transaction().language, None))\n            Translation.get_sources(trans_args)\n            for rec in res:\n                if isinstance(rec['model'], (list, tuple)):\n                    model_id = rec['model'][0]\n                else:\n                    model_id = rec['model']\n                if 'field_description' in fields_names:\n                    res_trans = Translation.get_source(\n                            id2model[model_id] + ',' + rec['name'],\n                            'field', Transaction().language)\n                    if res_trans:\n                        rec['field_description'] = res_trans\n                if 'help' in fields_names:\n                    res_trans = Translation.get_source(\n                            id2model[model_id] + ',' + rec['name'],\n                            'help', Transaction().language)\n                    if res_trans:\n                        rec['help'] = res_trans\n\n        if to_delete:\n            for rec in res:\n                for field in to_delete:\n                    del rec[field]\n        return res\n\n\nclass ModelAccess(DeactivableMixin, ModelSQL, ModelView):\n    \"Model access\"\n    __name__ = 'ir.model.access'\n    model = fields.Many2One('ir.model', 'Model', required=True,\n            ondelete=\"CASCADE\")\n    group = fields.Many2One('res.group', 'Group',\n            ondelete=\"CASCADE\")\n    perm_read = fields.Boolean('Read Access')\n    perm_write = fields.Boolean('Write Access')\n    perm_create = fields.Boolean('Create Access')\n    perm_delete = fields.Boolean('Delete Access')\n    description = fields.Text('Description')\n    _get_access_cache = Cache('ir_model_access.get_access', context=False)\n\n    @classmethod\n    def __setup__(cls):\n        super(ModelAccess, cls).__setup__()\n        cls.__rpc__.update({\n                'get_access': RPC(),\n                })\n\n    @staticmethod\n    def check_xml_record(accesses, values):\n        return True\n\n    @staticmethod\n    def default_perm_read():\n        return False\n\n    @staticmethod\n    def default_perm_write():\n        return False\n\n    @staticmethod\n    def default_perm_create():\n        return False\n\n    @staticmethod\n    def default_perm_delete():\n        return False\n\n    def get_rec_name(self, name):\n        return self.model.rec_name\n\n    @classmethod\n    def search_rec_name(cls, name, clause):\n        return [('model',) + tuple(clause[1:])]\n\n    @classmethod\n    def get_access(cls, models):\n        'Return access for models'\n        # root user above constraint\n        if Transaction().user == 0:\n            return defaultdict(lambda: defaultdict(lambda: True))\n\n        pool = Pool()\n        Model = pool.get('ir.model')\n        UserGroup = pool.get('res.user-res.group')\n        Group = pool.get('res.group')\n        cursor = Transaction().connection.cursor()\n        user = Transaction().user\n        model_access = cls.__table__()\n        ir_model = Model.__table__()\n        user_group = UserGroup.user_group_all_table()\n        group = Group.__table__()\n\n        access = {}\n        for model in models:\n            maccess = cls._get_access_cache.get((user, model), default=-1)\n            if maccess == -1:\n                break\n            access[model] = maccess\n        else:\n            return access\n\n        def fill_models(Model, models):\n            if Model.__name__ in models:\n                return\n            models.append(Model.__name__)\n            for field_name in Model.__access__:\n                field = getattr(Model, field_name)\n                fill_models(field.get_target(), models)\n        model2models = defaultdict(list)\n        for model in models:\n            fill_models(pool.get(model), model2models[model])\n\n        all_models = list(set(sum(model2models.values(), [])))\n        default = {'read': True, 'write': True, 'create': True, 'delete': True}\n        default_singleton = {\n            'read': True, 'write': True, 'create': False, 'delete': False}\n        access = {\n            m: default\n            if not issubclass(pool.get(m), ModelSingleton)\n            else default_singleton for m in models}\n        cursor.execute(*model_access.join(ir_model, 'LEFT',\n                condition=model_access.model == ir_model.id\n                ).join(user_group, 'LEFT',\n                condition=user_group.group == model_access.group\n                ).join(group, 'LEFT',\n                condition=model_access.group == group.id\n                ).select(\n                ir_model.model,\n                Max(Case(\n                        (model_access.perm_read == Literal(True), 1),\n                        else_=0)),\n                Max(Case(\n                        (model_access.perm_write == Literal(True), 1),\n                        else_=0)),\n                Max(Case(\n                        (model_access.perm_create == Literal(True), 1),\n                        else_=0)),\n                Max(Case(\n                        (model_access.perm_delete == Literal(True), 1),\n                        else_=0)),\n                where=ir_model.model.in_(all_models)\n                & (model_access.active == Literal(True))\n                & ((\n                        (user_group.user == user)\n                        & (group.active == Literal(True)))\n                    | (model_access.group == Null)),\n                group_by=ir_model.model))\n        raw_access = {\n            m: {'read': r, 'write': w, 'create': c, 'delete': d}\n            for m, r, w, c, d in cursor}\n\n        for model in models:\n            access[model] = {\n                perm: max(\n                    (raw_access[m][perm] for m in model2models[model]\n                        if m in raw_access),\n                    default=True)\n                for perm in ['read', 'write', 'create', 'delete']}\n        for model, maccess in access.items():\n            cls._get_access_cache.set((user, model), maccess)\n        return access\n\n    @classmethod\n    def check(cls, model_name, mode='read', raise_exception=True):\n        'Check access for model_name and mode'\n        pool = Pool()\n        Model = pool.get(model_name)\n        assert mode in ['read', 'write', 'create', 'delete'], \\\n            'Invalid access mode for security'\n        if ((Transaction().user == 0)\n                or (raise_exception\n                    and not Transaction().context.get('_check_access'))):\n            return True\n\n        access = cls.get_access([model_name])[model_name][mode]\n        if not access and access is not None:\n            if raise_exception:\n                raise AccessError(gettext(\n                        'ir.msg_access_rule_error', **Model.__names__()))\n            else:\n                return False\n        return True\n\n    @classmethod\n    def check_relation(cls, model_name, field_name, mode='read'):\n        'Check access to relation field for model_name and mode'\n        pool = Pool()\n        Model = pool.get(model_name)\n        field = getattr(Model, field_name)\n        if field._type in ('one2many', 'many2one'):\n            return cls.check(field.model_name, mode=mode,\n                raise_exception=False)\n        elif field._type in ('many2many', 'one2one'):\n            if not cls.check(\n                    field.get_target().__name__, mode=mode,\n                    raise_exception=False):\n                return False\n            elif (field.relation_name\n                    and not cls.check(field.relation_name, mode=mode,\n                        raise_exception=False)):\n                return False\n            else:\n                return True\n        elif field._type == 'reference':\n            selection = field.selection\n            if isinstance(selection, str):\n                sel_func = getattr(Model, field.selection)\n                if not is_instance_method(Model, field.selection):\n                    selection = sel_func()\n                else:\n                    # XXX Can not check access right on instance method\n                    selection = []\n            for model_name, _ in selection:\n                if model_name and not cls.check(model_name, mode=mode,\n                        raise_exception=False):\n                    return False\n            return True\n        else:\n            return True\n\n    @classmethod\n    def write(cls, accesses, values, *args):\n        super(ModelAccess, cls).write(accesses, values, *args)\n        # Restart the cache\n        cls._get_access_cache.clear()\n        ModelView._fields_view_get_cache.clear()\n\n    @classmethod\n    def create(cls, vlist):\n        res = super(ModelAccess, cls).create(vlist)\n        # Restart the cache\n        cls._get_access_cache.clear()\n        ModelView._fields_view_get_cache.clear()\n        return res\n\n    @classmethod\n    def delete(cls, accesses):\n        super(ModelAccess, cls).delete(accesses)\n        # Restart the cache\n        cls._get_access_cache.clear()\n        ModelView._fields_view_get_cache.clear()\n\n\nclass ModelFieldAccess(DeactivableMixin, ModelSQL, ModelView):\n    \"Model Field Access\"\n    __name__ = 'ir.model.field.access'\n    field = fields.Many2One('ir.model.field', 'Field', required=True,\n            ondelete='CASCADE')\n    group = fields.Many2One('res.group', 'Group', ondelete='CASCADE')\n    perm_read = fields.Boolean('Read Access')\n    perm_write = fields.Boolean('Write Access')\n    perm_create = fields.Boolean('Create Access')\n    perm_delete = fields.Boolean('Delete Access')\n    description = fields.Text('Description')\n    _get_access_cache = Cache('ir_model_field_access.check', context=False)\n\n    @staticmethod\n    def check_xml_record(field_accesses, values):\n        return True\n\n    @staticmethod\n    def default_perm_read():\n        return False\n\n    @staticmethod\n    def default_perm_write():\n        return False\n\n    @staticmethod\n    def default_perm_create():\n        return True\n\n    @staticmethod\n    def default_perm_delete():\n        return True\n\n    def get_rec_name(self, name):\n        return self.field.rec_name\n\n    @classmethod\n    def search_rec_name(cls, name, clause):\n        return [('field',) + tuple(clause[1:])]\n\n    @classmethod\n    def get_access(cls, models):\n        'Return fields access for models'\n        # root user above constraint\n        if Transaction().user == 0:\n            return defaultdict(lambda: defaultdict(\n                    lambda: defaultdict(lambda: True)))\n\n        pool = Pool()\n        Model = pool.get('ir.model')\n        ModelField = pool.get('ir.model.field')\n        UserGroup = pool.get('res.user-res.group')\n        Group = pool.get('res.group')\n        user = Transaction().user\n        field_access = cls.__table__()\n        ir_model = Model.__table__()\n        model_field = ModelField.__table__()\n        user_group = UserGroup.user_group_all_table()\n        group = Group.__table__()\n\n        accesses = {}\n        for model in models:\n            maccesses = cls._get_access_cache.get((user, model))\n            if maccesses is None:\n                break\n            accesses[model] = maccesses\n        else:\n            return accesses\n\n        default = {}\n        accesses = dict((m, default) for m in models)\n        cursor = Transaction().connection.cursor()\n        cursor.execute(*field_access.join(model_field,\n                condition=field_access.field == model_field.id\n                ).join(ir_model,\n                condition=model_field.model == ir_model.id\n                ).join(user_group, 'LEFT',\n                condition=user_group.group == field_access.group\n                ).join(group, 'LEFT',\n                condition=field_access.group == group.id\n                ).select(\n                ir_model.model,\n                model_field.name,\n                Max(Case(\n                        (field_access.perm_read == Literal(True), 1),\n                        else_=0)),\n                Max(Case(\n                        (field_access.perm_write == Literal(True), 1),\n                        else_=0)),\n                Max(Case(\n                        (field_access.perm_create == Literal(True), 1),\n                        else_=0)),\n                Max(Case(\n                        (field_access.perm_delete == Literal(True), 1),\n                        else_=0)),\n                where=ir_model.model.in_(models)\n                & (field_access.active == Literal(True))\n                & ((\n                        (user_group.user == user)\n                        & (group.active == Literal(True)))\n                    | (field_access.group == Null)),\n                group_by=[ir_model.model, model_field.name]))\n        for m, f, r, w, c, d in cursor:\n            accesses[m][f] = {'read': r, 'write': w, 'create': c, 'delete': d}\n        for model, maccesses in accesses.items():\n            cls._get_access_cache.set((user, model), maccesses)\n        return accesses\n\n    @classmethod\n    def check(cls, model_name, fields, mode='read', raise_exception=True,\n            access=False):\n        '''\n        Check access for fields on model_name.\n        '''\n        pool = Pool()\n        Model = pool.get(model_name)\n        assert mode in ('read', 'write', 'create', 'delete'), \\\n            'Invalid access mode'\n        if ((Transaction().user == 0)\n                or (raise_exception\n                    and not Transaction().context.get('_check_access'))):\n            if access:\n                return dict((x, True) for x in fields)\n            return True\n\n        accesses = dict((f, a[mode])\n            for f, a in cls.get_access([model_name])[model_name].items())\n        if access:\n            return accesses\n        for field in fields:\n            if not accesses.get(field, True):\n                if raise_exception:\n                    raise AccessError(\n                        gettext('ir.msg_access_rule_field_error',\n                            **Model.__names__(field)))\n                else:\n                    return False\n        return True\n\n    @classmethod\n    def write(cls, field_accesses, values, *args):\n        super(ModelFieldAccess, cls).write(field_accesses, values, *args)\n        # Restart the cache\n        cls._get_access_cache.clear()\n        ModelView._fields_view_get_cache.clear()\n\n    @classmethod\n    def create(cls, vlist):\n        res = super(ModelFieldAccess, cls).create(vlist)\n        # Restart the cache\n        cls._get_access_cache.clear()\n        ModelView._fields_view_get_cache.clear()\n        return res\n\n    @classmethod\n    def delete(cls, field_accesses):\n        super(ModelFieldAccess, cls).delete(field_accesses)\n        # Restart the cache\n        cls._get_access_cache.clear()\n        ModelView._fields_view_get_cache.clear()\n\n\nclass ModelButton(DeactivableMixin, ModelSQL, ModelView):\n    \"Model Button\"\n    __name__ = 'ir.model.button'\n    name = fields.Char('Name', required=True, readonly=True)\n    string = fields.Char(\"Label\", translate=True)\n    help = fields.Text(\"Help\", translate=True)\n    confirm = fields.Text(\"Confirm\", translate=True,\n        help=\"Text to ask user confirmation when clicking the button.\")\n    model = fields.Many2One('ir.model', 'Model', required=True, readonly=True,\n        ondelete='CASCADE')\n    rules = fields.One2Many('ir.model.button.rule', 'button', \"Rules\")\n    _rules_cache = Cache('ir.model.button.rules')\n    clicks = fields.One2Many('ir.model.button.click', 'button', \"Clicks\")\n    reset_by = fields.Many2Many(\n        'ir.model.button-button.reset', 'button_ruled', 'button', \"Reset by\",\n        domain=[\n            ('model', '=', Eval('model', -1)),\n            ('id', '!=', Eval('id', -1)),\n            ],\n        depends=['model', 'id'],\n        help=\"Button that should reset the rules.\")\n    reset = fields.Many2Many(\n        'ir.model.button-button.reset', 'button', 'button_ruled', \"Reset\",\n        domain=[\n            ('model', '=', Eval('model', -1)),\n            ('id', '!=', Eval('id', -1)),\n            ],\n        depends=['model', 'id'])\n    _reset_cache = Cache('ir.model.button.reset')\n    _view_attributes_cache = Cache(\n        'ir.model.button.view_attributes', context=False)\n\n    @classmethod\n    def __register__(cls, module_name):\n        super().__register__(module_name)\n\n        table_h = cls.__table_handler__(module_name)\n\n        # Migration from 6.2: replace unique by exclude\n        table_h.drop_constraint('name_model_uniq')\n\n    @classmethod\n    def __setup__(cls):\n        super(ModelButton, cls).__setup__()\n        t = cls.__table__()\n        cls._sql_constraints += [\n            ('name_model_exclude',\n                Exclude(t, (t.name, Equal), (t.model, Equal),\n                    where=(t.active == Literal(True))),\n                'ir.msg_button_name_unique'),\n            ]\n        cls._order.insert(0, ('model', 'ASC'))\n\n    @classmethod\n    def create(cls, vlist):\n        result = super(ModelButton, cls).create(vlist)\n        cls._rules_cache.clear()\n        cls._reset_cache.clear()\n        cls._view_attributes_cache.clear()\n        return result\n\n    @classmethod\n    def write(cls, buttons, values, *args):\n        super(ModelButton, cls).write(buttons, values, *args)\n        cls._rules_cache.clear()\n        cls._reset_cache.clear()\n        cls._view_attributes_cache.clear()\n\n    @classmethod\n    def delete(cls, buttons):\n        super(ModelButton, cls).delete(buttons)\n        # Restart the cache for get_groups and get_rules\n        cls._rules_cache.clear()\n        cls._reset_cache.clear()\n        cls._view_attributes_cache.clear()\n\n    @classmethod\n    def copy(cls, buttons, default=None):\n        if default is None:\n            default = {}\n        else:\n            default = default.copy()\n        default.setdefault('clicks')\n        return super(ModelButton, cls).copy(buttons, default=default)\n\n    @classmethod\n    def get_rules(cls, model, name):\n        'Return a list of rules to apply on the named button of the model'\n        pool = Pool()\n        Rule = pool.get('ir.model.button.rule')\n        key = (model, name)\n        rule_ids = cls._rules_cache.get(key)\n        if rule_ids is not None:\n            return Rule.browse(rule_ids)\n        buttons = cls.search([\n                ('model.model', '=', model),\n                ('name', '=', name),\n                ])\n        if not buttons:\n            rules = []\n        else:\n            button, = buttons\n            rules = button.rules\n        cls._rules_cache.set(key, [r.id for r in rules])\n        return rules\n\n    @classmethod\n    def get_reset(cls, model, name):\n        \"Return a list of button names to reset\"\n        key = (model, name)\n        reset = cls._reset_cache.get(key)\n        if reset is not None:\n            return reset\n        buttons = cls.search([\n                ('model.model', '=', model),\n                ('name', '=', name),\n                ])\n        if not buttons:\n            reset = []\n        else:\n            button, = buttons\n            reset = [b.name for b in button.reset]\n        cls._reset_cache.set(key, reset)\n        return reset\n\n    @classmethod\n    def get_view_attributes(cls, model, name):\n        \"Return the view attributes of the named button of the model\"\n        key = (model, name, Transaction().language)\n        attributes = cls._view_attributes_cache.get(key)\n        if attributes is not None:\n            return attributes\n        buttons = cls.search([\n                ('model.model', '=', model),\n                ('name', '=', name),\n                ])\n        if not buttons:\n            attributes = {}\n        else:\n            button, = buttons\n            attributes = {\n                'string': button.string,\n                'help': button.help,\n                'confirm': button.confirm,\n                }\n        cls._view_attributes_cache.set(key, attributes)\n        return attributes\n\n\nclass ModelButtonRule(ModelSQL, ModelView):\n    \"Model Button Rule\"\n    __name__ = 'ir.model.button.rule'\n    button = fields.Many2One(\n        'ir.model.button', \"Button\", required=True, ondelete='CASCADE')\n    description = fields.Char('Description')\n    number_user = fields.Integer('Number of User', required=True)\n    condition = fields.Char(\n        \"Condition\",\n        help='A PYSON statement evaluated with the record represented by '\n        '\"self\"\\nIt activate the rule if true.')\n\n    @classmethod\n    def default_number_user(cls):\n        return 1\n\n    @classmethod\n    def validate_fields(cls, rules, field_names):\n        super().validate_fields(rules, field_names)\n        cls.check_condition(rules, field_names)\n\n    @classmethod\n    def check_condition(cls, rules, field_names=None):\n        if field_names and 'condition' not in field_names:\n            return\n        for rule in rules:\n            if not rule.condition:\n                continue\n            try:\n                PYSONDecoder(noeval=True).decode(rule.condition)\n            except Exception:\n                raise ConditionError(\n                    gettext('ir.msg_model_invalid_condition',\n                        condition=rule.condition,\n                        rule=rule.rec_name))\n\n    def test(self, record, clicks):\n        \"Test if the rule passes for the record\"\n        if self.condition:\n            env = {}\n            env['self'] = EvalEnvironment(record, record.__class__)\n            if not PYSONDecoder(env).decode(self.condition):\n                return True\n        if self.group:\n            users = {c.user for c in clicks if self.group in c.user.groups}\n        else:\n            users = {c.user for c in clicks}\n        return len(users) >= self.number_user\n\n    @classmethod\n    def create(cls, vlist):\n        pool = Pool()\n        ModelButton = pool.get('ir.model.button')\n        result = super(ModelButtonRule, cls).create(vlist)\n        # Restart the cache for get_rules\n        ModelButton._rules_cache.clear()\n        return result\n\n    @classmethod\n    def write(cls, buttons, values, *args):\n        pool = Pool()\n        ModelButton = pool.get('ir.model.button')\n        super(ModelButtonRule, cls).write(buttons, values, *args)\n        # Restart the cache for get_rules\n        ModelButton._rules_cache.clear()\n\n    @classmethod\n    def delete(cls, buttons):\n        pool = Pool()\n        ModelButton = pool.get('ir.model.button')\n        super(ModelButtonRule, cls).delete(buttons)\n        # Restart the cache for get_rules\n        ModelButton._rules_cache.clear()\n\n\nclass ModelButtonClick(DeactivableMixin, ModelSQL, ModelView):\n    \"Model Button Click\"\n    __name__ = 'ir.model.button.click'\n    button = fields.Many2One(\n        'ir.model.button', \"Button\", required=True, ondelete='CASCADE')\n    record_id = fields.Integer(\"Record ID\", required=True)\n\n    @classmethod\n    def __setup__(cls):\n        super(ModelButtonClick, cls).__setup__()\n        cls.__rpc__.update({\n                'get_click': RPC(),\n                })\n\n    @classmethod\n    def register(cls, model, name, records):\n        pool = Pool()\n        Button = pool.get('ir.model.button')\n\n        assert all(r.__class__.__name__ == model for r in records)\n\n        user = Transaction().user\n        button, = Button.search([\n                ('model.model', '=', model),\n                ('name', '=', name),\n                ])\n        cls.create([{\n                    'button': button.id,\n                    'record_id': r.id,\n                    'user': user,\n                    } for r in records])\n\n        clicks = defaultdict(list)\n        for records in grouped_slice(records):\n            records = cls.search([\n                    ('button', '=', button.id),\n                    ('record_id', 'in', [r.id for r in records]),\n                    ], order=[('record_id', 'ASC')])\n            clicks.update(\n                (k, list(v)) for k, v in groupby(\n                    records, key=lambda c: c.record_id))\n        return clicks\n\n    @classmethod\n    def reset(cls, model, names, records):\n        assert all(r.__class__.__name__ == model for r in records)\n\n        clicks = []\n        for records in grouped_slice(records):\n            clicks.extend(cls.search([\n                        ('button.model.model', '=', model),\n                        ('button.name', 'in', names),\n                        ('record_id', 'in', [r.id for r in records]),\n                        ]))\n        cls.write(clicks, {\n                'active': False,\n                })\n\n    @classmethod\n    def get_click(cls, model, button, record_id):\n        clicks = cls.search([\n                ('button.model.model', '=', model),\n                ('button.name', '=', button),\n                ('record_id', '=', record_id),\n                ])\n        return {c.user.id: c.user.rec_name for c in clicks}\n\n\nclass ModelButtonReset(ModelSQL):\n    \"Model Button Reset\"\n    __name__ = 'ir.model.button-button.reset'\n    button_ruled = fields.Many2One(\n        'ir.model.button', \"Button Ruled\",\n        required=True, ondelete='CASCADE')\n    button = fields.Many2One(\n        'ir.model.button', \"Button\",\n        required=True, ondelete='CASCADE')\n\n\nclass ModelData(ModelSQL, ModelView):\n    \"Model data\"\n    __name__ = 'ir.model.data'\n    fs_id = fields.Char('Identifier on File System', required=True,\n        help=\"The id of the record as known on the file system.\")\n    model = fields.Char('Model', required=True)\n    module = fields.Char('Module', required=True)\n    db_id = fields.Integer(\n        \"Resource ID\",\n        states={\n            'required': ~Eval('noupdate', False),\n            },\n        help=\"The id of the record in the database.\")\n    values = fields.Text('Values')\n    fs_values = fields.Text('Values on File System')\n    noupdate = fields.Boolean('No Update')\n    out_of_sync = fields.Function(fields.Boolean('Out of Sync'),\n        'get_out_of_sync', searcher='search_out_of_sync')\n    _get_id_cache = Cache('ir_model_data.get_id', context=False)\n    _has_model_cache = Cache('ir_model_data.has_model', context=False)\n\n    @classmethod\n    def __setup__(cls):\n        super(ModelData, cls).__setup__()\n        table = cls.__table__()\n        cls._sql_constraints = [\n            ('fs_id_module_model_uniq',\n                Unique(table, table.fs_id, table.module, table.model),\n                'The triple (fs_id, module, model) must be unique!'),\n            ]\n        cls._sql_indexes.update({\n                Index(\n                    table,\n                    (table.fs_id, Index.Equality()),\n                    (table.module, Index.Equality()),\n                    (table.model, Index.Equality())),\n                Index(\n                    table,\n                    (table.module, Index.Equality())),\n                })\n        cls._buttons.update({\n                'sync': {\n                    'invisible': ~Eval('out_of_sync'),\n                    'depends': ['out_of_sync'],\n                    },\n                })\n        cls.__rpc__.update({\n                'sync': RPC(\n                    readonly=False, instantiate=0, fresh_session=True),\n                })\n\n    @classmethod\n    def __register__(cls, module_name):\n        cursor = Transaction().connection.cursor()\n        model_data = cls.__table__()\n\n        super(ModelData, cls).__register__(module_name)\n\n        table_h = cls.__table_handler__(module_name)\n\n        # Migration from 4.6: register buttons on ir module\n        cursor.execute(*model_data.update(\n                [model_data.module], ['ir'],\n                where=((model_data.module == 'res')\n                    & (model_data.fs_id == 'model_data_sync_button'))))\n\n        # Migration from 5.0: remove required on db_id\n        table_h.not_null_action('db_id', action='remove')\n\n    @staticmethod\n    def default_noupdate():\n        return False\n\n    def get_out_of_sync(self, name):\n        return self.values != self.fs_values and self.fs_values is not None\n\n    @classmethod\n    def search_out_of_sync(cls, name, clause):\n        table = cls.__table__()\n        name, operator, value = clause\n        Operator = fields.SQL_OPERATORS[operator]\n        query = table.select(table.id,\n            where=Operator(\n                (table.fs_values != table.values) & (table.fs_values != Null),\n                value))\n        return [('id', 'in', query)]\n\n    @classmethod\n    def create(cls, *args):\n        records = super(ModelData, cls).create(*args)\n        cls._has_model_cache.clear()\n        return records\n\n    @classmethod\n    def write(cls, data, values, *args):\n        super(ModelData, cls).write(data, values, *args)\n        # Restart the cache for get_id\n        cls._get_id_cache.clear()\n        cls._has_model_cache.clear()\n\n    @classmethod\n    def delete(cls, records):\n        super(ModelData, cls).delete(records)\n        cls._has_model_cache.clear()\n\n    @classmethod\n    def has_model(cls, model):\n        models = cls._has_model_cache.get(None)\n        if models is None:\n            table = cls.__table__()\n            cursor = Transaction().connection.cursor()\n\n            cursor.execute(*table.select(table.model, group_by=[table.model]))\n            models = [m for m, in cursor]\n            cls._has_model_cache.set(None, models)\n        return model in models\n\n    @classmethod\n    def get_id(cls, module, fs_id=None):\n        \"\"\"\n        Return for an fs_id the corresponding db_id.\n        \"\"\"\n        if fs_id is None:\n            module, fs_id = module.split('.', 1)\n        key = (module, fs_id)\n        id_ = cls._get_id_cache.get(key)\n        if id_ is not None:\n            return id_\n        data = cls.search([\n            ('module', '=', module),\n            ('fs_id', '=', fs_id),\n            ], limit=1)\n        if not data:\n            raise KeyError(\"Reference to %s not found\"\n                % \".\".join([module, fs_id]))\n        id_ = cls.read([d.id for d in data], ['db_id'])[0]['db_id']\n        cls._get_id_cache.set(key, id_)\n        return id_\n\n    @classmethod\n    def dump_values(cls, values):\n        return json.dumps(\n            sorted(values.items()), cls=JSONEncoder, separators=(',', ':'),\n            sort_keys=True)\n\n    @classmethod\n    def load_values(cls, values):\n        try:\n            return dict(json.loads(values, object_hook=JSONDecoder()))\n        except ValueError:\n            # Migration from 3.2\n            import datetime\n            from decimal import Decimal\n            return eval(values, {\n                    'Decimal': Decimal,\n                    'datetime': datetime,\n                    })\n\n    @classmethod\n    @ModelView.button\n    def sync(cls, records):\n        def settable(Model, fieldname):\n            try:\n                field = Model._fields[fieldname]\n            except KeyError:\n                return False\n\n            if isinstance(field, fields.Function) and not field.setter:\n                return False\n\n            return True\n\n        with Transaction().set_user(0):\n            pool = Pool()\n            to_write = []\n            models_to_write = defaultdict(list)\n            for data in records:\n                try:\n                    Model = pool.get(data.model)\n                except KeyError:\n                    continue\n                values = cls.load_values(data.values)\n                fs_values = cls.load_values(data.fs_values)\n                # values could be the same once loaded\n                # if they come from version < 3.2\n                if values != fs_values:\n                    values = {f: v for f, v in fs_values.items()\n                        if settable(Model, f)}\n                    record = Model(data.db_id)\n                    models_to_write[Model].extend(([record], values))\n                to_write.extend([[data], {\n                            'values': cls.dump_values(fs_values),\n                            'fs_values': cls.dump_values(fs_values),\n                            }])\n            for Model, values_to_write in models_to_write.items():\n                Model.write(*values_to_write)\n            if to_write:\n                cls.write(*to_write)\n\n\nclass PrintModelGraphStart(ModelView):\n    'Print Model Graph'\n    __name__ = 'ir.model.print_model_graph.start'\n    level = fields.Integer('Level', required=True)\n    filter = fields.Text('Filter', help=\"Entering a Python \"\n            \"Regular Expression will exclude matching models from the graph.\")\n\n    @staticmethod\n    def default_level():\n        return 1\n\n\nclass PrintModelGraph(Wizard):\n    __name__ = 'ir.model.print_model_graph'\n\n    start = StateView('ir.model.print_model_graph.start',\n        'ir.print_model_graph_start_view_form', [\n            Button('Cancel', 'end', 'tryton-cancel'),\n            Button('Print', 'print_', 'tryton-ok', default=True),\n            ])\n    print_ = StateAction('ir.report_model_graph')\n\n    def transition_print_(self):\n        return 'end'\n\n    def do_print_(self, action):\n        return action, {\n            'id': Transaction().context.get('active_id'),\n            'ids': Transaction().context.get('active_ids'),\n            'level': self.start.level,\n            'filter': self.start.filter,\n            }\n\n\nclass ModelGraph(Report):\n    __name__ = 'ir.model.graph'\n\n    @classmethod\n    def execute(cls, ids, data):\n        import pydot\n        pool = Pool()\n        Model = pool.get('ir.model')\n        ActionReport = pool.get('ir.action.report')\n\n        if not data['filter']:\n            filter = None\n        else:\n            filter = re.compile(data['filter'], re.VERBOSE)\n        action_report_ids = ActionReport.search([\n            ('report_name', '=', cls.__name__)\n            ])\n        if not action_report_ids:\n            raise Exception('Error', 'Report (%s) not find!' % cls.__name__)\n        action_report = ActionReport(action_report_ids[0])\n\n        models = Model.browse(ids)\n\n        graph = pydot.Dot(fontsize=\"8\")\n        graph.set('center', '1')\n        graph.set('ratio', 'auto')\n        cls.fill_graph(models, graph, level=data['level'], filter=filter)\n        data = graph.create(prog='dot', format='png')\n        return ('png', fields.Binary.cast(data), False, action_report.name)\n\n    @classmethod\n    def fill_graph(cls, models, graph, level=1, filter=None):\n        '''\n        Fills a pydot graph with a models structure.\n        '''\n        import pydot\n        pool = Pool()\n        Model = pool.get('ir.model')\n\n        sub_models = set()\n        if level > 0:\n            for model in models:\n                for field in model.fields:\n                    if field.name in ('create_uid', 'write_uid'):\n                        continue\n                    if field.relation and not graph.get_node(field.relation):\n                        sub_models.add(field.relation)\n            if sub_models:\n                model_ids = Model.search([\n                    ('model', 'in', list(sub_models)),\n                    ])\n                sub_models = Model.browse(model_ids)\n                if set(sub_models) != set(models):\n                    cls.fill_graph(sub_models, graph, level=level - 1,\n                            filter=filter)\n\n        for model in models:\n            if filter and re.search(filter, model.model):\n                continue\n            label = '\"{' + model.model + '\\\\n'\n            if model.fields:\n                label += '|'\n            for field in model.fields:\n                if field.name in ('create_uid', 'write_uid',\n                        'create_date', 'write_date', 'id'):\n                    continue\n                label += '+ ' + field.name + ': ' + field.ttype\n                if field.relation:\n                    label += ' ' + field.relation\n                label += '\\\\l'\n            label += '}\"'\n            node_name = '\"%s\"' % model.model\n            node = pydot.Node(node_name, shape='record', label=label)\n            graph.add_node(node)\n\n            for field in model.fields:\n                if field.name in ('create_uid', 'write_uid'):\n                    continue\n                if field.relation:\n                    node_name = '\"%s\"' % field.relation\n                    if not graph.get_node(node_name):\n                        continue\n                    args = {}\n                    tail = model.model\n                    head = field.relation\n                    edge_model_name = '\"%s\"' % model.model\n                    edge_relation_name = '\"%s\"' % field.relation\n                    if field.ttype == 'many2one':\n                        edge = graph.get_edge(edge_model_name,\n                                edge_relation_name)\n                        if edge:\n                            continue\n                        args['arrowhead'] = \"normal\"\n                    elif field.ttype == 'one2many':\n                        edge = graph.get_edge(edge_relation_name,\n                                edge_model_name)\n                        if edge:\n                            continue\n                        args['arrowhead'] = \"normal\"\n                        tail = field.relation\n                        head = model.model\n                    elif field.ttype == 'many2many':\n                        if graph.get_edge(edge_model_name, edge_relation_name):\n                            continue\n                        if graph.get_edge(edge_relation_name, edge_model_name):\n                            continue\n                        args['arrowtail'] = \"inv\"\n                        args['arrowhead'] = \"inv\"\n\n                    edge = pydot.Edge(str(tail), str(head), **args)\n                    graph.add_edge(edge)\n\n\nclass ModelWorkflowGraph(Report):\n    __name__ = 'ir.model.workflow_graph'\n\n    @classmethod\n    def execute(cls, ids, data):\n        import pydot\n        pool = Pool()\n        Model = pool.get('ir.model')\n        ActionReport = pool.get('ir.action.report')\n\n        action_report_ids = ActionReport.search([\n            ('report_name', '=', cls.__name__)\n            ])\n        if not action_report_ids:\n            raise Exception('Error', 'Report (%s) not find!' % cls.__name__)\n        action_report = ActionReport(action_report_ids[0])\n\n        models = Model.browse(ids)\n\n        graph = pydot.Dot()\n        graph.set('center', '1')\n        graph.set('ratio', 'auto')\n        direction = Transaction().context.get('language_direction', 'ltr')\n        graph.set('rankdir', {'ltr': 'LR', 'rtl': 'RL'}[direction])\n        cls.fill_graph(models, graph)\n        data = graph.create(prog='dot', format='png')\n        return ('png', fields.Binary.cast(data), False, action_report.name)\n\n    @classmethod\n    def fill_graph(cls, models, graph):\n        'Fills pydot graph with models wizard.'\n        import pydot\n        pool = Pool()\n\n        for record in models:\n            Model = pool.get(record.model)\n\n            if not issubclass(Model, Workflow):\n                continue\n\n            subgraph = pydot.Cluster('%s' % record.id, label=record.model)\n            graph.add_subgraph(subgraph)\n\n            state_field = getattr(Model, Model._transition_state)\n            for state, _ in state_field.selection:\n                node = pydot.Node(\n                    '\"%s\"' % state, shape='octagon', label=state)\n                subgraph.add_node(node)\n\n            for from_, to in Model._transitions:\n                edge = pydot.Edge('\"%s\"' % from_, '\"%s\"' % to,\n                    arrowhead='normal')\n                subgraph.add_edge(edge)\n"
  },
  {
    "path": "trytond/ir/model.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <menuitem\n            name=\"Models\"\n            id=\"menu_models\"\n            sequence=\"50\"\n            parent=\"menu_administration\"/>\n        <record model=\"ir.ui.view\" id=\"model_view_form\">\n            <field name=\"model\">ir.model</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">model_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"model_view_tree\">\n            <field name=\"model\">ir.model</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">model_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_model_form\">\n            <field name=\"name\">Models</field>\n            <field name=\"res_model\">ir.model</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_model_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"model_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_model_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_model_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"model_view_form\"/>\n            <field name=\"act_window\" ref=\"act_model_form\"/>\n        </record>\n        <menuitem\n            parent=\"ir.menu_models\"\n            action=\"act_model_form\"\n            sequence=\"10\"\n            id=\"menu_model_form\"/>\n        <record model=\"ir.ui.view\" id=\"model_fields_view_form\">\n            <field name=\"model\">ir.model.field</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">model_field_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"model_fields_view_tree\">\n            <field name=\"model\">ir.model.field</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">model_field_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_model_fields_form\">\n            <field name=\"name\">Fields</field>\n            <field name=\"res_model\">ir.model.field</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_model_fields_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"model_fields_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_model_fields_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_model_fields_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"model_fields_view_form\"/>\n            <field name=\"act_window\" ref=\"act_model_fields_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_model_form\"\n            action=\"act_model_fields_form\"\n            sequence=\"20\"\n            id=\"model_model_fields_form\"/>\n        <record model=\"ir.ui.view\" id=\"model_access_view_tree\">\n            <field name=\"model\">ir.model.access</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">model_access_list</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"model_access_view_form\">\n            <field name=\"model\">ir.model.access</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">model_access_form</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_model_access_form\">\n            <field name=\"name\">Models Access</field>\n            <field name=\"res_model\">ir.model.access</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_model_access_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"model_access_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_model_access_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_model_access_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"model_access_view_form\"/>\n            <field name=\"act_window\" ref=\"act_model_access_form\"/>\n        </record>\n        <menuitem\n            parent=\"ir.menu_models\"\n            action=\"act_model_access_form\"\n            sequence=\"30\"\n            id=\"menu_model_access_form\"/>\n\n        <record model=\"ir.action.act_window\" id=\"act_model_access_form_relate_model\">\n            <field name=\"name\">Access</field>\n            <field name=\"res_model\">ir.model.access</field>\n            <field name=\"domain\"\n                eval=\"[If(Eval('active_ids', []) == [Eval('active_id')], ('model', '=', Eval('active_id')), ('model', 'in', Eval('active_ids')))]\"\n                pyson=\"1\"/>\n        </record>\n        <record model=\"ir.action.keyword\"\n            id=\"act_model_access_form_relate_model_keyword1\">\n            <field name=\"keyword\">form_relate</field>\n            <field name=\"model\">ir.model,-1</field>\n            <field name=\"action\" ref=\"act_model_access_form_relate_model\"/>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"model_field_access_view_tree\">\n            <field name=\"model\">ir.model.field.access</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">model_field_access_list</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"model_field_access_view_form\">\n            <field name=\"model\">ir.model.field.access</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">model_field_access_form</field>\n        </record>\n\n        <record model=\"ir.action.act_window\" id=\"act_model_field_access_form\">\n            <field name=\"name\">Fields Access</field>\n            <field name=\"res_model\">ir.model.field.access</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_model_field_access_form_view1\">\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"view\" ref=\"model_field_access_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_model_field_access_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_model_field_access_form_view2\">\n            <field name=\"sequence\" eval=\"20\"/>\n            <field name=\"view\" ref=\"model_field_access_view_form\"/>\n            <field name=\"act_window\" ref=\"act_model_field_access_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_model_access_form\"\n            action=\"act_model_field_access_form\"\n            sequence=\"10\"\n            id=\"menu_model_field_access_form\"/>\n\n        <record model=\"ir.action.act_window\" id=\"act_model_field_access_form_relate_field\">\n            <field name=\"name\">Access</field>\n            <field name=\"res_model\">ir.model.field.access</field>\n            <field name=\"domain\"\n                eval=\"[If(Eval('active_ids', []) == [Eval('active_id')], ('field', '=', Eval('active_id')), ('field', 'in', Eval('active_ids')))]\"\n                pyson=\"1\"/>\n        </record>\n        <record model=\"ir.action.keyword\"\n            id=\"act_modelfield__access_form_relate_field_keyword1\">\n            <field name=\"keyword\">form_relate</field>\n            <field name=\"model\">ir.model.field,-1</field>\n            <field name=\"action\" ref=\"act_model_field_access_form_relate_field\"/>\n        </record>\n\n        <record model=\"ir.action.report\" id=\"report_model_graph\">\n            <field name=\"name\">Graph</field>\n            <field name=\"model\">ir.model</field>\n            <field name=\"report_name\">ir.model.graph</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"print_model_graph_start_view_form\">\n            <field name=\"model\">ir.model.print_model_graph.start</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">model_print_model_graph_start_form</field>\n        </record>\n\n        <record model=\"ir.action.wizard\" id=\"print_model_graph\">\n            <field name=\"name\">Graph</field>\n            <field name=\"wiz_name\">ir.model.print_model_graph</field>\n            <field name=\"model\">ir.model</field>\n        </record>\n        <record model=\"ir.action.keyword\" id=\"print_model_graph_keyword\">\n            <field name=\"keyword\">form_print</field>\n            <field name=\"model\">ir.model,-1</field>\n            <field name=\"action\" ref=\"print_model_graph\"/>\n        </record>\n\n        <record model=\"ir.action.report\" id=\"report_model_workflow_graph\">\n            <field name=\"name\">Workflow Graph</field>\n            <field name=\"model\">ir.model</field>\n            <field name=\"report_name\">ir.model.workflow_graph</field>\n        </record>\n        <record model=\"ir.action.keyword\"\n            id=\"print_model_workflow_graph_keyword\">\n            <field name=\"keyword\">form_print</field>\n            <field name=\"model\">ir.model,-1</field>\n            <field name=\"action\" ref=\"report_model_workflow_graph\"/>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"model_button_view_list\">\n            <field name=\"model\">ir.model.button</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">model_button_list</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"model_button_view_form\">\n            <field name=\"model\">ir.model.button</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">model_button_form</field>\n        </record>\n\n        <record model=\"ir.action.act_window\" id=\"act_model_button_form\">\n            <field name=\"name\">Buttons</field>\n            <field name=\"res_model\">ir.model.button</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_model_button_form_view1\">\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"view\" ref=\"model_button_view_list\"/>\n            <field name=\"act_window\" ref=\"act_model_button_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_model_button_form_view2\">\n            <field name=\"sequence\" eval=\"20\"/>\n            <field name=\"view\" ref=\"model_button_view_form\"/>\n            <field name=\"act_window\" ref=\"act_model_button_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_model_access_form\"\n            action=\"act_model_button_form\"\n            sequence=\"20\"\n            id=\"menu_model_button_form\"/>\n\n        <record model=\"ir.ui.view\" id=\"model_button_rule_view_list\">\n            <field name=\"model\">ir.model.button.rule</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">model_button_rule_list</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"model_button_rule_view_form\">\n            <field name=\"model\">ir.model.button.rule</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">model_button_rule_form</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"model_button_click_view_list\">\n            <field name=\"model\">ir.model.button.click</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">model_button_click_list</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"model_button_click_view_form\">\n            <field name=\"model\">ir.model.button.click</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">model_button_click_form</field>\n        </record>\n\n        <record model=\"ir.action.act_window\"\n            id=\"act_model_button_click_form_relate_model_button\">\n            <field name=\"name\">Clicks</field>\n            <field name=\"res_model\">ir.model.button.click</field>\n            <field name=\"domain\"\n                eval=\"[If(Eval('active_ids', []) == [Eval('active_id')], ('button', '=', Eval('active_id')), ('button', 'in', Eval('active_ids')))]\"\n                pyson=\"1\"/>\n        </record>\n        <record model=\"ir.action.keyword\"\n            id=\"act_model_button_click_form_relate_model_button_keyword1\">\n            <field name=\"keyword\">form_relate</field>\n            <field name=\"model\">ir.model.button,-1</field>\n            <field name=\"action\"\n                ref=\"act_model_button_click_form_relate_model_button\"/>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"model_data_view_list\">\n            <field name=\"model\">ir.model.data</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">model_data_list</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"model_data_view_form\">\n            <field name=\"model\">ir.model.data</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">model_data_form</field>\n        </record>\n\n        <record model=\"ir.action.act_window\" id=\"act_model_data_form\">\n            <field name=\"name\">Data</field>\n            <field name=\"res_model\">ir.model.data</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_model_data_form_view1\">\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"view\" ref=\"model_data_view_list\"/>\n            <field name=\"act_window\" ref=\"act_model_data_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_model_data_form_view2\">\n            <field name=\"sequence\" eval=\"20\"/>\n            <field name=\"view\" ref=\"model_data_view_form\"/>\n            <field name=\"act_window\" ref=\"act_model_data_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.domain\"\n            id=\"act_model_data_form_domain_out_of_sync\">\n            <field name=\"name\">Out of Sync</field>\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"domain\" eval=\"[('out_of_sync', '=', True)]\" pyson=\"1\"/>\n            <field name=\"count\" eval=\"True\"/>\n            <field name=\"act_window\" ref=\"act_model_data_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.domain\"\n            id=\"act_model_data_form_domain_all\">\n            <field name=\"name\">All</field>\n            <field name=\"sequence\" eval=\"9999\"/>\n            <field name=\"domain\"></field>\n            <field name=\"act_window\" ref=\"act_model_data_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_model_form\"\n            action=\"act_model_data_form\"\n            sequence=\"50\"\n            id=\"menu_model_data_form\"/>\n        <record model=\"ir.model.button\" id=\"model_data_sync_button\">\n            <field name=\"name\">sync</field>\n            <field name=\"string\">Sync</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.model.data')]\"/>\n        </record>\n\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/module.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom functools import wraps\n\nfrom sql.operators import NotIn\n\nfrom trytond import backend\nfrom trytond.cache import Cache\nfrom trytond.exceptions import UserError\nfrom trytond.i18n import gettext\nfrom trytond.model import ModelSQL, ModelView, Unique, fields, sequence_ordered\nfrom trytond.model.exceptions import AccessError\nfrom trytond.modules import get_module_info, get_module_list\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval\nfrom trytond.rpc import RPC\nfrom trytond.transaction import Transaction\nfrom trytond.wizard import (\n    Button, StateAction, StateTransition, StateView, Wizard)\n\n\nclass DeactivateDependencyError(UserError):\n    pass\n\n\ndef filter_state(state):\n    def filter(func):\n        @wraps(func)\n        def wrapper(cls, modules):\n            modules = [m for m in modules if m.state == state]\n            return func(cls, modules)\n        return wrapper\n    return filter\n\n\nclass Module(ModelSQL, ModelView):\n    \"Module\"\n    __name__ = \"ir.module\"\n    name = fields.Char(\"Name\", readonly=True, required=True)\n    version = fields.Function(fields.Char('Version'), 'get_version')\n    dependencies = fields.One2Many('ir.module.dependency',\n        'module', 'Dependencies', readonly=True)\n    parents = fields.Function(fields.One2Many('ir.module', None, 'Parents'),\n        'get_parents')\n    childs = fields.Function(fields.One2Many('ir.module', None, 'Childs'),\n        'get_childs')\n    state = fields.Selection([\n        ('not activated', 'Not Activated'),\n        ('activated', 'Activated'),\n        ('to upgrade', 'To be upgraded'),\n        ('to remove', 'To be removed'),\n        ('to activate', 'To be activated'),\n        ], string='State', readonly=True)\n\n    @classmethod\n    def __setup__(cls):\n        super(Module, cls).__setup__()\n        table = cls.__table__()\n        cls._sql_constraints = [\n            ('name_uniq', Unique(table, table.name),\n                'The name of the module must be unique!'),\n        ]\n        cls._order.insert(0, ('name', 'ASC'))\n        cls.__rpc__.update({\n                'on_write': RPC(instantiate=0),\n                })\n        cls._buttons.update({\n                'activate': {\n                    'invisible': Eval('state') != 'not activated',\n                    'depends': ['state'],\n                    },\n                'activate_cancel': {\n                    'invisible': Eval('state') != 'to activate',\n                    'depends': ['state'],\n                    },\n                'deactivate': {\n                    'invisible': Eval('state') != 'activated',\n                    'depends': ['state'],\n                    },\n                'deactivate_cancel': {\n                    'invisible': Eval('state') != 'to remove',\n                    'depends': ['state'],\n                    },\n                'upgrade': {\n                    'invisible': Eval('state') != 'activated',\n                    'depends': ['state'],\n                    },\n                'upgrade_cancel': {\n                    'invisible': Eval('state') != 'to upgrade',\n                    'depends': ['state'],\n                    },\n                })\n\n    @classmethod\n    def __register__(cls, module_name):\n        pool = Pool()\n        ModelData = pool.get('ir.model.data')\n        sql_table = cls.__table__()\n        model_data_sql_table = ModelData.__table__()\n        cursor = Transaction().connection.cursor()\n\n        # Migration from 3.6: remove double module\n        old_table = 'ir_module_module'\n        if backend.TableHandler.table_exist(old_table):\n            backend.TableHandler.table_rename(old_table, cls._table)\n\n        super(Module, cls).__register__(module_name)\n\n        # Migration from 4.0: rename installed to activated\n        cursor.execute(*sql_table.update(\n                [sql_table.state], ['activated'],\n                where=sql_table.state == 'installed'))\n        cursor.execute(*sql_table.update(\n                [sql_table.state], ['not activated'],\n                where=sql_table.state == 'uninstalled'))\n\n        # Migration from 4.6: register buttons on ir module\n        button_fs_ids = [\n            'module_activate_button',\n            'module_activate_cancel_button',\n            'module_deactivate_button',\n            'module_deactivate_cancel_button',\n            'module_upgrade_button',\n            'module_upgrade_cancel_button',\n            ]\n        cursor.execute(*model_data_sql_table.update(\n                [model_data_sql_table.module], ['ir'],\n                where=((model_data_sql_table.module == 'res')\n                    & (model_data_sql_table.fs_id.in_(button_fs_ids)))))\n\n    @staticmethod\n    def default_state():\n        return 'not activated'\n\n    def get_version(self, name):\n        return get_module_info(self.name).get('version', '')\n\n    @classmethod\n    def get_parents(cls, modules, name):\n        parent_names = list(set(d.name for m in modules\n                    for d in m.dependencies))\n        parents = cls.search([\n                ('name', 'in', parent_names),\n                ])\n        name2id = dict((m.name, m.id) for m in parents)\n        return dict((m.id, [name2id[d.name] for d in m.dependencies])\n            for m in modules)\n\n    @classmethod\n    def get_childs(cls, modules, name):\n        child_ids = dict((m.id, []) for m in modules)\n        name2id = dict((m.name, m.id) for m in modules)\n        childs = cls.search([\n                ('dependencies.name', 'in', list(name2id.keys())),\n                ])\n        for child in childs:\n            for dep in child.dependencies:\n                if dep.name in name2id:\n                    child_ids[name2id[dep.name]].append(child.id)\n        return child_ids\n\n    @classmethod\n    def delete(cls, records):\n        for module in records:\n            if module.state in (\n                    'activated',\n                    'to upgrade',\n                    'to remove',\n                    'to activate',\n                    ):\n                raise AccessError(gettext('ir.msg_module_delete_state'))\n        return super(Module, cls).delete(records)\n\n    @classmethod\n    def on_write(cls, modules):\n        dependencies = set()\n\n        def get_parents(module):\n            parents = set(p.id for p in module.parents)\n            for p in module.parents:\n                parents.update(get_parents(p))\n            return parents\n\n        def get_childs(module):\n            childs = set(c.id for c in module.childs)\n            for c in module.childs:\n                childs.update(get_childs(c))\n            return childs\n\n        for module in modules:\n            dependencies.update(get_parents(module))\n            dependencies.update(get_childs(module))\n        return list(dependencies)\n\n    @classmethod\n    @ModelView.button\n    @filter_state('not activated')\n    def activate(cls, modules):\n        modules_activated = set(modules)\n\n        def get_parents(module):\n            parents = set(p for p in module.parents)\n            for p in module.parents:\n                parents.update(get_parents(p))\n            return parents\n\n        for module in modules:\n            modules_activated.update((m for m in get_parents(module)\n                    if m.state == 'not activated'))\n        cls.write(list(modules_activated), {\n                'state': 'to activate',\n                })\n\n    @classmethod\n    @ModelView.button\n    @filter_state('activated')\n    def upgrade(cls, modules):\n        modules_activated = set(modules)\n\n        def get_childs(module):\n            childs = set(c for c in module.childs)\n            for c in module.childs:\n                childs.update(get_childs(c))\n            return childs\n\n        for module in modules:\n            modules_activated.update((m for m in get_childs(module)\n                    if m.state == 'activated'))\n        cls.write(list(modules_activated), {\n                'state': 'to upgrade',\n                })\n\n    @classmethod\n    @ModelView.button\n    @filter_state('to activate')\n    def activate_cancel(cls, modules):\n        cls.write(modules, {\n                'state': 'not activated',\n                })\n\n    @classmethod\n    @ModelView.button\n    @filter_state('activated')\n    def deactivate(cls, modules):\n        pool = Pool()\n        Module = pool.get('ir.module')\n        Dependency = pool.get('ir.module.dependency')\n        module_table = Module.__table__()\n        dep_table = Dependency.__table__()\n        cursor = Transaction().connection.cursor()\n        for module in modules:\n            cursor.execute(*dep_table.join(module_table,\n                    condition=(dep_table.module == module_table.id)\n                    ).select(module_table.state, module_table.name,\n                    where=(dep_table.name == module.name)\n                    & NotIn(\n                        module_table.state, ['not activated', 'to remove'])))\n            res = cursor.fetchall()\n            if res:\n                raise DeactivateDependencyError(\n                    gettext('ir.msg_module_deactivate_dependency'),\n                    '\\n'.join('\\t%s: %s' % (x[0], x[1]) for x in res))\n        cls.write(modules, {'state': 'to remove'})\n\n    @classmethod\n    @ModelView.button\n    @filter_state('to remove')\n    def deactivate_cancel(cls, modules):\n        cls.write(modules, {'state': 'not activated'})\n\n    @classmethod\n    @ModelView.button\n    @filter_state('to upgrade')\n    def upgrade_cancel(cls, modules):\n        cls.write(modules, {'state': 'activated'})\n\n    @classmethod\n    def update_list(cls):\n        'Update the list of available packages'\n        count = 0\n        module_names = get_module_list()\n\n        modules = cls.search([])\n        name2id = dict((m.name, m.id) for m in modules)\n        cls.delete([m for m in modules\n                if m.state != 'activated' and m.name not in module_names])\n\n        # iterate through activated modules and mark them as being so\n        for name in module_names:\n            if name in name2id:\n                module = cls(name2id[name])\n                tryton = get_module_info(name)\n                cls._update_dependencies(module, tryton.get('depends', []))\n                continue\n\n            tryton = get_module_info(name)\n            if not tryton:\n                continue\n            module, = cls.create([{\n                        'name': name,\n                        'state': 'not activated',\n                        }])\n            count += 1\n            cls._update_dependencies(module, tryton.get('depends', []))\n        return count\n\n    @classmethod\n    def _update_dependencies(cls, module, depends=None):\n        pool = Pool()\n        Dependency = pool.get('ir.module.dependency')\n        Dependency.delete([x for x in module.dependencies\n            if x.name not in depends])\n        if depends is None:\n            depends = []\n        # Restart Browse Cache for deleted dependencies\n        module = cls(module.id)\n        dependency_names = [x.name for x in module.dependencies]\n        to_create = []\n        for depend in depends:\n            if depend not in dependency_names:\n                to_create.append({\n                        'module': module.id,\n                        'name': depend,\n                        })\n        if to_create:\n            Dependency.create(to_create)\n\n\nclass ModuleDependency(ModelSQL, ModelView):\n    \"Module dependency\"\n    __name__ = \"ir.module.dependency\"\n    name = fields.Char('Name')\n    module = fields.Many2One('ir.module', 'Module',\n       ondelete='CASCADE', required=True)\n    state = fields.Function(fields.Selection([\n                ('not activated', 'Not Activated'),\n                ('activated', 'Activated'),\n                ('to upgrade', 'To be upgraded'),\n                ('to remove', 'To be removed'),\n                ('to activate', 'To be activated'),\n                ('unknown', 'Unknown'),\n                ], 'State', readonly=True), 'get_state')\n\n    @classmethod\n    def __setup__(cls):\n        super(ModuleDependency, cls).__setup__()\n        table = cls.__table__()\n        cls._sql_constraints += [\n            ('name_module_uniq', Unique(table, table.name, table.module),\n                'Dependency must be unique by module!'),\n        ]\n\n    @classmethod\n    def __register__(cls, module_name):\n        # Migration from 3.6: remove double module\n        old_table = 'ir_module_module_dependency'\n        if backend.TableHandler.table_exist(old_table):\n            backend.TableHandler.table_rename(old_table, cls._table)\n\n        super(ModuleDependency, cls).__register__(module_name)\n\n    def get_state(self, name):\n        pool = Pool()\n        Module = pool.get('ir.module')\n        dependencies = Module.search([\n                ('name', '=', self.name),\n                ])\n        if dependencies:\n            return dependencies[0].state\n        else:\n            return 'unknown'\n\n\nclass ModuleConfigWizardItem(sequence_ordered(), ModelSQL, ModelView):\n    \"Config wizard to run after activating a module\"\n    __name__ = 'ir.module.config_wizard.item'\n    action = fields.Many2One('ir.action', 'Action', required=True,\n        readonly=True)\n    state = fields.Selection([\n        ('open', 'Open'),\n        ('done', 'Done'),\n        ], string=\"State\", required=True, sort=False)\n\n    @classmethod\n    def __register__(cls, module_name):\n        cursor = Transaction().connection.cursor()\n        pool = Pool()\n        ModelData = pool.get('ir.model.data')\n        model_data = ModelData.__table__()\n\n        # Migration from 3.6: remove double module\n        old_table = 'ir_module_module_config_wizard_item'\n        if backend.TableHandler.table_exist(old_table):\n            backend.TableHandler.table_rename(old_table, cls._table)\n        cursor.execute(*model_data.update(\n                columns=[model_data.model],\n                values=[cls.__name__],\n                where=(model_data.model\n                    == 'ir.module.module.config_wizard.item')))\n\n        super(ModuleConfigWizardItem, cls).__register__(module_name)\n\n        table = cls.__table_handler__(module_name)\n\n        # Migration from 5.0: remove required on sequence\n        table.not_null_action('sequence', 'remove')\n\n    @staticmethod\n    def default_state():\n        return 'open'\n\n    @staticmethod\n    def default_sequence():\n        return 10\n\n\nclass ModuleConfigWizardFirst(ModelView):\n    'Module Config Wizard First'\n    __name__ = 'ir.module.config_wizard.first'\n\n\nclass ModuleConfigWizardOther(ModelView):\n    'Module Config Wizard Other'\n    __name__ = 'ir.module.config_wizard.other'\n\n    percentage = fields.Float('Percentage', readonly=True)\n\n    @staticmethod\n    def default_percentage():\n        pool = Pool()\n        Item = pool.get('ir.module.config_wizard.item')\n        done = Item.search([\n            ('state', '=', 'done'),\n            ], count=True)\n        all = Item.search([], count=True)\n        return done / all\n\n\nclass ModuleConfigWizardDone(ModelView):\n    'Module Config Wizard Done'\n    __name__ = 'ir.module.config_wizard.done'\n\n\nclass ModuleConfigWizard(Wizard):\n    'Run config wizards'\n    __name__ = 'ir.module.config_wizard'\n\n    class ConfigStateAction(StateAction):\n\n        def __init__(self):\n            StateAction.__init__(self, None)\n\n        def get_action(self):\n            pool = Pool()\n            Item = pool.get('ir.module.config_wizard.item')\n            Action = pool.get('ir.action')\n            items = Item.search([\n                ('state', '=', 'open'),\n                ], limit=1)\n            if items:\n                item = items[0]\n                Item.write([item], {\n                        'state': 'done',\n                        })\n                return Action.get_action_values(item.action.type,\n                    [item.action.id])[0]\n\n    start = StateTransition()\n    first = StateView('ir.module.config_wizard.first',\n        'ir.module_config_wizard_first_view_form', [\n            Button('Cancel', 'end', 'tryton-cancel'),\n            Button('OK', 'action', 'tryton-ok', default=True),\n            ])\n    other = StateView('ir.module.config_wizard.other',\n        'ir.module_config_wizard_other_view_form', [\n            Button('Cancel', 'end', 'tryton-cancel'),\n            Button('Next', 'action', 'tryton-forward', default=True),\n            ])\n    action = ConfigStateAction()\n    done = StateView('ir.module.config_wizard.done',\n        'ir.module_config_wizard_done_view_form', [\n            Button('OK', 'end', 'tryton-ok', default=True),\n            ])\n\n    def transition_start(self):\n        res = self.transition_action()\n        if res == 'other':\n            return 'first'\n        return res\n\n    def transition_action(self):\n        pool = Pool()\n        Item = pool.get('ir.module.config_wizard.item')\n        ModelData = pool.get('ir.model.data')\n        items = Item.search([\n                ('state', '=', 'open'),\n                ])\n        if items:\n            return 'other'\n        items = Item.search([\n                ('state', '=', 'done'),\n                ], order=[('write_date', 'DESC')], limit=1)\n        if items:\n            item, = items\n            # module item will re-launch the config wizard\n            # so do not display the done message.\n            if item.id == ModelData.get_id('ir', 'config_wizard_item_module'):\n                return 'end'\n        return 'done'\n\n    def end(self):\n        return 'reload menu'\n\n\nclass ModuleActivateUpgradeStart(ModelView):\n    'Module Activate Upgrade Start'\n    __name__ = 'ir.module.activate_upgrade.start'\n    module_info = fields.Text('Modules to update', readonly=True)\n\n\nclass ModuleActivateUpgradeDone(ModelView):\n    'Module Activate Upgrade Done'\n    __name__ = 'ir.module.activate_upgrade.done'\n\n\nclass ModuleActivateUpgrade(Wizard):\n    \"Activate / Upgrade modules\"\n    __name__ = 'ir.module.activate_upgrade'\n\n    start = StateView('ir.module.activate_upgrade.start',\n        'ir.module_activate_upgrade_start_view_form', [\n            Button('Cancel', 'end', 'tryton-cancel'),\n            Button('Start Upgrade', 'upgrade', 'tryton-ok', default=True),\n            ])\n    upgrade = StateTransition()\n    done = StateView('ir.module.activate_upgrade.done',\n        'ir.module_activate_upgrade_done_view_form', [\n            Button(\"OK\", 'next_', 'tryton-ok', default=True),\n            ])\n    next_ = StateTransition()\n    config = StateAction('ir.act_module_config_wizard')\n\n    @classmethod\n    def check_access(cls):\n        # Use new transaction to prevent lock when activating modules\n        with Transaction().new_transaction():\n            super(ModuleActivateUpgrade, cls).check_access()\n\n    @staticmethod\n    def default_start(fields):\n        pool = Pool()\n        Module = pool.get('ir.module')\n        modules = Module.search([\n                ('state', 'in', ['to upgrade', 'to remove', 'to activate']),\n                ])\n        return {\n            'module_info': '\\n'.join(x.name + ': ' + x.state\n                for x in modules),\n            }\n\n    def __init__(self, session_id):\n        pass\n\n    def _save(self):\n        pass\n\n    def transition_upgrade(self):\n        pool = Pool()\n        Module = pool.get('ir.module')\n        Lang = pool.get('ir.lang')\n        transaction = Transaction()\n        with transaction.new_transaction():\n            modules = Module.search([\n                ('state', 'in', ['to upgrade', 'to remove', 'to activate']),\n                ])\n            update = [m.name for m in modules]\n            langs = Lang.search([\n                ('translatable', '=', True),\n                ])\n            lang = [x.code for x in langs]\n        if update:\n            pool.init(update=update, lang=lang)\n            Cache.refresh_pool(transaction)\n        return 'done'\n\n    def transition_next_(self):\n        pool = Pool()\n        Item = pool.get('ir.module.config_wizard.item')\n        items = Item.search([\n            ('state', '=', 'open'),\n            ], limit=1)\n        if items:\n            return 'config'\n        else:\n            return 'end'\n\n    def end(self):\n        return 'reload menu'\n\n\nclass ModuleConfig(Wizard):\n    'Configure Modules'\n    __name__ = 'ir.module.config'\n\n    start = StateView('ir.module.config.start',\n        'ir.module_config_start_view_form', [\n            Button(\"Cancel\", 'end', 'tryton-cancel'),\n            Button(\"Activate\", 'activate', 'tryton-ok', default=True),\n            ])\n    activate = StateAction('ir.act_module_activate_upgrade')\n\n    def do_activate(self, action):\n        pool = Pool()\n        Module = pool.get('ir.module')\n        Module.activate(list(self.start.modules))\n        return action, {}\n\n    @classmethod\n    def transition_activate(cls):\n        return 'end'\n\n\nclass ModuleConfigStart(ModelView):\n    \"Configure Modules\"\n    __name__ = 'ir.module.config.start'\n\n    modules = fields.Many2Many(\n        'ir.module', None, None, \"Modules\",\n        domain=[\n            ('state', '=', 'not activated'),\n            ])\n"
  },
  {
    "path": "trytond/ir/module.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <menuitem\n            name=\"Modules\"\n            parent=\"menu_administration\"\n            sequence=\"20\"\n            id=\"menu_modules\"/>\n        <record model=\"ir.ui.view\" id=\"module_view_form\">\n            <field name=\"model\">ir.module</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">module_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"module_view_tree\">\n            <field name=\"model\">ir.module</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">module_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_module_form\">\n            <field name=\"name\">Modules</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">ir.module</field>\n            <field name=\"domain\" eval=\"[('name', '!=', 'tests')]\" pyson=\"1\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_module_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"module_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_module_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_module_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"module_view_form\"/>\n            <field name=\"act_window\" ref=\"act_module_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_modules\"\n            action=\"act_module_form\"\n            sequence=\"10\"\n            id=\"menu_module_form\"/>\n\n        <record model=\"ir.model.button\" id=\"module_activate_button\">\n            <field name=\"name\">activate</field>\n            <field name=\"string\">Mark for Activation</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.module')]\"/>\n        </record>\n        <record model=\"ir.model.button\" id=\"module_activate_cancel_button\">\n            <field name=\"name\">activate_cancel</field>\n            <field name=\"string\">Cancel Activation</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.module')]\"/>\n        </record>\n        <record model=\"ir.model.button\" id=\"module_deactivate_button\">\n            <field name=\"name\">deactivate</field>\n            <field name=\"string\">Mark for Deactivation (beta)</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.module')]\"/>\n        </record>\n        <record model=\"ir.model.button\" id=\"module_deactivate_cancel_button\">\n            <field name=\"name\">deactivate_cancel</field>\n            <field name=\"string\">Cancel Deactivation</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.module')]\"/>\n        </record>\n        <record model=\"ir.model.button\" id=\"module_upgrade_button\">\n            <field name=\"name\">upgrade</field>\n            <field name=\"string\">Mark for Upgrade</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.module')]\"/>\n        </record>\n        <record model=\"ir.model.button\" id=\"module_upgrade_cancel_button\">\n            <field name=\"name\">upgrade_cancel</field>\n            <field name=\"string\">Cancel Upgrade</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.module')]\"/>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"module_dependency_view_form\">\n            <field name=\"model\">ir.module.dependency</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">module_dependency_form</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"module_dependency_view_list\">\n            <field name=\"model\">ir.module.dependency</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">module_dependency_list</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"config_wizard_item_view_tree\">\n            <field name=\"model\">ir.module.config_wizard.item</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">module_config_wizard_item_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_config_wizard_item_form\">\n            <field name=\"name\">Config Wizard Items</field>\n            <field name=\"res_model\">ir.module.config_wizard.item</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_config_wizard_item_form_view1\">\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"view\" ref=\"config_wizard_item_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_config_wizard_item_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_modules\"\n            action=\"act_config_wizard_item_form\"\n            sequence=\"50\"\n            id=\"menu_config_wizard_item_form\"/>\n\n        <record model=\"ir.action.wizard\" id=\"act_module_config_wizard\">\n            <field name=\"name\">Module Configuration</field>\n            <field name=\"wiz_name\">ir.module.config_wizard</field>\n            <field name=\"window\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.action.keyword\" id=\"act_module_config_wizard_keyword\">\n            <field name=\"action\" ref=\"act_module_config_wizard\"/>\n            <field name=\"keyword\">form_action</field>\n            <field name=\"model\">ir.module.config_wizard.item,-1</field>\n        </record>\n\n\n        <record model=\"ir.ui.view\" id=\"module_config_wizard_first_view_form\">\n            <field name=\"model\">ir.module.config_wizard.first</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">module_config_wizard_first_form</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"module_config_wizard_other_view_form\">\n            <field name=\"model\">ir.module.config_wizard.other</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">module_config_wizard_other_form</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"module_config_wizard_done_view_form\">\n            <field name=\"model\">ir.module.config_wizard.done</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">module_config_wizard_done_form</field>\n        </record>\n\n        <record model=\"ir.action.wizard\" id=\"act_module_activate_upgrade\">\n            <field name=\"name\">Perform Pending Activation/Upgrade</field>\n            <field name=\"wiz_name\">ir.module.activate_upgrade</field>\n        </record>\n        <record model=\"ir.action.keyword\" id=\"act_module_activate_upgrade_keyword1\">\n            <field name=\"action\" ref=\"act_module_activate_upgrade\"/>\n            <field name=\"keyword\">form_action</field>\n            <field name=\"model\">ir.module,-1</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"module_activate_upgrade_start_view_form\">\n            <field name=\"model\">ir.module.activate_upgrade.start</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">module_activate_upgrade_start_form</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"module_activate_upgrade_done_view_form\">\n            <field name=\"model\">ir.module.activate_upgrade.done</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">module_activate_upgrade_done_form</field>\n        </record>\n\n        <menuitem\n            parent=\"menu_modules\"\n            action=\"act_module_activate_upgrade\"\n            sequence=\"90\"\n            id=\"menu_module_activate_upgrade\"/>\n\n        <record model=\"ir.action.wizard\" id=\"act_module_config\">\n            <field name=\"name\">Configure Modules</field>\n            <field name=\"wiz_name\">ir.module.config</field>\n            <field name=\"window\" eval=\"True\"/>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"module_config_start_view_form\">\n            <field name=\"model\">ir.module.config.start</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">module_config_start_form</field>\n        </record>\n\n        <record model=\"ir.module.config_wizard.item\"\n            id=\"config_wizard_item_module\">\n            <field name=\"action\" ref=\"act_module_config\"/>\n            <field name=\"sequence\" eval=\"10000\"/>\n        </record>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/note.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom textwrap import TextWrapper\n\nfrom sql import Null\nfrom sql.conditionals import Case\n\nfrom trytond.i18n import lazy_gettext\nfrom trytond.model import ModelSQL, ModelStorage, ModelView, fields\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval\nfrom trytond.tools import grouped_slice, reduce_ids\nfrom trytond.transaction import Transaction\n\nfrom .resource import ResourceMixin, resource_copy\n\n__all__ = ['NoteCopyMixin']\n\n\nclass Note(ResourceMixin, ModelSQL, ModelView):\n    \"Note\"\n    __name__ = 'ir.note'\n    message = fields.Text('Message', states={\n            'readonly': Eval('id', 0) > 0,\n            })\n    message_wrapped = fields.Function(fields.Text('Message'),\n        'on_change_with_message_wrapped')\n    unread = fields.Function(fields.Boolean('Unread'), 'get_unread',\n        searcher='search_unread', setter='set_unread')\n\n    @staticmethod\n    def default_unread():\n        return False\n\n    @classmethod\n    def get_wrapper(cls):\n        return TextWrapper(width=79)\n\n    @fields.depends('message')\n    def on_change_with_message_wrapped(self, name=None):\n        wrapper = self.get_wrapper()\n        message = self.message or ''\n        return '\\n'.join(map(wrapper.fill, message.splitlines()))\n\n    @classmethod\n    def get_unread(cls, ids, name):\n        pool = Pool()\n        Read = pool.get('ir.note.read')\n        cursor = Transaction().connection.cursor()\n        user_id = Transaction().user\n        table = cls.__table__()\n        read = Read.__table__()\n\n        unread = {}\n        for sub_ids in grouped_slice(ids):\n            where = reduce_ids(table.id, sub_ids)\n            query = table.join(read, 'LEFT',\n                condition=(table.id == read.note)\n                & (read.user == user_id)\n                ).select(table.id,\n                    Case((read.user != Null, False), else_=True),\n                    where=where)\n            cursor.execute(*query)\n            unread.update(cursor)\n        return unread\n\n    @classmethod\n    def search_unread(cls, name, clause):\n        pool = Pool()\n        Read = pool.get('ir.note.read')\n        user_id = Transaction().user\n        table = cls.__table__()\n        read = Read.__table__()\n\n        _, operator, value = clause\n        assert operator in ['=', '!=']\n        Operator = fields.SQL_OPERATORS[operator]\n\n        where = Operator(Case((read.user != Null, False), else_=True), value)\n        query = table.join(read, 'LEFT',\n            condition=(table.id == read.note)\n            & (read.user == user_id)\n            ).select(table.id, where=where)\n        return [('id', 'in', query)]\n\n    @classmethod\n    def set_unread(cls, notes, name, value):\n        pool = Pool()\n        Read = pool.get('ir.note.read')\n        user_id = Transaction().user\n        if not value:\n            Read.create([{'note': n.id, 'user': user_id} for n in notes])\n        else:\n            reads = []\n            for sub_notes in grouped_slice(notes):\n                reads += Read.search([\n                        ('note', 'in', [n.id for n in sub_notes]),\n                        ('user', '=', user_id),\n                        ])\n            Read.delete(reads)\n\n    @classmethod\n    def write(cls, notes, values, *args):\n        # Avoid changing write meta data if only unread is set\n        if args or set(values.keys()) != {'unread'}:\n            super(Note, cls).write(notes, values, *args)\n        else:\n            # Check access write and clean cache\n            # Use __func__ to directly access ModelStorage's write method and\n            # pass it the right class\n            ModelStorage.write.__func__(cls, notes, values)\n            cls.set_unread(notes, 'unread', values['unread'])\n\n\nclass NoteRead(ModelSQL):\n    \"Note Read\"\n    __name__ = 'ir.note.read'\n    note = fields.Many2One('ir.note', 'Note', required=True,\n        ondelete='CASCADE')\n    user = fields.Many2One('res.user', 'User', required=True,\n        ondelete='CASCADE')\n\n\nclass NoteCopyMixin(\n        resource_copy('ir.note', 'notes', lazy_gettext('ir.msg_notes'))):\n    pass\n"
  },
  {
    "path": "trytond/ir/note.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <record model=\"ir.ui.view\" id=\"note_view_form\">\n            <field name=\"model\">ir.note</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">note_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"note_view_list\">\n            <field name=\"model\">ir.note</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">note_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_note_form\">\n            <field name=\"name\">Notes</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">ir.note</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_note_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"note_view_list\"/>\n            <field name=\"act_window\" ref=\"act_note_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_note_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"note_view_form\"/>\n            <field name=\"act_window\" ref=\"act_note_form\"/>\n        </record>\n        <menuitem\n            parent=\"ir.menu_models\"\n            action=\"act_note_form\"\n            sequence=\"50\"\n            id=\"menu_note_form\"/>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/queue.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data noupdate=\"1\">\n        <record model=\"ir.cron\" id=\"cron_queue_clean\">\n            <field name=\"method\">ir.queue|clean</field>\n            <field name=\"interval_number\" eval=\"1\"/>\n            <field name=\"interval_type\">days</field>\n        </record>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/queue_.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\n\nfrom sql import Literal, Null, With\nfrom sql.aggregate import Min\nfrom sql.functions import CurrentTimestamp, Extract\n\nfrom trytond.config import config\nfrom trytond.model import Index, ModelSQL, fields\nfrom trytond.pool import Pool\nfrom trytond.tools import grouped_slice\nfrom trytond.transaction import Transaction\n\nhas_worker = config.getboolean('queue', 'worker', default=False)\nclean_days = config.getint('queue', 'clean_days', default=30)\nbatch_size = config.getint('queue', 'batch_size', default=20)\n\n\nclass Queue(ModelSQL):\n    \"Queue\"\n    __name__ = 'ir.queue'\n    name = fields.Char(\"Name\", required=True)\n\n    data = fields.Dict(None, \"Data\")\n\n    enqueued_at = fields.Timestamp(\"Enqueued at\", required=True)\n    dequeued_at = fields.Timestamp(\"Dequeued at\")\n    finished_at = fields.Timestamp(\"Finished at\")\n\n    scheduled_at = fields.Timestamp(\"Scheduled at\",\n        help=\"When the task can start.\")\n    expected_at = fields.Timestamp(\"Expected at\",\n        help=\"When the task should be done.\")\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        table = cls.__table__()\n\n        cls._sql_indexes.add(\n            Index(\n                table,\n                (table.scheduled_at, Index.Range(nulls_first=True)),\n                (table.expected_at, Index.Range(nulls_first=True)),\n                (table.dequeued_at, Index.Equality()),\n                (table.name, Index.Equality())))\n\n    @classmethod\n    def default_enqueued_at(cls):\n        return datetime.datetime.now()\n\n    @classmethod\n    def copy(cls, records, default=None):\n        if default is None:\n            default = {}\n        else:\n            default = default.copy()\n        default.setdefault('enqueued_at')\n        default.setdefault('dequeued_at')\n        default.setdefault('finished_at')\n        return super(Queue, cls).copy(records, default=default)\n\n    @classmethod\n    def push(cls, name, data, scheduled_at=None, expected_at=None):\n        transaction = Transaction()\n        database = transaction.database\n        cursor = transaction.connection.cursor()\n        with transaction.set_user(0):\n            record, = cls.create([{\n                        'name': name,\n                        'data': data,\n                        'scheduled_at': scheduled_at,\n                        'expected_at': expected_at,\n                        }])\n        if database.has_channel():\n            cursor.execute('NOTIFY \"%s\"', (cls.__name__,))\n        if not has_worker:\n            transaction.tasks.append(record.id)\n        return record.id\n\n    @classmethod\n    def pull(cls, database, connection, name=None):\n        cursor = connection.cursor()\n        queue = cls.__table__()\n        queue_c = cls.__table__()\n        queue_s = cls.__table__()\n\n        candidates = With('id', 'scheduled_at', 'expected_at',\n            query=queue_c.select(\n                queue_c.id,\n                queue_c.scheduled_at,\n                queue_c.expected_at,\n                where=((queue_c.name == name) if name else Literal(True))\n                & (queue_c.dequeued_at == Null),\n                order_by=[\n                    queue_c.scheduled_at.nulls_first,\n                    queue_c.expected_at.nulls_first]))\n        selected = queue_s.select(\n            queue_s.id,\n            where=((queue_s.name == name) if name else Literal(True))\n            & (queue_s.dequeued_at == Null)\n            & ((queue_s.scheduled_at <= CurrentTimestamp())\n                | (queue_s.scheduled_at == Null)),\n            order_by=[\n                queue_s.scheduled_at.nulls_first,\n                queue_s.expected_at.nulls_first],\n            limit=1)\n        if database.has_select_for():\n            For = database.get_select_for_skip_locked()\n            selected.for_ = For('UPDATE')\n\n        next_timeout = With('seconds', query=candidates.select(\n                Min(Extract('EPOCH',\n                        candidates.scheduled_at - CurrentTimestamp())\n                    ),\n                where=candidates.scheduled_at >= CurrentTimestamp()))\n\n        task_id, seconds = None, None\n        if database.has_returning():\n            query = queue.update([queue.dequeued_at], [CurrentTimestamp()],\n                where=queue.id.in_(selected),\n                with_=[candidates, next_timeout],\n                returning=[\n                    queue.id, next_timeout.select(next_timeout.seconds)])\n            cursor.execute(*query)\n            row = cursor.fetchone()\n            if row:\n                task_id, seconds = row\n        else:\n            query = queue.select(queue.id,\n                where=queue.id.in_(selected),\n                with_=[candidates])\n            cursor.execute(*query)\n            row = cursor.fetchone()\n            if row:\n                task_id, = row\n                query = queue.update([queue.dequeued_at], [CurrentTimestamp()],\n                    where=queue.id == task_id)\n                cursor.execute(*query)\n            query = next_timeout.select(next_timeout.seconds)\n            cursor.execute(*query)\n            row = cursor.fetchone()\n            if row:\n                seconds, = row\n\n        if not task_id and database.has_channel():\n            cursor.execute('LISTEN \"%s\"', (cls.__name__,))\n        return task_id, seconds\n\n    def run(self):\n        transaction = Transaction()\n        Model = Pool().get(self.data['model'])\n        with transaction.set_user(self.data['user']), \\\n                transaction.set_context(\n                    self.data['context'], _skip_warnings=True):\n            instances = self.data['instances']\n            # Ensure record ids still exist\n            if isinstance(instances, int):\n                with transaction.set_context(active_test=False):\n                    if Model.search([('id', '=', instances)]):\n                        instances = Model(instances)\n                    else:\n                        instances = None\n            else:\n                ids = set()\n                with transaction.set_context(active_test=False):\n                    for sub_ids in grouped_slice(instances):\n                        records = Model.search([('id', 'in', list(sub_ids))])\n                        ids.update(map(int, records))\n                if ids:\n                    instances = Model.browse(\n                        [i for i in instances if i in ids])\n                else:\n                    instances = None\n            if instances is not None:\n                getattr(Model, self.data['method'])(\n                    instances, *self.data['args'], **self.data['kwargs'])\n        if not self.dequeued_at:\n            self.dequeued_at = datetime.datetime.now()\n        self.finished_at = datetime.datetime.now()\n        self.save()\n\n    @classmethod\n    def clean(cls, date=None):\n        if date is None:\n            date = (\n                datetime.datetime.now() - datetime.timedelta(days=clean_days))\n        tasks = cls.search(['OR',\n                ('dequeued_at', '<', date),\n                ('finished_at', '<', date),\n                ])\n        cls.delete(tasks)\n\n    @classmethod\n    def caller(cls, model):\n        return _Model(cls, model)\n\n\nclass _Model(object):\n    def __init__(self, queue, model):\n        self.__queue = queue\n        self.__model = model\n\n    def __getattr__(self, name):\n        return _Method(self.__queue, self.__model, name)\n\n\nclass _Method(object):\n    def __init__(self, queue, model, name):\n        self.__queue = queue\n        self.__model = model\n        self.__name = name\n\n    def __call__(self, instances, *args, **kwargs):\n        transaction = Transaction()\n        context = transaction.context.copy()\n        name = context.pop('queue_name', 'default')\n        now = datetime.datetime.now()\n        scheduled_at = context.pop('queue_scheduled_at', None)\n        if scheduled_at is not None:\n            scheduled_at = now + scheduled_at\n        expected_at = context.pop('queue_expected_at', None)\n        queue_batch = context.pop('queue_batch', None)\n        context.pop('_check_access', None)\n        context.pop('language', None)\n        if expected_at is not None:\n            expected_at = now + expected_at\n        try:\n            instances = list(map(int, instances))\n        except TypeError:\n            instances = int(instances)\n\n        def _push(instances):\n            data = {\n                'model': self.__model.__name__,\n                'method': self.__name,\n                'user': transaction.user,\n                'context': context,\n                'instances': instances,\n                'args': args,\n                'kwargs': kwargs,\n                }\n            return self.__queue.push(\n                name, data,\n                scheduled_at=scheduled_at, expected_at=expected_at)\n\n        if isinstance(instances, list):\n            if has_worker and queue_batch:\n                if isinstance(queue_batch, int):\n                    count = queue_batch\n                else:\n                    count = batch_size\n            else:\n                count = len(instances)\n            task_ids = []\n            for sub_instances in grouped_slice(instances, count=count):\n                task_ids.append(_push(list(sub_instances)))\n            return task_ids\n        else:\n            return _push(instances)\n"
  },
  {
    "path": "trytond/ir/resource.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom sql.conditionals import Coalesce\n\nfrom trytond.i18n import lazy_gettext\nfrom trytond.model import Index, ModelSQL, ModelStorage, ModelView, fields\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval\nfrom trytond.transaction import Transaction\n\n__all__ = ['ResourceAccessMixin', 'ResourceMixin', 'resource_copy']\n\n\nclass ResourceAccessMixin(ModelStorage):\n\n    resource = fields.Reference(\n        \"Resource\", selection='get_models', required=True)\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        if issubclass(cls, ModelSQL):\n            table = cls.__table__()\n            cls._sql_indexes.add(\n                Index(table, (table.resource, Index.Similarity(begin=True))))\n\n    @classmethod\n    def default_resource(cls):\n        return Transaction().context.get('resource')\n\n    @staticmethod\n    def get_models():\n        pool = Pool()\n        Model = pool.get('ir.model')\n        ModelAccess = pool.get('ir.model.access')\n        models = Model.get_name_items()\n        access = ModelAccess.get_access([m for m, _ in models])\n        return [(m, n) for m, n in models if access[m]['read']]\n\n    @classmethod\n    def check_access(cls, ids, mode='read'):\n        pool = Pool()\n        ModelAccess = pool.get('ir.model.access')\n        if ((Transaction().user == 0)\n                or not Transaction().context.get('_check_access')):\n            return\n        model_names = set()\n        with Transaction().set_context(_check_access=False):\n            for record in cls.browse(ids):\n                if record.resource:\n                    model_names.add(str(record.resource).split(',')[0])\n        for model_name in model_names:\n            checks = cls._convert_check_access(model_name, mode)\n            for model, check_mode in checks:\n                ModelAccess.check(model, mode=check_mode)\n\n    @classmethod\n    def _convert_check_access(cls, model, mode):\n        return [\n            (model, {'create': 'write', 'delete': 'write'}.get(mode, mode))]\n\n    @classmethod\n    def read(cls, ids, fields_names):\n        cls.check_access(ids, mode='read')\n        return super().read(ids, fields_names)\n\n    @classmethod\n    def delete(cls, records):\n        cls.check_access([a.id for a in records], mode='delete')\n        super().delete(records)\n\n    @classmethod\n    def write(cls, records, values, *args):\n        all_records = []\n        actions = iter((records, values) + args)\n        for other_records, _ in zip(actions, actions):\n            all_records += other_records\n        cls.check_access([a.id for a in all_records], mode='write')\n        super().write(records, values, *args)\n        cls.check_access(all_records, mode='write')\n\n    @classmethod\n    def create(cls, vlist):\n        records = super().create(vlist)\n        cls.check_access([r.id for r in records], mode='create')\n        return records\n\n\nclass ResourceMixin(ResourceAccessMixin, ModelStorage, ModelView):\n\n    copy_to_resources = fields.MultiSelection(\n        'get_copy_to_resources', \"Copy to Resources\",\n        states={\n            'invisible': ~Eval('copy_to_resources_visible'),\n            },\n        depends=['copy_to_resources_visible'])\n    copy_to_resources_visible = fields.Function(\n        fields.Boolean(\"Copy to Resources Visible\"),\n        'on_change_with_copy_to_resources_visible')\n    last_user = fields.Function(fields.Char('Last User',\n            states={\n                'invisible': ~Eval('last_user'),\n                }),\n        'get_last_user')\n    last_modification = fields.Function(fields.DateTime('Last Modification',\n            states={\n                'invisible': ~Eval('last_modification'),\n                }),\n        'get_last_modification')\n\n    @classmethod\n    def __setup__(cls):\n        super(ResourceMixin, cls).__setup__()\n        cls._order.insert(0, ('last_modification', 'DESC'))\n        cls.resource.required = True\n\n    @fields.depends('resource')\n    def get_copy_to_resources(self):\n        pool = Pool()\n        Model = pool.get('ir.model')\n        resources = []\n        if isinstance(self.resource, ResourceCopyMixin):\n            models = self.resource.get_resources_to_copy(self.__name__)\n            resources.extend((m, Model.get_name(m)) for m in models)\n        return resources\n\n    @fields.depends(methods=['get_copy_to_resources'])\n    def on_change_with_copy_to_resources_visible(self, name=None):\n        return bool(self.get_copy_to_resources())\n\n    def get_last_user(self, name):\n        return (self.write_uid.rec_name if self.write_uid\n            else self.create_uid.rec_name)\n\n    def get_last_modification(self, name):\n        return (self.write_date if self.write_date else self.create_date\n            ).replace(microsecond=0)\n\n    @staticmethod\n    def order_last_modification(tables):\n        table, _ = tables[None]\n        return [Coalesce(table.write_date, table.create_date)]\n\n\nclass ResourceCopyMixin(ModelStorage):\n\n    @classmethod\n    def get_resources_to_copy(cls, name):\n        return set()\n\n\ndef resource_copy(resource, name, string):\n\n    class _ResourceCopyMixin(ResourceCopyMixin):\n\n        @classmethod\n        def copy(cls, records, default=None):\n            if default is None:\n                default = {}\n            else:\n                default = default.copy()\n            default.setdefault(name, None)\n            return super().copy(records, default=default)\n\n        def copy_resources_to(self, target):\n            pool = Pool()\n            Resource = pool.get(resource)\n\n            try:\n                super().copy_resources_to(target)\n            except AttributeError:\n                pass\n\n            to_copy = []\n            for record in getattr(self, name):\n                if (record.copy_to_resources\n                        and target.__name__ in record.copy_to_resources):\n                    to_copy.append(record)\n            if to_copy:\n                return Resource.copy(to_copy, default={\n                        'resource': str(target),\n                        'copy_to_resources': None,\n                        })\n\n    setattr(_ResourceCopyMixin, name, fields.One2Many(\n            resource, 'resource', string,\n            help=lazy_gettext('ir.msg_resource_copy_help')))\n    return _ResourceCopyMixin\n"
  },
  {
    "path": "trytond/ir/routes.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport csv\nimport datetime as dt\nimport io\nimport json\nfrom numbers import Number\n\ntry:\n    from http import HTTPStatus\nexcept ImportError:\n    from http import client as HTTPStatus\n\nfrom werkzeug.exceptions import abort\nfrom werkzeug.utils import redirect\nfrom werkzeug.wrappers import Response\n\nfrom trytond.config import config\nfrom trytond.i18n import gettext\nfrom trytond.protocols.jsonrpc import JSONDecoder\nfrom trytond.protocols.wrappers import with_pool, with_transaction\nfrom trytond.tools import slugify\nfrom trytond.transaction import Transaction\nfrom trytond.wsgi import app\n\nSOURCE = config.get(\n    'html', 'src', default='https://cloud.tinymce.com/stable/tinymce.min.js')\nAVATAR_TIMEOUT = config.getint(\n    'web', 'avatar_timeout', default=7 * 24 * 60 * 60)\n\n\ndef get_token(record):\n    return str((record.write_date or record.create_date).timestamp())\n\n\ndef get_config(names, section='html', default=None):\n    names = names[:]\n    while names:\n        value = config.get(section, '-'.join(names))\n        if value is not None:\n            return value\n        names = names[:-1]\n    return default\n\n\n@app.route('/<database_name>/ir/html/<model>/<int:record>/<field>',\n    methods={'GET', 'POST'})\n@app.auth_required\n@with_pool\n@with_transaction(\n    user='request', context=dict(_check_access=True, fuzzy_translation=True))\ndef html_editor(request, pool, model, record, field):\n    Field = pool.get('ir.model.field')\n    field, = Field.search([\n            ('name', '=', field),\n            ('model.model', '=', model),\n            ])\n\n    transaction = Transaction()\n    language = request.args.get('language', transaction.language)\n    with transaction.set_context(language=language):\n        Model = pool.get(model)\n        record = Model(record)\n\n        status = HTTPStatus.OK\n        error = ''\n        if request.method == 'POST':\n            setattr(record, field.name, request.form['text'])\n            if request.form['_csrf_token'] == get_token(record):\n                record.save()\n                return redirect(request.url)\n            else:\n                status = HTTPStatus.BAD_REQUEST\n                error = gettext('ir.msg_html_editor_save_fail')\n\n        csrf_token = get_token(record)\n        text = getattr(record, field.name) or ''\n        if isinstance(text, bytes):\n            try:\n                text = text.decode('utf-8')\n            except UnicodeDecodeError as e:\n                error = str(e).replace(\"'\", \"\\\\'\")\n                text = ''\n        elif not isinstance(text, str):\n            abort(HTTPStatus.BAD_REQUEST)\n        title = '%(model)s \"%(name)s\" %(field)s - %(title)s' % {\n            'model': field.model.name,\n            'name': record.rec_name,\n            'field': field.field_description,\n            'title': request.args.get('title', \"Tryton\"),\n            }\n\n        return Response(TEMPLATE % {\n                'source': SOURCE,\n                'plugins': get_config(\n                    ['plugins', model, field.name], default=''),\n                'css': get_config(\n                    ['css', model, field.name], default='[]'),\n                'class': get_config(\n                    ['class', model, field.name], default=\"''\"),\n                'language': transaction.language,\n                'title': title,\n                'text': text,\n                'csrf_token': csrf_token,\n                'error': error,\n                }, status, content_type='text/html')\n\n\nTEMPLATE = '''<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\"/>\n    <script src=\"%(source)s\"></script>\n    <script>\n    tinymce.init({\n        selector: '#text',\n        language: '%(language)s',\n        plugins: 'fullscreen autosave code %(plugins)s',\n        removed_menuitems: 'newdocument',\n        toolbar: 'save | undo redo | styleselect | bold italic | ' +\n            'alignleft aligncenter alignright alignjustify | ' +\n            'bullist numlist outdent indent | link image | close',\n        extended_valid_elements:\n            'py:if[test],' +\n            'py:choose[test],py:when[test],py:otherwise,' +\n            'py:for[each],' +\n            'py:def[function],' +\n            'py:match[path],' +\n            'py:with[vars],' +\n            'py:replace[value]',\n        custom_elements:\n            'py:if,' +\n            'py:choose,py:when,py:otherwise,' +\n            'py:for,' +\n            'py:def,' +\n            'py:match,' +\n            'py:with,' +\n            'py:replace',\n        content_css: %(css)s,\n        body_class: %(class)s,\n        setup: function(editor) {\n            editor.addMenuItem('save', {\n                text: 'Save',\n                icon: 'save',\n                context: 'file',\n                cmd: 'save',\n            });\n            editor.addButton('save', {\n                title: 'Save',\n                icon: 'save',\n                cmd: 'save',\n            });\n            editor.addShortcut('ctrl+s', 'save', 'save');\n            editor.addCommand('save', function() {\n                document.form.submit();\n            });\n            editor.addButton('close', {\n                title: 'Close',\n                icon: 'remove',\n                onclick: function() {\n                    window.location =\n                        window.location.protocol + '//_@' +\n                        window.location.host +\n                        window.location.pathname;\n                    window.close();\n                },\n            });\n        },\n        init_instance_callback: function(editor) {\n            editor.execCommand('mceFullScreen');\n            var error = '%(error)s';\n            if (error) {\n                editor.notificationManager.open({\n                    text: error,\n                    type: 'error',\n                });\n            }\n        },\n    });\n    </script>\n    <title>%(title)s</title>\n</head>\n<body>\n    <form name=\"form\" method=\"post\" style=\"display: block; text-align: center\">\n        <textarea id=\"text\" name=\"text\">%(text)s</textarea>\n        <input name=\"_csrf_token\" type=\"hidden\" value=\"%(csrf_token)s\">\n    </form>\n</body>\n</html>'''\n\n\n@app.route('/<database_name>/data/<model>', methods={'GET'})\n@app.auth_required\n@with_pool\n@with_transaction(user='request', context=dict(_check_access=True))\ndef data(request, pool, model):\n    User = pool.get('res.user')\n    Lang = pool.get('ir.lang')\n    try:\n        Model = pool.get(model)\n    except KeyError:\n        abort(HTTPStatus.NOT_FOUND)\n    transaction = Transaction()\n    context = User(transaction.user).get_preferences(context_only=True)\n    language = request.args.get('l')\n    if language:\n        context['language'] = language\n    try:\n        domain = json.loads(\n            request.args.get('d', '[]'), object_hook=JSONDecoder())\n    except json.JSONDecodeError:\n        abort(HTTPStatus.BAD_REQUEST)\n    try:\n        ctx = json.loads(\n            request.args.get('c', '{}'), object_hook=JSONDecoder())\n    except json.JSONDecoder:\n        abort(HTTPStatus.BAD_REQUEST)\n    for key in list(ctx.keys()):\n        if key.startswith('_') and key != '_datetime':\n            del ctx[key]\n    context.update(ctx)\n    limit = None\n    offset = 0\n    if 's' in request.args:\n        try:\n            limit = int(request.args.get('s'))\n            if 'p' in request.args:\n                offset = int(request.args.get('p')) * limit\n        except ValueError:\n            abort(HTTPStatus.BAD_REQUEST)\n    if 'o' in request.args:\n        order = [(o.split(',', 1) + [''])[:2]\n            for o in request.args.getlist('o')]\n    else:\n        order = None\n    fields_names = request.args.getlist('f')\n    encoding = request.args.get('enc', 'UTF-8')\n    delimiter = request.args.get('dl', ',')\n    quotechar = request.args.get('qc', '\"')\n    try:\n        header = bool(int(request.args.get('h', True)))\n        locale_format = bool(int(request.args.get('loc', False)))\n    except ValueError:\n        abort(HTTPStatus.BAD_REQUEST)\n\n    with transaction.set_context(**context):\n        lang = Lang.get(transaction.language)\n\n        def format_(row):\n            for i, value in enumerate(row):\n                if locale_format:\n                    if isinstance(value, Number):\n                        value = lang.format('%.12g', value)\n                    elif isinstance(value, (dt.date, dt.datetime)):\n                        value = lang.strftime(value)\n                elif isinstance(value, bool):\n                    value = int(value)\n                row[i] = value\n            return row\n\n        try:\n            if domain and isinstance(domain[0], (int, float)):\n                rows = Model.export_data(domain, fields_names, header)\n            else:\n                rows = Model.export_data_domain(\n                    domain, fields_names,\n                    limit=limit, offset=offset, order=order, header=header)\n        except (ValueError, KeyError):\n            abort(HTTPStatus.BAD_REQUEST)\n        data = io.StringIO(newline='')\n        writer = csv.writer(data, delimiter=delimiter, quotechar=quotechar)\n        for row in rows:\n            writer.writerow(format_(row))\n        data = data.getvalue().encode(encoding)\n        filename = slugify(Model.__names__()['model']) + '.csv'\n        filename = filename.encode('latin-1', 'ignore')\n        response = Response(data, mimetype='text/csv; charset=' + encoding)\n        response.headers.add(\n            'Content-Disposition', 'attachment', filename=filename)\n        response.headers.add('Content-Length', len(data))\n        return response\n\n\n@app.route('/avatar/<base64:database_name>/<uuid>', methods={'GET'})\n@with_pool\n@with_transaction()\ndef avatar(request, pool, uuid):\n    Avatar = pool.get('ir.avatar')\n\n    try:\n        avatar, = Avatar.search([\n                ('uuid', '=', uuid),\n                ])\n    except ValueError:\n        abort(HTTPStatus.NOT_FOUND)\n    try:\n        size = int(request.args.get('s', 64))\n    except ValueError:\n        abort(HTTPStatus.BAD_REQUEST)\n    response = Response(avatar.get(size), mimetype='image/jpeg')\n    response.headers['Cache-Control'] = (\n        'max-age=%s, public' % AVATAR_TIMEOUT)\n    response.add_etag()\n    return response\n"
  },
  {
    "path": "trytond/ir/rule.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom collections import defaultdict\n\nfrom sql import Literal\n\nfrom trytond.cache import Cache\nfrom trytond.i18n import gettext\nfrom trytond.model import (\n    Check, EvalEnvironment, Index, ModelSQL, ModelView, fields)\nfrom trytond.model.exceptions import ValidationError\nfrom trytond.pool import Pool\nfrom trytond.pyson import PYSONDecoder\nfrom trytond.transaction import Transaction\n\n\nclass DomainError(ValidationError):\n    pass\n\n\nclass RuleGroup(ModelSQL, ModelView):\n    \"Rule group\"\n    __name__ = 'ir.rule.group'\n    name = fields.Char(\n        \"Name\", translate=True, required=True,\n        help=\"Displayed to users when access error is raised for this rule.\")\n    model = fields.Many2One('ir.model', 'Model',\n        required=True, ondelete='CASCADE')\n    global_p = fields.Boolean('Global',\n        help=\"Make the rule global \\nso every users must follow this rule.\")\n    default_p = fields.Boolean('Default',\n        help=\"Add this rule to all users by default.\")\n    rules = fields.One2Many('ir.rule', 'rule_group', 'Tests',\n        help=\"The rule is satisfied if at least one test is True.\")\n    perm_read = fields.Boolean('Read Access')\n    perm_write = fields.Boolean('Write Access')\n    perm_create = fields.Boolean('Create Access')\n    perm_delete = fields.Boolean('Delete Access')\n\n    @classmethod\n    def __setup__(cls):\n        super(RuleGroup, cls).__setup__()\n        t = cls.__table__()\n\n        cls._order.insert(0, ('model', 'ASC'))\n        cls._order.insert(1, ('global_p', 'ASC'))\n        cls._order.insert(2, ('default_p', 'ASC'))\n\n        cls._sql_constraints += [\n            ('global_default_exclusive',\n                Check(t, (t.global_p == Literal(False))\n                    | (t.default_p == Literal(False))),\n                'Global and Default are mutually exclusive!'),\n            ]\n        cls._sql_indexes.update({\n                Index(t, (t.model, Index.Equality())),\n                })\n\n    @staticmethod\n    def default_global_p():\n        return True\n\n    @staticmethod\n    def default_default_p():\n        return False\n\n    @staticmethod\n    def default_perm_read():\n        return True\n\n    @staticmethod\n    def default_perm_write():\n        return True\n\n    @staticmethod\n    def default_perm_create():\n        return True\n\n    @staticmethod\n    def default_perm_delete():\n        return True\n\n    @classmethod\n    def delete(cls, groups):\n        super(RuleGroup, cls).delete(groups)\n        # Restart the cache on the domain_get method of ir.rule\n        Pool().get('ir.rule')._domain_get_cache.clear()\n\n    @classmethod\n    def create(cls, vlist):\n        res = super(RuleGroup, cls).create(vlist)\n        # Restart the cache on the domain_get method of ir.rule\n        Pool().get('ir.rule')._domain_get_cache.clear()\n        return res\n\n    @classmethod\n    def write(cls, groups, vals, *args):\n        super(RuleGroup, cls).write(groups, vals, *args)\n        # Restart the cache on the domain_get method of ir.rule\n        Pool().get('ir.rule')._domain_get_cache.clear()\n\n\nclass Rule(ModelSQL, ModelView):\n    \"Rule\"\n    __name__ = 'ir.rule'\n    rule_group = fields.Many2One('ir.rule.group', 'Group',\n       required=True, ondelete=\"CASCADE\")\n    domain = fields.Char('Domain', required=True,\n        help=\"Domain is evaluated with a PYSON context containing:\"\n        '\\n- \"user\" as the current user'\n        '\\n- \"groups\" as list of ids from the current user')\n    _domain_get_cache = Cache('ir_rule.domain_get', context=False)\n\n    modes = {'read', 'write', 'create', 'delete'}\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        table = cls.__table__()\n\n        cls._sql_indexes.add(\n            Index(table, (table.rule_group, Index.Equality())))\n\n    @classmethod\n    def validate_fields(cls, rules, field_names):\n        super().validate_fields(rules, field_names)\n        cls.check_domain(rules, field_names)\n\n    @classmethod\n    def check_domain(cls, rules, field_names=None):\n        if field_names and 'domain' not in field_names:\n            return\n        ctx = cls._get_context()\n        for rule in rules:\n            try:\n                value = PYSONDecoder(ctx).decode(rule.domain)\n            except Exception:\n                raise DomainError(gettext(\n                        'ir.msg_rule_invalid_domain', name=rule.rec_name))\n            if not isinstance(value, list):\n                raise DomainError(gettext(\n                        'ir.msg_rule_invalid_domain', name=rule.rec_name))\n            else:\n                try:\n                    fields.domain_validate(value)\n                except Exception:\n                    raise DomainError(gettext(\n                            'ir.msg_rule_invalid_domain', name=rule.rec_name))\n\n    @staticmethod\n    def _get_context():\n        User = Pool().get('res.user')\n        transaction = Transaction()\n        user_id = transaction.user\n        with transaction.set_context(_check_access=False, _datetime=None), \\\n                transaction.set_user(0):\n            user = EvalEnvironment(User(user_id), User)\n        return {\n            'user': user,\n            'groups': User.get_groups()\n            }\n\n    @staticmethod\n    def _get_cache_key():\n        # _datetime value will be added to the domain\n        return (Transaction().user, Transaction().context.get('_datetime'))\n\n    @classmethod\n    def get(cls, model_name, mode='read'):\n        \"Return dictionary of non-global and global rules\"\n        pool = Pool()\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n        RuleGroup_Group = pool.get('ir.rule.group-res.group')\n        User_Group = pool.get('res.user-res.group')\n        rule_table = cls.__table__()\n        rule_group = RuleGroup.__table__()\n        rule_group_group = RuleGroup_Group.__table__()\n        user_group = User_Group.user_group_all_table()\n        model = Model.__table__()\n        transaction = Transaction()\n\n        assert mode in cls.modes\n\n        model_names = []\n        model2field = defaultdict(list)\n\n        def update_model_names(Model, path=None):\n            if Model.__name__ in model_names:\n                return\n            model_names.append(Model.__name__)\n            if path:\n                model2field[Model.__name__].append(path)\n            for field_name in Model.__access__:\n                field = getattr(Model, field_name)\n                Target = field.get_target()\n                if path:\n                    target_path = path + '.' + field_name\n                else:\n                    target_path = field_name\n                update_model_names(Target, target_path)\n        update_model_names(pool.get(model_name))\n\n        cursor = transaction.connection.cursor()\n        user_id = transaction.user\n        # root user above constraint\n        if user_id == 0:\n            return {}, {}\n        cursor.execute(*rule_table.join(rule_group,\n                condition=rule_group.id == rule_table.rule_group\n                ).join(model,\n                condition=rule_group.model == model.id\n                ).select(rule_table.id,\n                where=(model.model.in_(model_names))\n                & (getattr(rule_group, 'perm_%s' % mode) == Literal(True))\n                & (rule_group.id.in_(\n                        rule_group_group.join(\n                            user_group,\n                            condition=(rule_group_group.group\n                                == user_group.group)\n                            ).select(rule_group_group.rule_group,\n                            where=user_group.user == user_id)\n                        )\n                    | (rule_group.default_p == Literal(True))\n                    | (rule_group.global_p == Literal(True))\n                    )))\n        ids = [x for x, in cursor]\n\n        # Test if there is no rule_group that have no rule\n        cursor.execute(*rule_group.join(model,\n                condition=rule_group.model == model.id\n                ).select(rule_group.id,\n                where=(model.model.in_(model_names))\n                & ~rule_group.id.in_(rule_table.select(rule_table.rule_group))\n                & rule_group.id.in_(rule_group_group.join(user_group,\n                        condition=rule_group_group.group == user_group.group\n                        ).select(rule_group_group.rule_group,\n                        where=user_group.user == user_id))))\n        no_rules = cursor.fetchone()\n\n        clause = defaultdict(lambda: ['OR'])\n        clause_global = defaultdict(lambda: ['OR'])\n        decoder = PYSONDecoder(cls._get_context())\n        # Use root user without context to prevent recursion\n        with transaction.set_user(0), transaction.set_context(user=0):\n            for rule in cls.browse(ids):\n                assert rule.domain, ('Rule domain empty,'\n                    'check if migration was done')\n                dom = decoder.decode(rule.domain)\n                target_model = rule.rule_group.model.model\n                if target_model in model2field:\n                    target_dom = ['OR']\n                    for field in model2field[target_model]:\n                        target_dom.append((field, 'where', dom))\n                    dom = target_dom\n                if rule.rule_group.global_p:\n                    clause_global[rule.rule_group].append(dom)\n                else:\n                    clause[rule.rule_group].append(dom)\n\n            if no_rules:\n                group_id = no_rules[0]\n                clause[RuleGroup(group_id)] = []\n\n        return clause, clause_global\n\n    @classmethod\n    def domain_get(cls, model_name, mode='read'):\n        transaction = Transaction()\n        # root user above constraint\n        if ((transaction.user == 0)\n                or not transaction.context.get('_check_access')):\n            return []\n\n        assert mode in cls.modes\n\n        key = (model_name, mode) + cls._get_cache_key()\n        domain = cls._domain_get_cache.get(key, False)\n        if domain is not False:\n            return domain\n\n        clause, clause_global = cls.get(model_name, mode=mode)\n\n        clause = list(clause.values())\n        if clause:\n            clause.insert(0, 'OR')\n\n        clause_global = list(clause_global.values())\n\n        if clause_global:\n            clause_global.insert(0, 'AND')\n\n        if clause and clause_global:\n            clause = ['AND', clause_global, clause]\n        elif clause_global:\n            clause = clause_global\n\n        cls._domain_get_cache.set(key, clause)\n        return clause\n\n    @classmethod\n    def query_get(cls, model_name, mode='read'):\n        pool = Pool()\n        Model = pool.get(model_name)\n\n        domain = cls.domain_get(model_name, mode=mode)\n\n        # Use root to prevent infinite recursion\n        with Transaction().set_user(0), \\\n                Transaction().set_context(active_test=False, user=0):\n            return Model.search(domain, order=[], query=True)\n\n    @classmethod\n    def delete(cls, rules):\n        super(Rule, cls).delete(rules)\n        # Restart the cache on the domain_get method of ir.rule\n        cls._domain_get_cache.clear()\n\n    @classmethod\n    def create(cls, vlist):\n        res = super(Rule, cls).create(vlist)\n        # Restart the cache on the domain_get method of ir.rule\n        cls._domain_get_cache.clear()\n        return res\n\n    @classmethod\n    def write(cls, rules, vals, *args):\n        super(Rule, cls).write(rules, vals, *args)\n        # Restart the cache on the domain_get method\n        cls._domain_get_cache.clear()\n"
  },
  {
    "path": "trytond/ir/rule.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <record model=\"ir.ui.view\" id=\"rule_group_view_form\">\n            <field name=\"model\">ir.rule.group</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">rule_group_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"rule_group_view_tree\">\n            <field name=\"model\">ir.rule.group</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">rule_group_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_rule_group_form\">\n            <field name=\"name\">Record Rules</field>\n            <field name=\"res_model\">ir.rule.group</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_rule_group_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"rule_group_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_rule_group_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_rule_group_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"rule_group_view_form\"/>\n            <field name=\"act_window\" ref=\"act_rule_group_form\"/>\n        </record>\n        <menuitem\n            parent=\"ir.menu_models\"\n            action=\"act_rule_group_form\"\n            sequence=\"30\"\n            id=\"menu_rule_group_form\"/>\n        <record model=\"ir.ui.view\" id=\"rule_view_form\">\n            <field name=\"model\">ir.rule</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">rule_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"rule_view_tree\">\n            <field name=\"model\">ir.rule</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">rule_list</field>\n        </record>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/sequence.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport time\nfrom string import Template\n\nfrom trytond import backend\nfrom trytond.exceptions import UserError\nfrom trytond.i18n import gettext\nfrom trytond.model import Check, DeactivableMixin, ModelSQL, ModelView, fields\nfrom trytond.model.exceptions import AccessError, ValidationError\nfrom trytond.pool import Pool\nfrom trytond.pyson import And, Eval\nfrom trytond.transaction import Transaction\n\nsql_sequence = backend.Database.has_sequence()\n\n\nclass AffixError(ValidationError):\n    pass\n\n\nclass MissingError(UserError):\n    pass\n\n\nclass LastTimestampError(ValidationError):\n    pass\n\n\nclass SQLSequenceError(ValidationError):\n    pass\n\n\nclass SequenceType(ModelSQL, ModelView):\n    \"Sequence type\"\n    __name__ = 'ir.sequence.type'\n\n    name = fields.Char('Sequence Name', required=True, translate=True)\n\n    @classmethod\n    def __register__(cls, module):\n        super().__register__(module)\n        table_h = cls.__table_handler__(module)\n\n        # Migration from 5.8: remove code\n        # We keep the column until ir.sequence has been migrated\n        table_h.not_null_action('code', action='remove')\n\n\nclass Sequence(DeactivableMixin, ModelSQL, ModelView):\n    \"Sequence\"\n    __name__ = 'ir.sequence'\n\n    _strict = False\n    name = fields.Char('Sequence Name', required=True, translate=True)\n    sequence_type = fields.Many2One(\n        'ir.sequence.type', \"Sequence Type\",\n        required=True, ondelete='RESTRICT',\n        states={\n            'readonly': Eval('id', -1) >= 0,\n            },\n        depends=['id'])\n    prefix = fields.Char('Prefix', strip='leading')\n    suffix = fields.Char('Suffix', strip='trailing')\n    type = fields.Selection([\n        ('incremental', 'Incremental'),\n        ('decimal timestamp', 'Decimal Timestamp'),\n        ('hexadecimal timestamp', 'Hexadecimal Timestamp'),\n        ], 'Type')\n    number_next_internal = fields.Integer('Next Number',\n        states={\n            'invisible': ~Eval('type').in_(['incremental']),\n            'required': And(Eval('type').in_(['incremental']),\n                not sql_sequence),\n            }, depends=['type'])\n    number_next = fields.Function(number_next_internal, 'get_number_next',\n        'set_number_next')\n    number_increment = fields.Integer('Increment Number',\n        states={\n            'invisible': ~Eval('type').in_(['incremental']),\n            'required': Eval('type').in_(['incremental']),\n            }, depends=['type'])\n    padding = fields.Integer('Number padding',\n        states={\n            'invisible': ~Eval('type').in_(['incremental']),\n            'required': Eval('type').in_(['incremental']),\n            }, depends=['type'])\n    timestamp_rounding = fields.Float('Timestamp Rounding', required=True,\n        states={\n            'invisible': ~Eval('type').in_(\n                ['decimal timestamp', 'hexadecimal timestamp']),\n            }, depends=['type'])\n    timestamp_offset = fields.Float('Timestamp Offset', required=True,\n        states={\n            'invisible': ~Eval('type').in_(\n                ['decimal timestamp', 'hexadecimal timestamp']),\n            }, depends=['type'])\n    last_timestamp = fields.Integer('Last Timestamp',\n        states={\n            'invisible': ~Eval('type').in_(\n                ['decimal timestamp', 'hexadecimal timestamp']),\n            'required': Eval('type').in_(\n                ['decimal timestamp', 'hexadecimal timestamp']),\n            }, depends=['type'])\n\n    @classmethod\n    def __setup__(cls):\n        super(Sequence, cls).__setup__()\n        table = cls.__table__()\n        cls._sql_constraints += [\n            ('check_timestamp_rounding',\n                Check(table, table.timestamp_rounding > 0),\n                'Timestamp rounding should be greater than 0'),\n            ]\n\n    @classmethod\n    def __register__(cls, module):\n        pool = Pool()\n        SequenceType = pool.get('ir.sequence.type')\n        cursor = Transaction().connection.cursor()\n        table = cls.__table__()\n        sequence_type = SequenceType.__table__()\n\n        super().__register__(module)\n\n        table_h = cls.__table_handler__(module)\n\n        # Migration from 5.8: replace code by sequence_type\n        if table_h.column_exist('code'):\n            cursor.execute(*table.update(\n                    [table.sequence_type],\n                    sequence_type.select(\n                        sequence_type.id,\n                        where=sequence_type.code == table.code)))\n            table_h.drop_column('code')\n\n    @staticmethod\n    def default_type():\n        return 'incremental'\n\n    @staticmethod\n    def default_number_increment():\n        return 1\n\n    @staticmethod\n    def default_number_next():\n        return 1\n\n    @staticmethod\n    def default_padding():\n        return 0\n\n    @staticmethod\n    def default_timestamp_rounding():\n        return 1.0\n\n    @staticmethod\n    def default_timestamp_offset():\n        return 946681200.0  # Offset for 2000-01-01\n\n    @staticmethod\n    def default_last_timestamp():\n        return 0\n\n    def get_number_next(self, name):\n        if self.type != 'incremental':\n            return\n\n        transaction = Transaction()\n        if sql_sequence and not self._strict:\n            return transaction.database.sequence_next_number(\n                transaction.connection, self._sql_sequence_name)\n        else:\n            return self.number_next_internal\n\n    @classmethod\n    def set_number_next(cls, sequences, name, value):\n        super(Sequence, cls).write(sequences, {\n                'number_next_internal': value,\n                })\n\n    @classmethod\n    def view_attributes(cls):\n        return [\n            ('//group[@id=\"incremental\"]', 'states', {\n                    'invisible': ~Eval('type').in_(['incremental']),\n                    }),\n            ('//group[@id=\"timestamp\"]', 'states', {\n                    'invisible': ~Eval('type').in_(\n                        ['decimal timestamp', 'hexadecimal timestamp']),\n                    }),\n            ]\n\n    @classmethod\n    def create(cls, vlist):\n        sequences = super(Sequence, cls).create(vlist)\n        for sequence, values in zip(sequences, vlist):\n            if sql_sequence and not cls._strict:\n                sequence.update_sql_sequence(values.get('number_next',\n                        cls.default_number_next()))\n        return sequences\n\n    @classmethod\n    def write(cls, *args):\n        transaction = Transaction()\n        if (transaction.user != 0\n                and transaction.context.get('_check_access')):\n            for values in args[1::2]:\n                if 'sequence_type' in values:\n                    raise AccessError(gettext(\n                            'ir.msg_sequence_change_sequence_type'))\n        super().write(*args)\n        if sql_sequence and not cls._strict:\n            actions = iter(args)\n            for sequences, values in zip(actions, actions):\n                for sequence in sequences:\n                    sequence.update_sql_sequence(values.get('number_next'))\n\n    @classmethod\n    def delete(cls, sequences):\n        if sql_sequence and not cls._strict:\n            for sequence in sequences:\n                sequence.delete_sql_sequence()\n        return super(Sequence, cls).delete(sequences)\n\n    @classmethod\n    def validate(cls, sequences):\n        super().validate(sequences)\n        cls.check_last_timestamp(sequences)\n\n    @classmethod\n    def validate_fields(cls, sequences, field_names):\n        super().validate_fields(sequences, field_names)\n        cls.check_affixes(sequences, field_names)\n\n    @classmethod\n    def check_affixes(cls, sequences, field_names=None):\n        \"Check prefix and suffix\"\n        if field_names and not (field_names & {'prefix', 'suffix'}):\n            return\n        for sequence in sequences:\n            for affix, error_message in [\n                    (sequence.prefix, 'msg_sequence_invalid_prefix'),\n                    (sequence.suffix, 'msg_sequence_invalid_suffix')]:\n                try:\n                    cls._process(affix)\n                except (TypeError, ValueError) as exc:\n                    raise AffixError(gettext('ir.%s' % error_message,\n                            affix=affix,\n                            sequence=sequence.rec_name)) from exc\n\n    @classmethod\n    def check_last_timestamp(cls, sequences):\n        \"Check last_timestamp\"\n\n        for sequence in sequences:\n            next_timestamp = cls._timestamp(sequence)\n            if (sequence.last_timestamp is not None\n                    and sequence.last_timestamp > next_timestamp):\n                raise LastTimestampError(\n                    gettext('ir.msg_sequence_last_timestamp_future'))\n\n    @property\n    def _sql_sequence_name(self):\n        'Return SQL sequence name'\n        return '%s_%s' % (self._table, self.id)\n\n    def create_sql_sequence(self, number_next=None):\n        'Create the SQL sequence'\n        transaction = Transaction()\n\n        if self.type != 'incremental':\n            return\n        if number_next is None:\n            number_next = self.number_next\n        try:\n            transaction.database.sequence_create(\n                transaction.connection, self._sql_sequence_name,\n                self.number_increment, number_next)\n        except Exception as exception:\n            raise SQLSequenceError(\n                gettext('ir.msg_sequence_invalid_number_increment_next',\n                    number_increment=self.number_increment,\n                    number_next=number_next,\n                    exception=exception)) from exception\n\n    def update_sql_sequence(self, number_next=None):\n        'Update the SQL sequence'\n        transaction = Transaction()\n\n        exist = transaction.database.sequence_exist(\n            transaction.connection, self._sql_sequence_name)\n        if self.type != 'incremental':\n            if exist:\n                self.delete_sql_sequence()\n            return\n        if not exist:\n            self.create_sql_sequence(number_next)\n            return\n        if number_next is None:\n            number_next = self.number_next\n        try:\n            transaction.database.sequence_update(\n                transaction.connection, self._sql_sequence_name,\n                self.number_increment, number_next)\n        except Exception as exception:\n            raise SQLSequenceError(\n                gettext('ir.msg_sequence_invalid_number_increment_next',\n                    number_increment=self.number_increment,\n                    number_next=number_next,\n                    exception=exception)) from exception\n\n    def delete_sql_sequence(self):\n        'Delete the SQL sequence'\n        transaction = Transaction()\n        if self.type != 'incremental':\n            return\n        transaction.database.sequence_delete(\n            transaction.connection, self._sql_sequence_name)\n\n    @classmethod\n    def _process(cls, string, date=None):\n        return Template(string or '').substitute(\n            **cls._get_substitutions(date))\n\n    @classmethod\n    def _get_substitutions(cls, date):\n        '''\n        Returns a dictionary with the keys and values of the substitutions\n        available to format the sequence\n        '''\n        pool = Pool()\n        Date = pool.get('ir.date')\n        if not date:\n            date = Date.today()\n        return {\n            'year': date.strftime('%Y'),\n            'month': date.strftime('%m'),\n            'day': date.strftime('%d'),\n            }\n\n    @staticmethod\n    def _timestamp(sequence):\n        return int((time.time() - sequence.timestamp_offset)\n                / sequence.timestamp_rounding)\n\n    @classmethod\n    def _get_sequence(cls, sequence):\n        if sequence.type == 'incremental':\n            if sql_sequence and not cls._strict:\n                cursor = Transaction().connection.cursor()\n                cursor.execute('SELECT nextval(\\'\"%s\"\\')'\n                    % sequence._sql_sequence_name)\n                number_next, = cursor.fetchone()\n            else:\n                # Pre-fetch number_next\n                number_next = sequence.number_next_internal\n\n                cls.write([sequence], {\n                        'number_next_internal': (number_next\n                            + sequence.number_increment),\n                        })\n            return '%%0%sd' % sequence.padding % number_next\n        elif sequence.type in ('decimal timestamp', 'hexadecimal timestamp'):\n            timestamp = sequence.last_timestamp\n            while timestamp == sequence.last_timestamp:\n                timestamp = cls._timestamp(sequence)\n            cls.write([sequence], {\n                'last_timestamp': timestamp,\n                })\n            if sequence.type == 'decimal timestamp':\n                return '%d' % timestamp\n            else:\n                return hex(timestamp)[2:].upper()\n        return ''\n\n    def get(self, _lock=False):\n        '''\n        Return the next sequence value\n        '''\n        cls = self.__class__\n        # bypass rules on sequences\n        with Transaction().set_context(user=False, _check_access=False):\n            with Transaction().set_user(0):\n                try:\n                    sequence = cls(self.id)\n                except TypeError:\n                    raise MissingError(gettext('ir.msg_sequence_missing'))\n                if _lock:\n                    self.lock()\n                date = Transaction().context.get('date')\n                return '%s%s%s' % (\n                    cls._process(sequence.prefix, date=date),\n                    cls._get_sequence(sequence),\n                    cls._process(sequence.suffix, date=date),\n                    )\n\n\nclass SequenceStrict(Sequence):\n    \"Sequence Strict\"\n    __name__ = 'ir.sequence.strict'\n    _table = None  # Needed to reset Sequence._table\n    _strict = True\n\n    def get(self, _lock=True):\n        return super().get(_lock=True)\n"
  },
  {
    "path": "trytond/ir/sequence.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <menuitem\n            name=\"Sequences\"\n            parent=\"menu_administration\"\n            sequence=\"20\"\n            id=\"menu_sequences\"/>\n\n        <record model=\"ir.ui.view\" id=\"sequence_view_form\">\n            <field name=\"model\">ir.sequence</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">sequence_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"sequence_view_tree\">\n            <field name=\"model\">ir.sequence</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">sequence_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_sequence_form\">\n            <field name=\"name\">Sequences</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">ir.sequence</field>\n            <field name=\"context\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_sequence_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"sequence_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_sequence_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_sequence_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"sequence_view_form\"/>\n            <field name=\"act_window\" ref=\"act_sequence_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_sequences\"\n            action=\"act_sequence_form\"\n            sequence=\"10\"\n            id=\"menu_sequence_form\"/>\n\n        <record model=\"ir.ui.view\" id=\"sequence_strict_view_form\">\n            <field name=\"model\">ir.sequence.strict</field>\n            <field name=\"type\" eval=\"None\"/>\n            <field name=\"inherit\" ref=\"sequence_view_form\"/>\n        </record>\n        <record model=\"ir.ui.view\" id=\"sequence_strict_view_tree\">\n            <field name=\"model\">ir.sequence.strict</field>\n            <field name=\"type\" eval=\"None\"/>\n            <field name=\"inherit\" ref=\"sequence_view_tree\"/>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_sequence_strict_form\">\n            <field name=\"name\">Sequences Strict</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">ir.sequence.strict</field>\n            <field name=\"context\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_sequence_strict_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"sequence_strict_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_sequence_strict_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_sequence_strict_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"sequence_strict_view_form\"/>\n            <field name=\"act_window\" ref=\"act_sequence_strict_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_sequences\"\n            action=\"act_sequence_strict_form\"\n            sequence=\"10\"\n            id=\"menu_sequence_strict_form\"\n            icon=\"tryton-list\"/>\n\n        <record model=\"ir.ui.view\" id=\"sequence_type_view_form\">\n            <field name=\"model\">ir.sequence.type</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">sequence_type_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"sequence_type_view_tree\">\n            <field name=\"model\">ir.sequence.type</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">sequence_type_list</field>\n        </record>\n        <record model=\"ir.action.act_window\"\n            id=\"act_sequence_type_form\">\n            <field name=\"name\">Types</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">ir.sequence.type</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_sequence_type_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"sequence_type_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_sequence_type_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_sequence_type_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"sequence_type_view_form\"/>\n            <field name=\"act_window\" ref=\"act_sequence_type_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_sequences\"\n            action=\"act_sequence_type_form\"\n            sequence=\"20\"\n            id=\"menu_ir_sequence_type\"/>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/session.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport json\nfrom secrets import token_hex\n\nfrom trytond.cache import Cache\nfrom trytond.config import config\nfrom trytond.model import Index, ModelSQL, fields\n\n_session_timeout = datetime.timedelta(\n    seconds=config.getint('session', 'timeout'))\n_reset_interval = _session_timeout // 10\n\n\nclass Session(ModelSQL):\n    \"Session\"\n    __name__ = 'ir.session'\n    _rec_name = 'key'\n\n    key = fields.Char(\"Key\", required=True, strip=False)\n    _session_reset_cache = Cache('ir_session.session_reset', context=False)\n\n    @classmethod\n    def __setup__(cls):\n        super(Session, cls).__setup__()\n        table = cls.__table__()\n        cls.__rpc__ = {}\n        cls.__rpc__ = {}\n        cls._sql_indexes.update({\n                Index(table,\n                    (table.key, Index.Equality()),\n                    (table.create_uid, Index.Equality())),\n                Index(table,\n                    (table.key, Index.Equality()),\n                    (table.create_date, Index.Equality())),\n                Index(table,\n                    (table.key, Index.Equality()),\n                    (table.write_date, Index.Equality())),\n                })\n\n    @classmethod\n    def default_key(cls, nbytes=None):\n        return token_hex(nbytes)\n\n    @classmethod\n    def write(cls, *args):\n        super().write(*args)\n        for sessions in args[0:None:2]:\n            for session in sessions:\n                cls._session_reset_cache.set(session.key, session.write_date)\n\n    @classmethod\n    def new(cls, values=None):\n        \"Create a new session for the transaction user and return the key.\"\n        if values is None:\n            values = {}\n        session, = cls.create([values])\n        return session.key\n\n    @classmethod\n    def remove(cls, key, domain=None):\n        \"Delete the key session and return the login.\"\n        domain = [\n            ('key', '=', key),\n            domain or [],\n            ]\n        sessions = cls.search(domain)\n        if not sessions:\n            return\n        session, = sessions\n        name = session.create_uid.login\n        cls.delete(sessions)\n        return name\n\n    @classmethod\n    def check(cls, user, key, domain=None):\n        \"\"\"\n        Check user key against max_age and delete old one.\n        Return True if key is still valid, False if the key is expired and None\n        if the key does not exist.\n        \"\"\"\n        now = datetime.datetime.now()\n        timeout = datetime.timedelta(\n            seconds=config.getint('session', 'max_age'))\n        sessions = cls.search([\n                ('create_uid', '=', user),\n                domain or [],\n                ])\n        find, last_reset = None, None\n        to_delete = []\n        for session in sessions:\n            if abs(session.create_date - now) < timeout:\n                if session.key == key:\n                    find = True\n                    last_reset = session.write_date or session.create_date\n            else:\n                if find is None and session.key == key:\n                    find = False\n                to_delete.append(session)\n        cls.delete(to_delete)\n        if find:\n            cls._session_reset_cache.set(key, last_reset)\n        return find\n\n    @classmethod\n    def check_timeout(cls, user, key, domain=None):\n        \"\"\"\n        Check user key against timeout.\n        Return True if key is still valid otherwise the key is deleted.\n        \"\"\"\n        now = datetime.datetime.now()\n        timeout = datetime.timedelta(\n            seconds=config.getint('session', 'timeout'))\n        session, = cls.search([\n                ('create_uid', '=', user),\n                ('key', '=', key),\n                domain or [],\n                ], limit=1)\n        timestamp = session.write_date or session.create_date\n        valid = abs(timestamp - now) < timeout\n        if not valid:\n            cls.delete([session])\n        return valid\n\n    @classmethod\n    def reset(cls, key, domain=None):\n        \"Reset key session timestamp\"\n        now = datetime.datetime.now()\n        last_reset = cls._session_reset_cache.get(key)\n        if last_reset is None or (now - _reset_interval) > last_reset:\n            timestamp = now - _session_timeout\n            sessions = cls.search([\n                    ('key', '=', key),\n                    ['OR',\n                        ('create_date', '>=', timestamp),\n                        ('write_date', '>=', timestamp),\n                        ],\n                    domain or [],\n                    ])\n            cls.write(sessions, {})\n\n    @classmethod\n    def clear(cls, users, domain=None):\n        \"Clear all sessions for users\"\n        sessions = cls.search([\n                ('create_uid', 'in', users),\n                domain or [],\n                ])\n        cls.delete(sessions)\n\n    @classmethod\n    def create(cls, vlist):\n        vlist = [v.copy() for v in vlist]\n        for values in vlist:\n            # Ensure to get a different key for each record\n            # default methods are called only once\n            values.setdefault('key', cls.default_key())\n        return super(Session, cls).create(vlist)\n\n\nclass SessionWizard(ModelSQL):\n    \"Session Wizard\"\n    __name__ = 'ir.session.wizard'\n\n    data = fields.Text('Data')\n\n    @classmethod\n    def __setup__(cls):\n        super(SessionWizard, cls).__setup__()\n        cls.__rpc__ = {}\n\n    @staticmethod\n    def default_data():\n        return json.dumps({})\n"
  },
  {
    "path": "trytond/ir/translation.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport os\nfrom collections import defaultdict\nfrom difflib import SequenceMatcher\nfrom io import BytesIO\n\nimport polib\nfrom defusedxml.minidom import parseString\nfrom genshi.filters.i18n import extract as genshi_extract\nfrom lxml import etree\nfrom relatorio.reporting import MIMETemplateLoader\nfrom relatorio.templates.opendocument import get_zip_file\nfrom sql import Column, Literal, Null\nfrom sql.aggregate import Max\nfrom sql.conditionals import Case\nfrom sql.functions import Position, Substring\n\nfrom trytond.cache import Cache\nfrom trytond.config import config\nfrom trytond.exceptions import UserError\nfrom trytond.i18n import gettext\nfrom trytond.model import Index, ModelSQL, ModelView, fields\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval, PYSONEncoder\nfrom trytond.tools import cursor_dict, file_open, grouped_slice\nfrom trytond.tools.string_ import LazyString, StringPartitioned\nfrom trytond.transaction import Transaction\nfrom trytond.wizard import (\n    Button, StateAction, StateTransition, StateView, Wizard)\n\nfrom .lang import get_parent_language as get_parent\n\nTRANSLATION_TYPE = [\n    ('field', 'Field'),\n    ('model', 'Model'),\n    ('report', 'Report'),\n    ('selection', 'Selection'),\n    ('view', 'View'),\n    ('wizard_button', 'Wizard Button'),\n    ('help', 'Help'),\n]\n\n\nclass OverriddenError(UserError):\n    pass\n\n\nclass TrytonPOFile(polib.POFile):\n\n    def sort(self):\n        return super(TrytonPOFile, self).sort(\n            key=lambda x: (x.msgctxt, x.msgid))\n\n\nclass Translation(ModelSQL, ModelView):\n    \"Translation\"\n    __name__ = \"ir.translation\"\n\n    name = fields.Char('Field Name', required=True)\n    res_id = fields.Integer('Resource ID', required=True)\n    lang = fields.Selection('get_language', string='Language')\n    type = fields.Selection(TRANSLATION_TYPE, string='Type',\n       required=True)\n    src = fields.Text('Source')\n    value = fields.Text('Translation Value')\n    module = fields.Char('Module', readonly=True)\n    fuzzy = fields.Boolean('Fuzzy')\n    model = fields.Function(fields.Char('Model'), 'get_model',\n            searcher='search_model')\n    overriding_module = fields.Char('Overriding Module', readonly=True)\n    _translation_cache = Cache('ir.translation', size_limit=10240,\n        context=False)\n    _translation_report_cache = Cache(\n        'ir.translation.get_report', context=False)\n    _get_language_cache = Cache('ir.translation.get_language', context=False)\n\n    @classmethod\n    def __setup__(cls):\n        cls.name.search_unaccented = False\n        super().__setup__()\n        table = cls.__table__()\n\n        cls._sql_indexes.update({\n                Index(\n                    table, (Index.Unaccent(table.src), Index.Similarity())),\n                Index(\n                    table, (Index.Unaccent(table.value), Index.Similarity())),\n                Index(\n                    table,\n                    (table.type, Index.Equality()),\n                    (table.name, Index.Equality()),\n                    (table.lang, Index.Equality()),\n                    (table.res_id, Index.Range()),\n                    (table.fuzzy, Index.Equality()),\n                    (Index.Unaccent(table.value), Index.Similarity())),\n                Index(\n                    table,\n                    (table.type, Index.Equality()),\n                    (table.name, Index.Equality())),\n                Index(\n                    table,\n                    (table.res_id, Index.Equality()),\n                    (table.name, Index.Equality()),\n                    (table.lang, Index.Equality()),\n                    (table.type, Index.Equality())),\n                })\n\n    @classmethod\n    def __register__(cls, module_name):\n        transaction = Transaction()\n        cursor = transaction.connection.cursor()\n        ir_translation = cls.__table__()\n        table = cls.__table_handler__(module_name)\n\n        # Migration from 5.0: remove src_md5\n        if table.column_exist('src_md5'):\n            table.drop_constraint('translation_md5_uniq')\n            table.drop_column('src_md5')\n\n        super(Translation, cls).__register__(module_name)\n\n        # Migration from 3.8: rename odt type in report\n        cursor.execute(*ir_translation.update(\n                [ir_translation.type],\n                ['report'],\n                where=ir_translation.type == 'odt'))\n\n    @classmethod\n    def register_model(cls, model, module_name):\n        cursor = Transaction().connection.cursor()\n        ir_translation = cls.__table__()\n\n        if not model.__doc__:\n            return\n\n        name = model.__name__ + ',name'\n        src = model._get_name()\n        if not src:\n            return\n        cursor.execute(*ir_translation.select(ir_translation.id,\n                where=(ir_translation.lang == 'en')\n                & (ir_translation.type == 'model')\n                & (ir_translation.name == name)\n                # Keep searching on all values for migration\n                & ((ir_translation.res_id == -1)\n                    | (ir_translation.res_id == Null)\n                    | (ir_translation.res_id == 0))))\n        trans_id = None\n        if cursor.rowcount == -1 or cursor.rowcount is None:\n            data = cursor.fetchone()\n            if data:\n                trans_id, = data\n        elif cursor.rowcount != 0:\n            trans_id, = cursor.fetchone()\n        if trans_id is None:\n            cursor.execute(*ir_translation.insert(\n                    [Column(ir_translation, c)\n                        for c in ('name', 'lang', 'type', 'src',\n                            'value', 'module', 'fuzzy', 'res_id')],\n                    [[name, 'en', 'model', src,\n                            '', module_name, False, -1]]))\n        else:\n            cursor.execute(*ir_translation.update(\n                    [ir_translation.src],\n                    [src],\n                    where=ir_translation.id == trans_id))\n\n    @classmethod\n    def register_fields(cls, model, module_name):\n        cursor = Transaction().connection.cursor()\n        ir_translation = cls.__table__()\n\n        # Prefetch field translations\n        translations = dict(\n            field=defaultdict(dict),\n            help=defaultdict(dict),\n            selection=defaultdict(dict))\n        if model._fields:\n            names = ['%s,%s' % (model.__name__, f) for f in model._fields]\n            cursor.execute(*ir_translation.select(ir_translation.id,\n                    ir_translation.name, ir_translation.src,\n                    ir_translation.type,\n                    where=((ir_translation.lang == 'en')\n                        & ir_translation.type.in_(\n                            ('field', 'help', 'selection'))\n                        & ir_translation.name.in_(names))))\n            for trans in cursor_dict(cursor):\n                sources = translations[trans['type']][trans['name']]\n                sources[trans['src']] = trans\n\n        columns = [ir_translation.name, ir_translation.lang,\n            ir_translation.type, ir_translation.src, ir_translation.value,\n            ir_translation.module, ir_translation.fuzzy, ir_translation.res_id]\n\n        def insert(field, type, name, string):\n            inserted = False\n            for val in string:\n                if not val or val in translations[type][name]:\n                    continue\n                if isinstance(val, LazyString):\n                    continue\n                assert type not in {'field', 'help'} or not inserted, (\n                    \"More than one resource \"\n                    f\"for {type} of {name} in {module_name}\")\n                cursor.execute(\n                    *ir_translation.insert(columns,\n                        [[name, 'en', type, val, '', module_name, False, -1]]))\n                inserted = True\n\n        for field_name, field in model._fields.items():\n            name = model.__name__ + ',' + field_name\n            insert(field, 'field', name, field.string)\n            insert(field, 'help', name, field.help)\n            if (hasattr(field, 'selection')\n                    and isinstance(field.selection, (tuple, list))\n                    and getattr(field, 'translate_selection', True)):\n                selection = [s for _, s in field.selection]\n                insert(field, 'selection', name, selection)\n\n    @classmethod\n    def register_wizard(cls, wizard, module_name):\n        cursor = Transaction().connection.cursor()\n        ir_translation = cls.__table__()\n\n        # Prefetch button translations\n        cursor.execute(*ir_translation.select(\n                ir_translation.id, ir_translation.name, ir_translation.src,\n                where=((ir_translation.lang == 'en')\n                    & (ir_translation.type == 'wizard_button')\n                    & (ir_translation.name.like(wizard.__name__ + ',%')))))\n        trans_buttons = {t['name']: t for t in cursor_dict(cursor)}\n\n        def update_insert_button(state_name, button):\n            if not button.string:\n                return\n            trans_name = '%s,%s,%s' % (\n                wizard.__name__, state_name, button.state)\n            if trans_name not in trans_buttons:\n                cursor.execute(*ir_translation.insert(\n                        [ir_translation.name, ir_translation.lang,\n                            ir_translation.type, ir_translation.src,\n                            ir_translation.value, ir_translation.module,\n                            ir_translation.fuzzy, ir_translation.res_id],\n                        [[\n                                trans_name, 'en',\n                                'wizard_button', button.string,\n                                '', module_name,\n                                False, -1]]))\n            elif trans_buttons[trans_name] != button.string:\n                cursor.execute(*ir_translation.update(\n                        [ir_translation.src],\n                        [button.string],\n                        where=ir_translation.id\n                        == trans_buttons[trans_name]['id']))\n\n        for state_name, state in wizard.states.items():\n            if not isinstance(state, StateView):\n                continue\n            for button in state.buttons:\n                update_insert_button(state_name, button)\n\n    @staticmethod\n    def default_fuzzy():\n        return False\n\n    @staticmethod\n    def default_res_id():\n        return -1\n\n    def get_model(self, name):\n        return self.name.split(',')[0]\n\n    @classmethod\n    def search_rec_name(cls, name, clause):\n        clause = tuple(clause)\n        if clause[1].startswith('!') or clause[1].startswith('not '):\n            bool_op = 'AND'\n        else:\n            bool_op = 'OR'\n        return [bool_op,\n            ('src',) + clause[1:],\n            ('value',) + clause[1:],\n            (cls._rec_name,) + clause[1:],\n            ]\n\n    @classmethod\n    def search_model(cls, name, clause):\n        table = cls.__table__()\n        _, operator, value = clause\n        Operator = fields.SQL_OPERATORS[operator]\n        return [('id', 'in', table.select(table.id,\n                    where=Operator(Substring(table.name, 1,\n                            Case((\n                                    Position(',', table.name) > 0,\n                                    Position(',', table.name) - 1),\n                                else_=0)), value)))]\n\n    @classmethod\n    def get_language(cls):\n        language = Transaction().language\n        result = cls._get_language_cache.get(language)\n        if result is not None:\n            return result\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        langs = Lang.search([])\n        result = [(lang.code, lang.name) for lang in langs]\n        cls._get_language_cache.set(language, result)\n        return result\n\n    @classmethod\n    def view_attributes(cls):\n        return [('/form//field[@name=\"value\"]', 'spell', Eval('lang'))]\n\n    @classmethod\n    def get_ids(cls, name, ttype, lang, ids, cached_after=None):\n        \"Return translation for each id\"\n        pool = Pool()\n        ModelFields = pool.get('ir.model.field')\n        Model = pool.get('ir.model')\n        context = Transaction().context\n        fuzzy_translation = context.get('fuzzy_translation', False)\n\n        translations, to_fetch = {}, []\n        name = str(name)\n        ttype = str(ttype)\n        lang = str(lang)\n        if name.split(',')[0] in ('ir.model.field', 'ir.model'):\n            field_name = name.split(',')[1]\n            with Transaction().set_context(_check_access=False):\n                if name.split(',')[0] == 'ir.model.field':\n                    if field_name == 'field_description':\n                        ttype = 'field'\n                    else:\n                        ttype = 'help'\n                    records = ModelFields.browse(ids)\n                else:\n                    ttype = 'model'\n                    records = Model.browse(ids)\n\n            trans_args = []\n            for record in records:\n                if ttype in ('field', 'help'):\n                    name = record.model.model + ',' + record.name\n                else:\n                    name = record.model + ',' + field_name\n                trans_args.append((name, ttype, lang, None))\n            cls.get_sources(trans_args)\n\n            for record in records:\n                if ttype in ('field', 'help'):\n                    name = record.model.model + ',' + record.name\n                else:\n                    name = record.model + ',' + field_name\n                translations[record.id] = cls.get_source(name, ttype, lang)\n                if translations[record.id] is None:\n                    with Transaction().set_context(language=lang):\n                        if ttype in {'field', 'help'}:\n                            try:\n                                field = getattr(\n                                    pool.get(record.model.model), record.name)\n                            except KeyError:\n                                continue\n                            translations[record.id] = ''\n                            if ttype == 'field':\n                                value = field.string\n                            else:\n                                value = field.help\n                        else:\n                            try:\n                                model = pool.get(record.model)\n                            except KeyError:\n                                continue\n                            if not model.__doc__:\n                                continue\n                            value = model._get_name()\n                        if isinstance(value, StringPartitioned):\n                            for source in value:\n                                translations[record.id] += source\n                        else:\n                            translations[record.id] = value\n            return translations\n\n        # Don't use cache for fuzzy translation\n        if (not fuzzy_translation\n                and (not cached_after\n                    or not cls._translation_cache.sync_since(cached_after))):\n            for obj_id in ids:\n                trans = cls._translation_cache.get((name, ttype, lang, obj_id),\n                    -1)\n                if trans != -1:\n                    translations[obj_id] = trans\n                else:\n                    to_fetch.append(obj_id)\n        else:\n            to_fetch = ids\n\n        if to_fetch:\n            # Get parent translations\n            parent_lang = get_parent(lang)\n            if parent_lang:\n                translations.update(\n                    cls.get_ids(name, ttype, parent_lang, to_fetch))\n\n            if fuzzy_translation:\n                fuzzy_clause = []\n            else:\n                fuzzy_clause = [('fuzzy', '=', False)]\n            for sub_to_fetch in grouped_slice(to_fetch):\n                for translation in cls.search([\n                            ('lang', '=', lang),\n                            ('type', '=', ttype),\n                            ('name', '=', name),\n                            ('value', '!=', ''),\n                            ('value', '!=', None),\n                            ('res_id', 'in', list(sub_to_fetch)),\n                            ] + fuzzy_clause):\n                    translations[translation.res_id] = translation.value\n            # Don't store fuzzy translation in cache\n            if not fuzzy_translation:\n                for res_id in to_fetch:\n                    value = translations.setdefault(res_id)\n                    cls._translation_cache.set(\n                        (name, ttype, lang, res_id), value)\n        return translations\n\n    @classmethod\n    def set_ids(cls, name, ttype, lang, ids, values):\n        \"Set translation for each id\"\n        pool = Pool()\n        ModelFields = pool.get('ir.model.field')\n        Model = pool.get('ir.model')\n        Config = pool.get('ir.configuration')\n        transaction = Transaction()\n        in_max = transaction.database.IN_MAX\n\n        if len(ids) > in_max:\n            for i in range(0, len(ids), in_max):\n                sub_ids = ids[i:i + in_max]\n                sub_values = values[i:i + in_max]\n                cls.set_ids(name, ttype, lang, sub_ids, sub_values)\n            return\n\n        model_name, field_name = name.split(',')\n        if model_name in ('ir.model.field', 'ir.model'):\n            if model_name == 'ir.model.field':\n                if field_name == 'field_description':\n                    ttype = 'field'\n                else:\n                    ttype = 'help'\n                with Transaction().set_context(language='en'):\n                    records = ModelFields.browse(ids)\n            else:\n                ttype = 'model'\n                with Transaction().set_context(language='en'):\n                    records = Model.browse(ids)\n\n            def get_name(record):\n                if ttype in ('field', 'help'):\n                    return record.model.model + ',' + record.name\n                else:\n                    return record.model + ',' + field_name\n\n            with Transaction().set_context(_check_access=False):\n                name2translations = defaultdict(list)\n                for translation in cls.search([\n                            ('lang', '=', lang),\n                            ('type', '=', ttype),\n                            ('name', 'in', [get_name(r) for r in records]),\n                            ]):\n                    name2translations[translation.name].append(translation)\n\n                to_save = []\n                for record, value in zip(records, values):\n                    translations = name2translations.get(get_name(record))\n                    if lang == 'en':\n                        src = value\n                    else:\n                        src = getattr(record, field_name)\n                    if not translations:\n                        if not src and not value:\n                            continue\n                        translation = cls()\n                        translation.name = name\n                        translation.lang = lang\n                        translation.type = ttype\n                        translations.append(translation)\n                    for translation in translations:\n                        translation.src = src\n                        translation.value = value\n                        translation.fuzzy = False\n                        to_save.append(translation)\n                cls.save(to_save)\n            return\n\n        Model = pool.get(model_name)\n        with Transaction().set_context(language=Config.get_language()):\n            records = Model.browse(ids)\n\n        id2translations = defaultdict(list)\n        other_translations = defaultdict(list)\n        with Transaction().set_context(_check_access=False):\n            for translation in cls.search([\n                        ('lang', '=', lang),\n                        ('type', '=', ttype),\n                        ('name', '=', name),\n                        ('res_id', 'in', ids),\n                        ]):\n                id2translations[translation.res_id].append(translation)\n\n            if (lang == Config.get_language()\n                    and Transaction().context.get('fuzzy_translation', True)):\n                for translation in cls.search([\n                            ('lang', '!=', lang),\n                            ('type', '=', ttype),\n                            ('name', '=', name),\n                            ('res_id', 'in', ids),\n                            ]):\n                    other_translations[translation.res_id].append(translation)\n\n            to_save = []\n            for record, value in zip(records, values):\n                translations = id2translations[record.id]\n                if lang == Config.get_language():\n                    src = value\n                else:\n                    src = getattr(record, field_name)\n                if not translations:\n                    if not src and not value:\n                        continue\n                    translation = cls()\n                    translation.name = name\n                    translation.lang = lang\n                    translation.type = ttype\n                    translation.res_id = record.id\n                    translations.append(translation)\n                else:\n                    other_langs = other_translations[record.id]\n                    if other_langs:\n                        for other_lang in other_langs:\n                            other_lang.src = src\n                            other_lang.fuzzy = True\n                            to_save.append(other_lang)\n                for translation in translations:\n                    translation.value = value\n                    translation.src = src\n                    translation.fuzzy = False\n                    to_save.append(translation)\n            cls.save(to_save)\n\n    @classmethod\n    def delete_ids(cls, model, ttype, ids):\n        \"Delete translation for each id\"\n        translations = []\n        with Transaction().set_context(_check_access=False):\n            for sub_ids in grouped_slice(ids):\n                translations += cls.search([\n                        ('type', '=', ttype),\n                        ('name', 'like', model + ',%'),\n                        ('res_id', 'in', list(sub_ids)),\n                        ])\n            cls.delete(translations)\n\n    @classmethod\n    def get_source(cls, name, ttype, lang, source=None):\n        \"Return translation for source\"\n        args = (name, ttype, lang, source)\n        result = cls.get_sources([args])\n        return result[args]\n\n    @classmethod\n    def get_sources(cls, args):\n        '''\n        Take a list of (name, ttype, lang, source).\n        Add the translations to the cache.\n        Return a dict with the translations.\n        '''\n        res = {}\n        parent_args = []\n        parent_langs = []\n        clauses = []\n        transaction = Transaction()\n        if len(args) > transaction.database.IN_MAX:\n            for sub_args in grouped_slice(args):\n                res.update(cls.get_sources(list(sub_args)))\n            return res\n\n        to_cache = []\n        for name, ttype, lang, source in args:\n            name = str(name)\n            ttype = str(ttype)\n            lang = str(lang)\n            if source is not None:\n                source = str(source)\n            trans = cls._translation_cache.get((name, ttype, lang, source), -1)\n            if trans != -1:\n                res[(name, ttype, lang, source)] = trans\n            else:\n                to_cache.append((name, ttype, lang, source))\n                parent_lang = get_parent(lang)\n                if parent_lang:\n                    parent_args.append((name, ttype, parent_lang, source))\n                    parent_langs.append(lang)\n                res[(name, ttype, lang, source)] = None\n                clause = [\n                    ('lang', '=', lang),\n                    ('type', '=', ttype),\n                    ('name', '=', name),\n                    ('value', '!=', ''),\n                    ('value', '!=', None),\n                    ('fuzzy', '=', False),\n                    ('res_id', '=', -1),\n                    ]\n                if source is not None:\n                    clause.append(('src', '=', source))\n                clauses.append(clause)\n\n        # Get parent transactions\n        if parent_args:\n            parent_src = cls.get_sources(parent_args)\n            for (name, ttype, parent_lang, source), lang in zip(\n                    parent_args, parent_langs):\n                res[(name, ttype, lang, source)] = parent_src[\n                    (name, ttype, parent_lang, source)]\n\n        in_max = transaction.database.IN_MAX // 7\n        for sub_clause in grouped_slice(clauses, in_max):\n            for translation in cls.search(['OR'] + list(sub_clause)):\n                key = (translation.name, translation.type,\n                    translation.lang, translation.src)\n                if key not in args:\n                    key = key[:-1] + (None,)\n                res[key] = translation.value\n        for key in to_cache:\n            cls._translation_cache.set(key, res[key])\n        return res\n\n    @classmethod\n    def get_report(cls, report_name, text):\n        language = Transaction().language\n        key = (report_name, language)\n        if cls._translation_report_cache.get(key) is None:\n            cache = {}\n            code = language\n            while code:\n                translations = cls.search([\n                        ('lang', '=', code),\n                        ('type', '=', 'report'),\n                        ('name', '=', report_name),\n                        ('value', '!=', ''),\n                        ('value', '!=', None),\n                        ('fuzzy', '=', False),\n                        ('res_id', '=', -1),\n                        ], order=[('module', 'DESC')])\n                for translation in translations:\n                    cache.setdefault(translation.src, translation.value)\n                code = get_parent(code)\n            cls._translation_report_cache.set(key, cache)\n        return cls._translation_report_cache.get(key, {}).get(text, text)\n\n    @classmethod\n    def copy(cls, translations, default=None):\n        default = default.copy() if default is not None else {}\n        default.setdefault('module')\n        default.setdefault('overriding_module')\n        return super().copy(translations, default=default)\n\n    @classmethod\n    def delete(cls, translations):\n        pool = Pool()\n        Message = pool.get('ir.message')\n        Model = pool.get('ir.model')\n        ModelField = pool.get('ir.model.field')\n        Message._message_cache.clear()\n        Model._get_names_cache.clear()\n        ModelField._get_name_cache.clear()\n        cls._translation_cache.clear()\n        cls._translation_report_cache.clear()\n        ModelView._fields_view_get_cache.clear()\n        return super(Translation, cls).delete(translations)\n\n    @classmethod\n    def create(cls, vlist):\n        pool = Pool()\n        Message = pool.get('ir.message')\n        Model = pool.get('ir.model')\n        ModelField = pool.get('ir.model.field')\n        Message._message_cache.clear()\n        Model._get_names_cache.clear()\n        ModelField._get_name_cache.clear()\n        cls._translation_cache.clear()\n        cls._translation_report_cache.clear()\n        ModelView._fields_view_get_cache.clear()\n        vlist = [x.copy() for x in vlist]\n\n        for vals in vlist:\n            if not vals.get('module'):\n                if Transaction().context.get('module'):\n                    vals['module'] = Transaction().context['module']\n        return super(Translation, cls).create(vlist)\n\n    @classmethod\n    def write(cls, *args):\n        pool = Pool()\n        Message = pool.get('ir.message')\n        Model = pool.get('ir.model')\n        ModelField = pool.get('ir.model.field')\n        Message._message_cache.clear()\n        Model._get_names_cache.clear()\n        ModelField._get_name_cache.clear()\n        cls._translation_cache.clear()\n        cls._translation_report_cache.clear()\n        ModelView._fields_view_get_cache.clear()\n        return super(Translation, cls).write(*args)\n\n    @classmethod\n    def extra_model_data(cls, model_data):\n        \"Yield extra model linked to the model data\"\n        if model_data.model in (\n                'ir.action.report',\n                'ir.action.act_window',\n                'ir.action.wizard',\n                'ir.action.url',\n                ):\n            yield 'ir.action'\n\n    @property\n    def unique_key(self):\n        if self.type in {\n                'report', 'view', 'wizard_button', 'selection'}:\n            return (self.name, self.res_id, self.type, self.src)\n        elif self.type in ('field', 'model', 'help'):\n            return (self.name, self.res_id, self.type)\n\n    @classmethod\n    def from_poentry(cls, entry):\n        'Returns a translation instance for a entry of pofile and its res_id'\n        ttype, name, res_id = entry.msgctxt.split(':')\n        src = entry.msgid\n        value = entry.msgstr\n        fuzzy = 'fuzzy' in entry.flags\n\n        translation = cls(name=name, type=ttype, src=src, fuzzy=fuzzy,\n            value=value)\n        return translation, res_id\n\n    @classmethod\n    def translation_import(cls, lang, module, po_path):\n        pool = Pool()\n        ModelData = pool.get('ir.model.data')\n        if isinstance(po_path, str):\n            po_path = [po_path]\n        models_data = ModelData.search([\n                ('module', '=', module),\n                ])\n        fs_id2prop = {}\n        for model_data in models_data:\n            fs_id2prop.setdefault(model_data.model, {})\n            fs_id2prop[model_data.model][model_data.fs_id] = \\\n                (model_data.db_id, model_data.noupdate)\n            for extra_model in cls.extra_model_data(model_data):\n                fs_id2prop.setdefault(extra_model, {})\n                fs_id2prop[extra_model][model_data.fs_id] = \\\n                    (model_data.db_id, model_data.noupdate)\n\n        translations = set()\n        to_save = []\n\n        id2translation = {}\n        key2ids = {}\n        module_translations = cls.search([\n                ('lang', '=', lang),\n                ('module', '=', module),\n                ], order=[])\n        for translation in module_translations:\n            # Migration from 5.0: ignore error type\n            if translation.type == 'error':\n                continue\n            key = translation.unique_key\n            if not key:\n                raise ValueError('Unknow translation type: %s' %\n                    translation.type)\n            key2ids.setdefault(key, []).append(translation.id)\n            if len(module_translations) <= config.getint('cache', 'record'):\n                id2translation[translation.id] = translation\n\n        def override_translation(ressource_id, new_translation):\n            res_id_module, res_id = ressource_id.split('.')\n            if res_id:\n                model_data, = ModelData.search([\n                        ('module', '=', res_id_module),\n                        ('fs_id', '=', res_id),\n                        ])\n                res_id = model_data.db_id\n            else:\n                res_id = -1\n            with Transaction().set_context(module=res_id_module):\n                domain = [\n                    ('name', '=', new_translation.name),\n                    ('res_id', '=', res_id),\n                    ('lang', '=', new_translation.lang),\n                    ('type', '=', new_translation.type),\n                    ('module', '=', res_id_module),\n                    ]\n                if new_translation.type in {\n                        'report', 'view', 'wizard_button', 'selection'}:\n                    domain.append(('src', '=', new_translation.src))\n                translation, = cls.search(domain)\n                if translation.value != new_translation.value:\n                    translation.value = new_translation.value\n                    translation.overriding_module = module\n                    translation.fuzzy = new_translation.fuzzy\n                    return translation\n\n        # Make a first loop to retreive translation ids in the right order to\n        # get better read locality and a full usage of the cache.\n        translation_ids = []\n        if len(module_translations) <= config.getint('cache', 'record'):\n            processes = (True,)\n        else:\n            processes = (False, True)\n        for processing in processes:\n            if (processing\n                    and len(module_translations) > config.getint('cache',\n                        'record')):\n                id2translation = dict((t.id, t)\n                    for t in cls.browse(translation_ids))\n            for pofile in po_path:\n                for entry in polib.pofile(pofile):\n                    if entry.obsolete:\n                        continue\n                    translation, res_id = cls.from_poentry(entry)\n                    # Migration from 5.0: ignore error type\n                    if translation.type == 'error':\n                        continue\n                    translation.lang = lang\n                    translation.module = module\n                    noupdate = False\n\n                    if '.' in res_id:\n                        to_save.append(override_translation(res_id,\n                                translation))\n                        continue\n\n                    model = translation.name.split(',')[0]\n                    if (model in fs_id2prop\n                            and res_id in fs_id2prop[model]):\n                        res_id, noupdate = fs_id2prop[model][res_id]\n\n                    if res_id:\n                        try:\n                            res_id = int(res_id)\n                        except ValueError:\n                            res_id = None\n                    if not res_id:\n                        res_id = -1\n\n                    translation.res_id = res_id\n                    key = translation.unique_key\n                    if not key:\n                        raise ValueError('Unknow translation type: %s' %\n                            translation.type)\n                    ids = key2ids.get(key, [])\n\n                    if not processing:\n                        translation_ids.extend(ids)\n                        continue\n\n                    if not ids:\n                        to_save.append(translation)\n                    else:\n                        for translation_id in ids:\n                            old_translation = id2translation[translation_id]\n                            if not noupdate:\n                                old_translation.value = translation.value\n                                old_translation.fuzzy = translation.fuzzy\n                                to_save.append(old_translation)\n                            else:\n                                translations.add(old_translation)\n        cls.save([_f for _f in to_save if _f])\n        translations |= set(to_save)\n\n        if translations:\n            all_translations = set(cls.search([\n                        ('module', '=', module),\n                        ('lang', '=', lang),\n                        ]))\n            translations_to_delete = all_translations - translations\n            cls.delete(list(translations_to_delete))\n        return len(translations)\n\n    @classmethod\n    def translation_export(cls, lang, module):\n        pool = Pool()\n        ModelData = pool.get('ir.model.data')\n        Config = pool.get('ir.configuration')\n\n        models_data = ModelData.search([\n                ('module', '=', module),\n                ])\n        db_id2fs_id = {}\n        for model_data in models_data:\n            db_id2fs_id.setdefault(model_data.model, {})\n            db_id2fs_id[model_data.model][model_data.db_id] = model_data.fs_id\n            for extra_model in cls.extra_model_data(model_data):\n                db_id2fs_id.setdefault(extra_model, {})\n                db_id2fs_id[extra_model][model_data.db_id] = model_data.fs_id\n\n        pofile = TrytonPOFile(wrapwidth=78)\n        pofile.metadata = {\n            'Content-Type': 'text/plain; charset=utf-8',\n            }\n\n        with Transaction().set_context(language=Config.get_language()):\n            translations = cls.search([\n                ('lang', '=', lang),\n                ('module', '=', module),\n                ], order=[])\n        for translation in translations:\n            if (translation.overriding_module\n                    and translation.overriding_module != module):\n                raise OverriddenError(\n                    gettext('ir.msg_translation_overridden',\n                        name=translation.name,\n                        overriding_module=translation.overriding_module))\n            flags = [] if not translation.fuzzy else ['fuzzy']\n            trans_ctxt = '%(type)s:%(name)s:' % {\n                'type': translation.type,\n                'name': translation.name,\n                }\n            res_id = translation.res_id\n            if res_id >= 0:\n                model, _ = translation.name.split(',')\n                if model in db_id2fs_id:\n                    res_id = db_id2fs_id[model].get(res_id)\n                else:\n                    continue\n                trans_ctxt += '%s' % res_id\n            entry = polib.POEntry(msgid=(translation.src or ''),\n                msgstr=(translation.value or ''), msgctxt=trans_ctxt,\n                flags=flags)\n            if entry.msgid or entry.msgstr:\n                pofile.append(entry)\n\n        if pofile:\n            pofile.sort()\n            return str(pofile).encode('utf-8')\n        else:\n            return\n\n\nclass TranslationSetStart(ModelView):\n    \"Set Translation\"\n    __name__ = 'ir.translation.set.start'\n\n\nclass TranslationSetSucceed(ModelView):\n    \"Set Translation\"\n    __name__ = 'ir.translation.set.succeed'\n\n\nclass TranslationSet(Wizard):\n    \"Set Translation\"\n    __name__ = \"ir.translation.set\"\n\n    start = StateView('ir.translation.set.start',\n        'ir.translation_set_start_view_form', [\n            Button('Cancel', 'end', 'tryton-cancel'),\n            Button('Set', 'set_', 'tryton-ok', default=True),\n            ])\n    set_ = StateTransition()\n    succeed = StateView('ir.translation.set.succeed',\n        'ir.translation_set_succeed_view_form', [\n            Button('OK', 'end', 'tryton-ok', default=True),\n            ])\n\n    def extract_report_opendocument(self, content):\n        def extract(node):\n            if node.nodeType in {node.CDATA_SECTION_NODE, node.TEXT_NODE}:\n                if (node.parentNode\n                        and node.parentNode.tagName in {\n                            'text:placeholder',\n                            'text:page-number',\n                            'text:page-count',\n                            }):\n                    return\n                if node.nodeValue:\n                    txt = node.nodeValue.strip()\n                    if txt:\n                        yield txt\n\n            for child in [x for x in node.childNodes]:\n                for string in extract(child):\n                    yield string\n\n        zip_ = get_zip_file(BytesIO(content))\n        for content_xml in [\n                zip_.read('content.xml'),\n                zip_.read('styles.xml'),\n                ]:\n            document = parseString(content_xml)\n            for string in extract(document.documentElement):\n                yield string\n\n    extract_report_odt = extract_report_opendocument\n    extract_report_odp = extract_report_opendocument\n    extract_report_ods = extract_report_opendocument\n    extract_report_odg = extract_report_opendocument\n\n    def extract_report_genshi(template_class):\n        def method(self, content,\n                keywords=None, comment_tags=None, **options):\n            options['template_class'] = template_class\n            content = BytesIO(content)\n            if keywords is None:\n                keywords = []\n            if comment_tags is None:\n                comment_tags = []\n\n            for _, _, string, _ in genshi_extract(\n                    content, keywords, comment_tags, options):\n                if string:\n                    yield string\n        if not template_class:\n            raise ValueError('a template class is required')\n        return method\n    factories = MIMETemplateLoader().factories\n    extract_report_txt = extract_report_genshi(factories['text'])\n    extract_report_xml = extract_report_genshi(\n        factories.get('markup', factories.get('xml')))\n    extract_report_html = extract_report_genshi(\n        factories.get('markup', factories.get('xml')))\n    extract_report_xhtml = extract_report_genshi(\n        factories.get('markup', factories.get('xml')))\n    del factories\n\n    def set_report(self):\n        pool = Pool()\n        Report = pool.get('ir.action.report')\n        Translation = pool.get('ir.translation')\n\n        if self.model == Report:\n            reports = self.records\n        elif not self.model or self.model.__name__ == 'ir.ui.menu':\n            with Transaction().set_context(active_test=False):\n                reports = Report.search([('translatable', '=', True)])\n        else:\n            return\n\n        cursor = Transaction().connection.cursor()\n        translation = Translation.__table__()\n        report_strings = defaultdict(set)\n        for report in reports:\n            content = None\n            if report.report:\n                with file_open(report.report.replace('/', os.sep),\n                        mode='rb') as fp:\n                    content = fp.read()\n            for content, module in [\n                    (report.report_content_custom, None),\n                    (content, report.module)]:\n                if not content:\n                    continue\n\n                cursor.execute(*translation.select(\n                        translation.id, translation.name, translation.src,\n                        where=(translation.lang == 'en')\n                        & (translation.type == 'report')\n                        & (translation.name == report.report_name)\n                        & (translation.module == module)))\n                trans_reports = {t['src']: t for t in cursor_dict(cursor)}\n\n                strings = report_strings[report.report_name, report.module]\n                func_name = 'extract_report_%s' % report.template_extension\n                strings.update(getattr(self, func_name)(content))\n\n                for string in strings:\n                    done = False\n                    if string in trans_reports:\n                        del trans_reports[string]\n                        continue\n                    for string_trans in trans_reports:\n                        if string_trans in strings:\n                            continue\n                        seqmatch = SequenceMatcher(lambda x: x == ' ',\n                                string, string_trans)\n                        if seqmatch.ratio() == 1.0:\n                            del trans_reports[report.report_name][string_trans]\n                            done = True\n                            break\n                        if seqmatch.ratio() > 0.6:\n                            cursor.execute(*translation.update(\n                                    [translation.src, translation.fuzzy],\n                                    [string, True],\n                                    where=(\n                                        translation.name == report.report_name)\n                                    & (translation.type == 'report')\n                                    & (translation.src == string_trans)\n                                    & (translation.module == module)))\n                            del trans_reports[string_trans]\n                            done = True\n                            break\n                    if not done:\n                        cursor.execute(*translation.insert(\n                                [translation.name, translation.lang,\n                                    translation.type, translation.src,\n                                    translation.value, translation.module,\n                                    translation.fuzzy, translation.res_id],\n                                [[\n                                        report.report_name, 'en',\n                                        'report', string,\n                                        '', module,\n                                        False, -1]]))\n        for (report_name, module), strings in report_strings.items():\n            query = translation.delete(\n                where=(translation.name == report_name)\n                & (translation.type == 'report')\n                & (translation.module == module))\n            if strings:\n                query.where &= ~translation.src.in_(list(strings))\n            cursor.execute(*query)\n\n    def _translate_view(self, element):\n        strings = []\n        for attr in ('string', 'sum', 'confirm', 'help'):\n            if element.get(attr):\n                string = element.get(attr)\n                if string:\n                    strings.append(string)\n        for child in element:\n            strings.extend(self._translate_view(child))\n        return strings\n\n    def set_view(self):\n        pool = Pool()\n        View = pool.get('ir.ui.view')\n        Translation = pool.get('ir.translation')\n\n        if self.model == View:\n            views = self.records\n        elif not self.model or self.model.__name__ == 'ir.ui.menu':\n            with Transaction().set_context(active_test=False):\n                views = View.search([])\n        else:\n            return\n\n        cursor = Transaction().connection.cursor()\n        translation = Translation.__table__()\n        for view in views:\n            cursor.execute(*translation.select(\n                    translation.id, translation.name, translation.src,\n                    where=(translation.lang == 'en')\n                    & (translation.type == 'view')\n                    & (translation.name == view.model)\n                    & (translation.module == view.module)))\n            trans_views = {t['src']: t for t in cursor_dict(cursor)}\n\n            xml = (view.arch or '').strip()\n            if not xml:\n                continue\n            tree = etree.fromstring(xml)\n            root_element = tree.getroottree().getroot()\n            strings = self._translate_view(root_element)\n            with Transaction().set_context(active_test=False):\n                views2 = View.search([\n                    ('model', '=', view.model),\n                    ('id', '!=', view.id),\n                    ('module', '=', view.module),\n                    ])\n            for view2 in views2:\n                xml2 = view2.arch\n                if not xml2:\n                    continue\n                tree2 = etree.fromstring(xml2)\n                root2_element = tree2.getroottree().getroot()\n                strings += self._translate_view(root2_element)\n            if not strings:\n                continue\n            for string in set(strings):\n                done = False\n                if string in trans_views:\n                    del trans_views[string]\n                    continue\n                for string_trans in trans_views:\n                    if string_trans in strings:\n                        continue\n                    seqmatch = SequenceMatcher(lambda x: x == ' ',\n                            string, string_trans)\n                    if seqmatch.ratio() == 1.0:\n                        del trans_views[string_trans]\n                        done = True\n                        break\n                    if seqmatch.ratio() > 0.6:\n                        cursor.execute(*translation.update(\n                                [translation.src,\n                                    translation.fuzzy],\n                                [string, True],\n                                where=(translation.id\n                                    == trans_views[string_trans]['id'])))\n                        del trans_views[string_trans]\n                        done = True\n                        break\n                if not done:\n                    cursor.execute(*translation.insert(\n                            [translation.name, translation.lang,\n                                translation.type, translation.src,\n                                translation.value, translation.module,\n                                translation.fuzzy, translation.res_id],\n                            [[\n                                    view.model, 'en',\n                                    'view', string,\n                                    '', view.module,\n                                    False, -1]]))\n            if strings:\n                cursor.execute(*translation.delete(\n                        where=(translation.name == view.model)\n                        & (translation.type == 'view')\n                        & (translation.module == view.module)\n                        & ~translation.src.in_(strings)))\n\n    def transition_set_(self):\n        self.set_report()\n        self.set_view()\n        return 'succeed'\n\n\nclass TranslationCleanStart(ModelView):\n    'Clean translation'\n    __name__ = 'ir.translation.clean.start'\n\n\nclass TranslationCleanSucceed(ModelView):\n    'Clean translation'\n    __name__ = 'ir.translation.clean.succeed'\n\n\nclass TranslationClean(Wizard):\n    \"Clean translation\"\n    __name__ = 'ir.translation.clean'\n\n    start = StateView('ir.translation.clean.start',\n        'ir.translation_clean_start_view_form', [\n            Button('Cancel', 'end', 'tryton-cancel'),\n            Button('Clean', 'clean', 'tryton-ok', default=True),\n            ])\n    clean = StateTransition()\n    succeed = StateView('ir.translation.clean.succeed',\n        'ir.translation_clean_succeed_view_form', [\n            Button('OK', 'end', 'tryton-ok', default=True),\n            ])\n\n    @staticmethod\n    def _clean_field(translation):\n        pool = Pool()\n        try:\n            model_name, field_name = translation.name.split(',', 1)\n        except ValueError:\n            return True\n        try:\n            Model = pool.get(model_name)\n        except KeyError:\n            return True\n        field = Model._fields.get(field_name)\n        if not field:\n            return True\n        if translation.src not in list(field.string):\n            return True\n\n    @staticmethod\n    def _clean_model(translation):\n        pool = Pool()\n        try:\n            model_name, field_name = translation.name.split(',', 1)\n        except ValueError:\n            return True\n        try:\n            Model = pool.get(model_name)\n        except KeyError:\n            return True\n        if translation.res_id >= 0:\n            if field_name not in Model._fields:\n                return True\n            field = Model._fields[field_name]\n            if (not hasattr(field, 'translate')\n                    or not field.translate):\n                return True\n        elif field_name not in ('name'):\n            return True\n\n    @staticmethod\n    def _clean_report(translation):\n        pool = Pool()\n        Report = pool.get('ir.action.report')\n        with Transaction().set_context(active_test=False):\n            if not Report.search([\n                        ('report_name', '=', translation.name),\n                        ('translatable', '=', True),\n                        ]):\n                return True\n\n    @staticmethod\n    def _clean_selection(translation):\n        pool = Pool()\n        try:\n            model_name, field_name = translation.name.split(',', 1)\n        except ValueError:\n            return True\n        try:\n            Model = pool.get(model_name)\n        except KeyError:\n            return True\n        if field_name not in Model._fields:\n            return True\n        field = Model._fields[field_name]\n        if (not hasattr(field, 'selection')\n                or not field.selection\n                or not getattr(field, 'translate_selection', True)):\n            return True\n        if (isinstance(field.selection, (tuple, list))\n                and translation.src not in dict(field.selection).values()):\n            return True\n\n    @staticmethod\n    def _clean_view(translation):\n        pool = Pool()\n        model_name = translation.name\n        try:\n            pool.get(model_name)\n        except KeyError:\n            return True\n\n    @staticmethod\n    def _clean_wizard_button(translation):\n        pool = Pool()\n        try:\n            wizard_name, state_name, button_name = \\\n                translation.name.split(',', 2)\n        except ValueError:\n            return True\n        try:\n            Wizard = pool.get(wizard_name, type='wizard')\n        except KeyError:\n            return True\n        if not Wizard:\n            return True\n        state = Wizard.states.get(state_name)\n        if not state or not hasattr(state, 'buttons'):\n            return True\n        if button_name in [b.state for b in state.buttons]:\n            return False\n        return True\n\n    @staticmethod\n    def _clean_help(translation):\n        pool = Pool()\n        try:\n            model_name, field_name = translation.name.split(',', 1)\n        except ValueError:\n            return True\n        try:\n            Model = pool.get(model_name)\n        except KeyError:\n            return True\n        field = Model._fields.get(field_name)\n        if not field:\n            return True\n        if not field.help:\n            return True\n        if translation.src not in list(field.help):\n            return True\n\n    def transition_clean(self):\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        ModelData = pool.get('ir.model.data')\n\n        to_delete = []\n        keys = set()\n        translations = Translation.search([])\n        for translation in translations:\n            if getattr(self, '_clean_%s' % translation.type)(translation):\n                to_delete.append(translation.id)\n            elif translation.type in ('field', 'model', 'wizard_button',\n                    'help'):\n                key = (translation.module, translation.lang, translation.type,\n                    translation.name, translation.res_id)\n                if key in keys:\n                    to_delete.append(translation.id)\n                else:\n                    keys.add(key)\n        # skip translation handled in ir.model.data\n        models_data = ModelData.search([\n            ('db_id', 'in', to_delete),\n            ('model', '=', 'ir.translation'),\n            ])\n        for mdata in models_data:\n            if mdata.db_id in to_delete:\n                to_delete.remove(mdata.db_id)\n\n        Translation.delete(Translation.browse(to_delete))\n        return 'succeed'\n\n\nclass TranslationUpdateStart(ModelView):\n    \"Update translation\"\n    __name__ = 'ir.translation.update.start'\n\n    language = fields.Many2One('ir.lang', 'Language', required=True,\n        domain=[('translatable', '=', True)])\n\n    @staticmethod\n    def default_language():\n        Lang = Pool().get('ir.lang')\n        code = Transaction().context.get('language')\n        try:\n            lang, = Lang.search([\n                    ('code', '=', code),\n                    ('translatable', '=', True),\n                    ], limit=1)\n            return lang.id\n        except ValueError:\n            return None\n\n\nclass TranslationUpdate(Wizard):\n    \"Update translation\"\n    __name__ = \"ir.translation.update\"\n\n    _source_types = ['report', 'view', 'wizard_button', 'selection']\n    _ressource_types = ['field', 'model', 'help']\n    _updatable_types = ['field', 'model', 'selection', 'help']\n\n    start = StateView('ir.translation.update.start',\n        'ir.translation_update_start_view_form', [\n            Button('Cancel', 'end', 'tryton-cancel'),\n            Button('Update', 'update', 'tryton-ok', default=True),\n            ])\n    update = StateAction('ir.act_translation_form')\n\n    @staticmethod\n    def transition_update():\n        return 'end'\n\n    def do_update(self, action):\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        Report = pool.get('ir.action.report')\n        View = pool.get('ir.ui.view')\n        cursor = Transaction().connection.cursor()\n        cursor_update = Transaction().connection.cursor()\n        translation = Translation.__table__()\n        lang = self.start.language.code\n        parent_lang = get_parent(lang)\n\n        if self.model == Report:\n            reports = self.records\n            source_clause = ((translation.type == 'report')\n                & translation.name.in_([r.report_name for r in reports]))\n        elif self.model == View:\n            views = self.records\n            source_clause = ((translation.type == 'view')\n                & translation.name.in_([v.model for v in views]))\n        else:\n            source_clause = Literal(True)\n\n        columns = [translation.name.as_('name'),\n            translation.res_id.as_('res_id'), translation.type.as_('type'),\n            translation.src.as_('src'), translation.module.as_('module')]\n        cursor.execute(*(translation.select(*columns,\n                    where=(translation.lang == 'en')\n                    & source_clause\n                    & translation.type.in_(self._source_types))\n                - translation.select(*columns,\n                    where=(translation.lang == lang)\n                    & source_clause\n                    & translation.type.in_(self._source_types))))\n        to_create = []\n        for row in cursor_dict(cursor):\n            to_create.append({\n                'name': row['name'],\n                'res_id': row['res_id'],\n                'lang': lang,\n                'type': row['type'],\n                'src': row['src'],\n                'module': row['module'],\n                })\n        if to_create:\n            Translation.create(to_create)\n\n        if parent_lang:\n            columns.append(translation.value)\n            cursor.execute(*(translation.select(*columns,\n                        where=(translation.lang == parent_lang)\n                        & source_clause\n                        & translation.type.in_(self._source_types))\n                    & translation.select(*columns,\n                        where=(translation.lang == lang)\n                        & source_clause\n                        & translation.type.in_(self._source_types))))\n            for row in cursor_dict(cursor):\n                cursor_update.execute(*translation.update(\n                        [translation.value],\n                        [''],\n                        where=(translation.name == row['name'])\n                        & (translation.res_id == row['res_id'])\n                        & (translation.type == row['type'])\n                        & (translation.src == row['src'])\n                        & (translation.module == row['module'])\n                        & (translation.lang == lang)))\n\n        if self.model in {Report, View}:\n            return\n\n        columns = [translation.name.as_('name'),\n            translation.res_id.as_('res_id'), translation.type.as_('type'),\n            translation.module.as_('module')]\n        cursor.execute(*(translation.select(*columns,\n                    where=(translation.lang == 'en')\n                    & translation.type.in_(self._ressource_types))\n                - translation.select(*columns,\n                    where=(translation.lang == lang)\n                    & translation.type.in_(self._ressource_types))))\n        to_create = []\n        for row in cursor_dict(cursor):\n            to_create.append({\n                'name': row['name'],\n                'res_id': row['res_id'],\n                'lang': lang,\n                'type': row['type'],\n                'module': row['module'],\n                })\n        if to_create:\n            Translation.create(to_create)\n\n        if parent_lang:\n            columns.append(translation.value)\n            cursor.execute(*(translation.select(*columns,\n                        where=(translation.lang == parent_lang)\n                        & translation.type.in_(self._ressource_types))\n                    & translation.select(*columns,\n                        where=(translation.lang == lang)\n                        & translation.type.in_(self._ressource_types))))\n            for row in cursor_dict(cursor):\n                cursor_update.execute(*translation.update(\n                        [translation.value],\n                        [''],\n                        where=(translation.name == row['name'])\n                        & (translation.res_id == row['res_id'])\n                        & (translation.type == row['type'])\n                        & (translation.module == row['module'])\n                        & (translation.lang == lang)))\n\n        columns = [translation.name.as_('name'),\n            translation.res_id.as_('res_id'), translation.type.as_('type'),\n            translation.src.as_('src'), translation.module.as_('module')]\n        cursor.execute(*(translation.select(*columns,\n                    where=(translation.lang == 'en')\n                    & translation.type.in_(self._updatable_types))\n                - translation.select(*columns,\n                    where=(translation.lang == lang)\n                    & translation.type.in_(self._updatable_types))))\n        for row in cursor_dict(cursor):\n            cursor_update.execute(*translation.update(\n                    [translation.fuzzy, translation.src],\n                    [True, row['src']],\n                    where=(translation.name == row['name'])\n                    & (translation.type == row['type'])\n                    & (translation.lang == lang)\n                    & (translation.res_id == (row['res_id'] or -1))\n                    & (translation.module == row['module'])))\n\n        cursor.execute(*translation.select(\n                translation.src.as_('src'),\n                Max(translation.value).as_('value'),\n                where=(translation.lang == lang)\n                & translation.src.in_(\n                    translation.select(translation.src,\n                        where=((translation.value == '')\n                            | (translation.value == Null))\n                        & (translation.lang == lang)))\n                & (translation.value != '')\n                & (translation.value != Null),\n                group_by=translation.src))\n\n        for row in cursor_dict(cursor):\n            cursor_update.execute(*translation.update(\n                    [translation.fuzzy, translation.value],\n                    [True, row['value']],\n                    where=(translation.src == row['src'])\n                    & ((translation.value == '') | (translation.value == Null))\n                    & (translation.lang == lang)))\n\n        cursor_update.execute(*translation.update(\n                [translation.fuzzy],\n                [False],\n                where=((translation.value == '') | (translation.value == Null))\n                & (translation.lang == lang)))\n\n        action['pyson_domain'] = PYSONEncoder().encode([\n            ('module', '!=', None),\n            ('lang', '=', lang),\n        ])\n        return action, {}\n\n\nclass TranslationExportStart(ModelView):\n    \"Export translation\"\n    __name__ = 'ir.translation.export.start'\n\n    language = fields.Many2One('ir.lang', 'Language', required=True,\n        domain=[\n            ('translatable', '=', True),\n            ('code', '!=', 'en'),\n            ])\n    module = fields.Many2One('ir.module', 'Module', required=True,\n        domain=[\n            ('state', 'in', ['activated', 'to upgrade', 'to remove']),\n            ])\n\n    @classmethod\n    def default_language(cls):\n        Lang = Pool().get('ir.lang')\n        code = Transaction().context.get('language')\n        domain = [('code', '=', code)] + cls.language.domain\n        try:\n            lang, = Lang.search(domain, limit=1)\n            return lang.id\n        except ValueError:\n            return None\n\n\nclass TranslationExportResult(ModelView):\n    \"Export translation\"\n    __name__ = 'ir.translation.export.result'\n\n    language = fields.Many2One('ir.lang', 'Language', readonly=True)\n    module = fields.Many2One('ir.module', 'Module', readonly=True)\n    file = fields.Binary('File', readonly=True, filename='filename')\n    filename = fields.Char('Filename')\n\n\nclass TranslationExport(Wizard):\n    \"Export translation\"\n    __name__ = \"ir.translation.export\"\n\n    start = StateView('ir.translation.export.start',\n        'ir.translation_export_start_view_form', [\n            Button('Cancel', 'end', 'tryton-cancel'),\n            Button('Export', 'export', 'tryton-ok', default=True),\n            ])\n    export = StateTransition()\n    result = StateView('ir.translation.export.result',\n        'ir.translation_export_result_view_form', [\n            Button('Close', 'end', 'tryton-close'),\n            ])\n\n    def transition_export(self):\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        self.result.file = Translation.translation_export(\n            self.start.language.code, self.start.module.name)\n        return 'result'\n\n    def default_result(self, fields):\n        file_ = self.result.file\n        cast = self.result.__class__.file.cast\n        self.result.file = False  # No need to store it in session\n        return {\n            'module': self.start.module.id,\n            'language': self.start.language.id,\n            'file': cast(file_) if file_ else None,\n            'filename': '%s.po' % self.start.language.code,\n            }\n\n\nclass TranslationReport(Wizard):\n    \"Open translations of report\"\n    __name__ = 'ir.translation.report'\n    start_state = 'open_'\n    open_ = StateAction('ir.act_translation_report')\n\n    def do_open_(self, action):\n        context = Transaction().context\n        reports = self.records\n        action['pyson_domain'] = PYSONEncoder().encode([\n                ('type', '=', 'report'),\n                ('name', 'in', [r.report_name for r in reports]),\n                ])\n        # Behaves like a relate to have name suffix\n        action['keyword'] = 'form_relate'\n        return action, {\n            'model': context['active_model'],\n            'ids': context['active_ids'],\n            'id': context['active_id'],\n            }\n"
  },
  {
    "path": "trytond/ir/translation.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <record model=\"ir.ui.view\" id=\"translation_view_form\">\n            <field name=\"model\">ir.translation</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">translation_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"translation_view_tree\">\n            <field name=\"model\">ir.translation</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">translation_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_translation_form\">\n            <field name=\"name\">Translations</field>\n            <field name=\"res_model\">ir.translation</field>\n            <field name=\"domain\" eval=\"None\"/>\n        </record>\n        <record model=\"ir.action.act_window.domain\"\n            id=\"act_translation_form_domain_module\">\n            <field name=\"name\">Modules</field>\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"domain\" eval=\"[('module', '!=', None)]\" pyson=\"1\"/>\n            <field name=\"act_window\" ref=\"act_translation_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.domain\"\n            id=\"act_translation_form_domain_local\">\n            <field name=\"name\">Local</field>\n            <field name=\"sequence\" eval=\"20\"/>\n            <field name=\"domain\" eval=\"[('module', '=', None)]\" pyson=\"1\"/>\n            <field name=\"act_window\" ref=\"act_translation_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_translation_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"translation_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_translation_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_translation_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"translation_view_form\"/>\n            <field name=\"act_window\" ref=\"act_translation_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_localization\"\n            action=\"act_translation_form\"\n            sequence=\"20\"\n            id=\"menu_translation_form\"/>\n\n        <record model=\"ir.action.wizard\" id=\"wizard_translation_report\">\n            <field name=\"name\">Translations</field>\n            <field name=\"wiz_name\">ir.translation.report</field>\n            <field name=\"model\">ir.action.report</field>\n        </record>\n        <record model=\"ir.action.keyword\" id=\"wizard_translation_report_keyword1\">\n            <field name=\"keyword\">form_relate</field>\n            <field name=\"model\">ir.action.report,-1</field>\n            <field name=\"action\" ref=\"wizard_translation_report\"/>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_translation_report\">\n            <field name=\"name\">Translations</field>\n            <field name=\"res_model\">ir.translation</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"translation_set_start_view_form\">\n            <field name=\"model\">ir.translation.set.start</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">translation_set_start_form</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"translation_set_succeed_view_form\">\n            <field name=\"model\">ir.translation.set.succeed</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">translation_set_succeed_form</field>\n        </record>\n\n        <record model=\"ir.action.wizard\" id=\"act_translation_set\">\n            <field name=\"name\">Set Translations</field>\n            <field name=\"wiz_name\">ir.translation.set</field>\n        </record>\n        <record model=\"ir.action.keyword\"\n            id=\"act_translation_set_keyword_report\">\n            <field name=\"keyword\">form_action</field>\n            <field name=\"model\">ir.action.report,-1</field>\n            <field name=\"action\" ref=\"act_translation_set\"/>\n        </record>\n        <record model=\"ir.action.keyword\"\n            id=\"act_translation_set_keyword_view\">\n            <field name=\"keyword\">form_action</field>\n            <field name=\"model\">ir.ui.view,-1</field>\n            <field name=\"action\" ref=\"act_translation_set\"/>\n        </record>\n        <menuitem\n            parent=\"menu_localization\"\n            action=\"act_translation_set\"\n            sequence=\"90\"\n            id=\"menu_translation_set\"/>\n\n        <record model=\"ir.ui.view\" id=\"translation_clean_start_view_form\">\n            <field name=\"model\">ir.translation.clean.start</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">translation_clean_start_form</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"translation_clean_succeed_view_form\">\n            <field name=\"model\">ir.translation.clean.succeed</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">translation_clean_succeed_form</field>\n        </record>\n\n        <record model=\"ir.action.wizard\" id=\"act_translation_clean\">\n            <field name=\"name\">Clean Translations</field>\n            <field name=\"wiz_name\">ir.translation.clean</field>\n        </record>\n        <menuitem\n            parent=\"menu_localization\"\n            action=\"act_translation_clean\"\n            sequence=\"91\"\n            id=\"menu_translation_clean\"/>\n\n        <record model=\"ir.ui.view\" id=\"translation_update_start_view_form\">\n            <field name=\"model\">ir.translation.update.start</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">translation_update_start_form</field>\n        </record>\n\n        <record model=\"ir.action.wizard\" id=\"act_translation_update\">\n            <field name=\"name\">Synchronize Translations</field>\n            <field name=\"wiz_name\">ir.translation.update</field>\n        </record>\n        <record model=\"ir.action.keyword\"\n            id=\"act_translation_update_keyword_report\">\n            <field name=\"keyword\">form_action</field>\n            <field name=\"model\">ir.action.report,-1</field>\n            <field name=\"action\" ref=\"act_translation_update\"/>\n        </record>\n        <record model=\"ir.action.keyword\"\n            id=\"act_translation_update_keyword_view\">\n            <field name=\"keyword\">form_action</field>\n            <field name=\"model\">ir.ui.view,-1</field>\n            <field name=\"action\" ref=\"act_translation_update\"/>\n        </record>\n        <menuitem\n            parent=\"menu_localization\"\n            action=\"act_translation_update\"\n            sequence=\"92\"\n            id=\"menu_translation_update\"/>\n\n        <record model=\"ir.ui.view\" id=\"translation_export_start_view_form\">\n            <field name=\"model\">ir.translation.export.start</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">translation_export_start_form</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"translation_export_result_view_form\">\n            <field name=\"model\">ir.translation.export.result</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">translation_export_result_form</field>\n        </record>\n\n        <record model=\"ir.action.wizard\" id=\"act_translation_export\">\n            <field name=\"name\">Export Translations</field>\n            <field name=\"wiz_name\">ir.translation.export</field>\n        </record>\n        <menuitem\n            parent=\"menu_localization\"\n            action=\"act_translation_export\"\n            sequence=\"93\"\n            id=\"menu_translation_export\"/>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/trigger.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport time\n\nfrom sql import Literal, Null, Select\nfrom sql.aggregate import Count, Max\nfrom sql.functions import CurrentTimestamp\nfrom sql.operators import Concat\n\nfrom trytond.cache import Cache\nfrom trytond.i18n import gettext\nfrom trytond.model import (\n    Check, DeactivableMixin, EvalEnvironment, Index, ModelSQL, ModelView,\n    fields)\nfrom trytond.model.exceptions import ValidationError\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval, PYSONDecoder, TimeDelta\nfrom trytond.tools import grouped_slice, reduce_ids\nfrom trytond.transaction import Transaction\n\n\nclass ConditionError(ValidationError):\n    pass\n\n\nclass Trigger(DeactivableMixin, ModelSQL, ModelView):\n    \"Trigger\"\n    __name__ = 'ir.trigger'\n    name = fields.Char('Name', required=True, translate=True)\n    model = fields.Many2One('ir.model', 'Model', required=True)\n    on_time = fields.Boolean('On Time', states={\n            'invisible': (Eval('on_create', False)\n                | Eval('on_write', False)\n                | Eval('on_delete', False)),\n            }, depends=['on_create', 'on_write', 'on_delete'])\n    on_create = fields.Boolean('On Create', states={\n        'invisible': Eval('on_time', False),\n        }, depends=['on_time'])\n    on_write = fields.Boolean('On Write', states={\n        'invisible': Eval('on_time', False),\n        }, depends=['on_time'])\n    on_delete = fields.Boolean('On Delete', states={\n        'invisible': Eval('on_time', False),\n        }, depends=['on_time'])\n    condition = fields.Char('Condition', required=True,\n        help='A PYSON statement evaluated with record represented by '\n        '\"self\"\\nIt triggers the action if true.')\n    limit_number = fields.Integer('Limit Number', required=True,\n        help='Limit the number of call to \"Action Function\" by records.\\n'\n        '0 for no limit.')\n    minimum_time_delay = fields.TimeDelta(\n        \"Minimum Delay\",\n        domain=['OR',\n            ('minimum_time_delay', '=', None),\n            ('minimum_time_delay', '>=', TimeDelta()),\n            ],\n        help='Set a minimum time delay between call to \"Action Function\" '\n        'for the same record.\\n'\n        'empty for no delay.')\n    action = fields.Selection([], \"Action\", required=True)\n    _get_triggers_cache = Cache('ir_trigger.get_triggers')\n\n    @classmethod\n    def __setup__(cls):\n        super(Trigger, cls).__setup__()\n        t = cls.__table__()\n        cls._sql_constraints += [\n            ('on_exclusive',\n                Check(t, ~((t.on_time == Literal(True))\n                        & ((t.on_create == Literal(True))\n                            | (t.on_write == Literal(True))\n                            | (t.on_delete == Literal(True))))),\n                '\"On Time\" and others are mutually exclusive!'),\n            ]\n        cls._order.insert(0, ('name', 'ASC'))\n\n    @classmethod\n    def __register__(cls, module_name):\n        cursor = Transaction().connection.cursor()\n        table = cls.__table_handler__(cls, module_name)\n        sql_table = cls.__table__()\n\n        super(Trigger, cls).__register__(module_name)\n\n        table_h = cls.__table_handler__(module_name)\n\n        # Migration from 3.4:\n        # change minimum_delay into timedelta minimum_time_delay\n        if table.column_exist('minimum_delay'):\n            cursor.execute(*sql_table.select(\n                    sql_table.id, sql_table.minimum_delay,\n                    where=sql_table.minimum_delay != Null))\n            for id_, delay in cursor:\n                delay = datetime.timedelta(hours=delay)\n                cursor.execute(*sql_table.update(\n                        [sql_table.minimum_time_delay],\n                        [delay],\n                        where=sql_table.id == id_))\n            table.drop_column('minimum_delay')\n\n        # Migration from 5.4: merge action\n        if (table_h.column_exist('action_model')\n                and table_h.column_exist('action_function')):\n            pool = Pool()\n            Model = pool.get('ir.model')\n            model = Model.__table__()\n            action_model = model.select(\n                model.model, where=model.id == sql_table.action_model)\n            cursor.execute(*sql_table.update(\n                    [sql_table.action],\n                    [Concat(action_model, Concat(\n                                '|', sql_table.action_function))]))\n            table_h.drop_column('action_model')\n            table_h.drop_column('action_function')\n\n    @classmethod\n    def validate_fields(cls, triggers, field_names):\n        super().validate_fields(triggers, field_names)\n        cls.check_condition(triggers, field_names)\n\n    @classmethod\n    def check_condition(cls, triggers, field_names=None):\n        '''\n        Check condition\n        '''\n        if field_names and 'condition' not in field_names:\n            return\n        for trigger in triggers:\n            try:\n                PYSONDecoder(noeval=True).decode(trigger.condition)\n            except Exception:\n                raise ConditionError(\n                    gettext('ir.msg_trigger_invalid_condition',\n                        condition=trigger.condition,\n                        trigger=trigger.rec_name))\n\n    @staticmethod\n    def default_limit_number():\n        return 0\n\n    @fields.depends('on_time')\n    def on_change_on_time(self):\n        if self.on_time:\n            self.on_create = False\n            self.on_write = False\n            self.on_delete = False\n\n    @fields.depends('on_create')\n    def on_change_on_create(self):\n        if self.on_create:\n            self.on_time = False\n\n    @fields.depends('on_write')\n    def on_change_on_write(self):\n        if self.on_write:\n            self.on_time = False\n\n    @fields.depends('on_delete')\n    def on_change_on_delete(self):\n        if self.on_delete:\n            self.on_time = False\n\n    @classmethod\n    def get_triggers(cls, model_name, mode):\n        \"\"\"\n        Return triggers for a model and a mode\n        \"\"\"\n        assert mode in ['create', 'write', 'delete', 'time'], \\\n            'Invalid trigger mode'\n\n        if Transaction().context.get('_no_trigger'):\n            return []\n\n        key = (model_name, mode)\n        trigger_ids = cls._get_triggers_cache.get(key)\n        if trigger_ids is not None:\n            return cls.browse(trigger_ids)\n\n        triggers = cls.search([\n                ('model.model', '=', model_name),\n                ('on_%s' % mode, '=', True),\n                ])\n        cls._get_triggers_cache.set(key, list(map(int, triggers)))\n        return triggers\n\n    def eval(self, record):\n        \"\"\"\n        Evaluate the condition of trigger\n        \"\"\"\n        env = {}\n        env['current_date'] = datetime.datetime.today()\n        env['time'] = time\n        env['context'] = Transaction().context\n        env['self'] = EvalEnvironment(record, record.__class__)\n        return bool(PYSONDecoder(env).decode(self.condition))\n\n    def queue_trigger_action(self, records):\n        trigger_records = Transaction().trigger_records[self.id]\n        ids = {r.id for r in records if self.eval(r)} - trigger_records\n        if ids:\n            self.__class__.__queue__.trigger_action(self, list(ids))\n            trigger_records.update(ids)\n\n    def trigger_action(self, ids):\n        \"\"\"\n        Trigger the action define on trigger for the records\n        \"\"\"\n        pool = Pool()\n        TriggerLog = pool.get('ir.trigger.log')\n        Model = pool.get(self.model.model)\n        model, method = self.action.split('|')\n        ActionModel = pool.get(model)\n        cursor = Transaction().connection.cursor()\n        trigger_log = TriggerLog.__table__()\n\n        ids = [r.id for r in Model.browse(ids) if self.eval(r)]\n\n        # Filter on limit_number\n        if self.limit_number:\n            new_ids = []\n            for sub_ids in grouped_slice(ids):\n                sub_ids = list(sub_ids)\n                red_sql = reduce_ids(trigger_log.record_id, sub_ids)\n                cursor.execute(*trigger_log.select(\n                        trigger_log.record_id, Count(Literal(1)),\n                        where=red_sql & (trigger_log.trigger == self.id),\n                        group_by=trigger_log.record_id))\n                number = dict(cursor)\n                for record_id in sub_ids:\n                    if record_id not in number:\n                        new_ids.append(record_id)\n                        continue\n                    if number[record_id] < self.limit_number:\n                        new_ids.append(record_id)\n            ids = new_ids\n\n        # Filter on minimum_time_delay\n        if self.minimum_time_delay:\n            new_ids = []\n            # Use now from the transaction to compare with create_date\n            timestamp_cast = self.__class__.create_date.sql_cast\n            cursor.execute(*Select([timestamp_cast(CurrentTimestamp())]))\n            now, = cursor.fetchone()\n            if isinstance(now, str):\n                now = datetime.datetime.fromisoformat(now)\n            for sub_ids in grouped_slice(ids):\n                sub_ids = list(sub_ids)\n                red_sql = reduce_ids(trigger_log.record_id, sub_ids)\n                cursor.execute(*trigger_log.select(\n                        trigger_log.record_id, Max(trigger_log.create_date),\n                        where=(red_sql & (trigger_log.trigger == self.id)),\n                        group_by=trigger_log.record_id))\n                delay = dict(cursor)\n                for record_id in sub_ids:\n                    if record_id not in delay:\n                        new_ids.append(record_id)\n                        continue\n                    # SQLite return string for MAX\n                    if isinstance(delay[record_id], str):\n                        delay[record_id] = datetime.datetime.fromisoformat(\n                            delay[record_id])\n                    if now - delay[record_id] >= self.minimum_time_delay:\n                        new_ids.append(record_id)\n            ids = new_ids\n\n        records = Model.browse(ids)\n        if records:\n            getattr(ActionModel, method)(records, self)\n        if self.limit_number or self.minimum_time_delay:\n            to_create = []\n            for record in records:\n                to_create.append({\n                        'trigger': self.id,\n                        'record_id': record.id,\n                        })\n            if to_create:\n                TriggerLog.create(to_create)\n\n    @classmethod\n    def trigger_time(cls):\n        '''\n        Trigger time actions\n        '''\n        pool = Pool()\n        triggers = cls.search([\n                ('on_time', '=', True),\n                ])\n        for trigger in triggers:\n            Model = pool.get(trigger.model.model)\n            # TODO add a domain\n            records = Model.search([])\n            trigger.trigger_action(records)\n\n    @classmethod\n    def create(cls, vlist):\n        res = super(Trigger, cls).create(vlist)\n        # Restart the cache on the get_triggers method of ir.trigger\n        cls._get_triggers_cache.clear()\n        return res\n\n    @classmethod\n    def write(cls, triggers, values, *args):\n        super(Trigger, cls).write(triggers, values, *args)\n        # Restart the cache on the get_triggers method of ir.trigger\n        cls._get_triggers_cache.clear()\n\n    @classmethod\n    def delete(cls, records):\n        super(Trigger, cls).delete(records)\n        # Restart the cache on the get_triggers method of ir.trigger\n        cls._get_triggers_cache.clear()\n\n\nclass TriggerLog(ModelSQL):\n    'Trigger Log'\n    __name__ = 'ir.trigger.log'\n    trigger = fields.Many2One(\n        'ir.trigger', 'Trigger', required=True, ondelete='CASCADE')\n    record_id = fields.Integer('Record ID', required=True)\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n\n        table = cls.__table__()\n        cls._sql_indexes.add(\n            Index(\n                table,\n                (table.trigger, Index.Equality()),\n                (table.record_id, Index.Range())))\n"
  },
  {
    "path": "trytond/ir/trigger.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <record model=\"ir.ui.view\" id=\"trigger_view_form\">\n            <field name=\"model\">ir.trigger</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">trigger_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"trigger_view_tree\">\n            <field name=\"model\">ir.trigger</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">trigger_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_trigger_form\">\n            <field name=\"name\">Triggers</field>\n            <field name=\"res_model\">ir.trigger</field>\n        </record>\n        <record model=\"ir.action.act_window.view\" id=\"act_trigger_form_view1\">\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"view\" ref=\"trigger_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_trigger_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\" id=\"act_trigger_form_view2\">\n            <field name=\"sequence\" eval=\"20\"/>\n            <field name=\"view\" ref=\"trigger_view_form\"/>\n            <field name=\"act_window\" ref=\"act_trigger_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_models\"\n            action=\"act_trigger_form\"\n            sequence=\"50\"\n            id=\"menu_trigger_form\"/>\n\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/tryton.cfg",
    "content": "[tryton]\nxml:\n    ir.xml\n    ui/ui.xml\n    ui/icon.xml\n    ui/menu.xml\n    ui/view.xml\n    action.xml\n    model.xml\n    sequence.xml\n    attachment.xml\n    note.xml\n    cron.xml\n    lang.xml\n    translation.xml\n    export.xml\n    rule.xml\n    module.xml\n    trigger.xml\n    calendar_.xml\n    message.xml\n    queue.xml\n    email.xml\n    error.xml\n"
  },
  {
    "path": "trytond/ir/ui/__init__.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom . import icon, menu, view\n\n__all__ = ['menu', 'view', 'icon']\n"
  },
  {
    "path": "trytond/ir/ui/board.rnc",
    "content": "namespace a = \"http://relaxng.org/ns/compatibility/annotations/1.0\"\n\nboard =\n  element board {\n    attlist.board,\n    (image\n     | separator\n     | label\n     | newline\n     | link\n     | notebook\n     | group\n     | hpaned\n     | vpaned\n     | action)*\n  }\nattlist.board &= [ a:defaultValue = \"4\" ] attribute col { text }?\nimage = element image { attlist.image, empty }\nattlist.image &= attribute name { text }\nattlist.image &= [ a:defaultValue = \"1\" ] attribute colspan { text }?\nattlist.image &=\n  [ a:defaultValue = \"0\" ] attribute yexpand { \"0\" | \"1\" }?\nattlist.image &= [ a:defaultValue = \"0\" ] attribute yfill { \"0\" | \"1\" }?\nattlist.image &=\n  [ a:defaultValue = \"0\" ] attribute xexpand { \"0\" | \"1\" }?\nattlist.image &= [ a:defaultValue = \"0\" ] attribute xfill { \"0\" | \"1\" }?\nattlist.image &= attribute help { text }?\nattlist.image &= attribute states { text }?\nseparator = element separator { attlist.separator, empty }\nattlist.separator &= [ a:defaultValue = \"\" ] attribute string { text }?\nattlist.separator &= ( attribute name { text } | attribute name { text } )\nattlist.separator &= attribute states { text }?\nattlist.separator &=\n  [ a:defaultValue = \"0.0\" ] attribute xalign { text }?\nattlist.separator &=\n  [ a:defaultValue = \"1\" ] attribute colspan { text }?\nattlist.separator &=\n  [ a:defaultValue = \"0\" ] attribute yexpand { \"0\" | \"1\" }?\nattlist.separator &=\n  [ a:defaultValue = \"0\" ] attribute yfill { \"0\" | \"1\" }?\nattlist.separator &=\n  [ a:defaultValue = \"0\" ] attribute xexpand { \"0\" | \"1\" }?\nattlist.separator &=\n  [ a:defaultValue = \"0\" ] attribute xfill { \"0\" | \"1\" }?\nattlist.separator &= attribute help { text }?\nlabel = element label { attlist.label, empty }\nattlist.label &= [ a:defaultValue = \"\" ] attribute string { text }?\nattlist.label &= ( attribute name { text } | attribute name { text } )\nattlist.label &= attribute states { text }?\nattlist.label &= [ a:defaultValue = \"0.0\" ] attribute xalign { text }?\nattlist.label &= [ a:defaultValue = \"0.5\" ] attribute yalign { text }?\nattlist.label &=\n  [ a:defaultValue = \"0\" ] attribute yexpand { \"0\" | \"1\" }?\nattlist.label &= [ a:defaultValue = \"0\" ] attribute yfill { \"0\" | \"1\" }?\nattlist.label &=\n  [ a:defaultValue = \"0\" ] attribute xexpand { \"0\" | \"1\" }?\nattlist.label &= [ a:defaultValue = \"1\" ] attribute xfill { \"0\" | \"1\" }?\nattlist.label &= [ a:defaultValue = \"1\" ] attribute colspan { text }?\nattlist.label &= attribute help { text }?\nnewline = element newline { attlist.newline, empty }\nattlist.newline &= attribute id { text }\nlink = element link { attlist.link, empty }\nattlist.link &= attribute name { text }\nattlist.link &= attribute id { text }?\nattlist.link &= [ a:defaultValue = \"1\" ] attribute colspan { text }?\nattlist.link &= attribute states { text }?\nattlist.link &= attribute icon { text }?\nattlist.link &= [ a:defaultValue = \"show\" ] attribute empty { \"show\" | \"hide\" }?\nnotebook = element notebook { attlist.notebook, page* }\nattlist.notebook &= [ a:defaultValue = \"4\" ] attribute colspan { text }?\npage =\n  element page {\n    attlist.page,\n    (image\n     | separator\n     | label\n     | newline\n     | link\n     | notebook\n     | group\n     | hpaned\n     | vpaned\n     | action)*\n  }\nattlist.page &= attribute angle { text }?\nattlist.page &=\n  [ a:defaultValue = \"Unknown\" ] attribute string { text }?\nattlist.page &= [ a:defaultValue = \"4\" ] attribute col { text }?\nattlist.page &= ( attribute name { text } | attribute id { text } )\ngroup =\n  element group {\n    attlist.group,\n    (image\n     | separator\n     | label\n     | newline\n     | link\n     | notebook\n     | group\n     | hpaned\n     | vpaned\n     | action)*\n  }\nattlist.group &= attribute string { text }?\nattlist.group &= [ a:defaultValue = \"1\" ] attribute colspan { text }?\nattlist.group &=\n  [ a:defaultValue = \"0\" ] attribute yexpand { \"0\" | \"1\" }?\nattlist.group &= [ a:defaultValue = \"1\" ] attribute yfill { \"0\" | \"1\" }?\nattlist.group &= [ a:defaultValue = \"0.5\" ] attribute yalign { text }?\nattlist.group &=\n  [ a:defaultValue = \"0\" ] attribute xexpand { \"0\" | \"1\" }?\nattlist.group &= [ a:defaultValue = \"1\" ] attribute xfill { \"0\" | \"1\" }?\nattlist.group &= [ a:defaultValue = \"0.5\" ] attribute xalign { text }?\nattlist.group &= [ a:defaultValue = \"1\" ] attribute rowspan { text }?\nattlist.group &= [ a:defaultValue = \"4\" ] attribute col { text }?\nattlist.group &= attribute id { text }\n\nhpaned = element hpaned { attlist.paned, child* }\n\nvpaned = element vpaned { attlist.paned, child* }\n\nattlist.paned &= [ a:defaultValue = \"4\" ] attribute colspan { text }?\nattlist.paned &= attribute position { text }?\nattlist.paned &= attribute id { text }\n\nchild =\n  element child {\n    attlist.child,\n    (image\n     | separator\n     | label\n     | newline\n     | link\n     | notebook\n     | group\n     | hpaned\n     | vpaned\n     | action)*\n  }\n\nattlist.child &= attribute id { text }\n\ndata = element data { attlist.data, xpath+ }\nattlist.data &= empty\n\nxpath = element xpath { attlist.xpath,\n    (image\n    | separator\n    | label\n    | newline\n    | link\n    | notebook\n    | group\n    | hpaned\n    | vpaned\n    | action\n    | page\n    | child\n    | board\n    )*\n  }\nattlist.xpath &= attribute expr { text }\nattlist.xpath &=\n  [ a:defaultValue = \"inside\" ]\n  attribute position { \"inside\" | \"replace\" | \"replace_attributes\" | \"after\" | \"before\" }?\naction = element action { attlist.action, empty }\nattlist.action &= attribute name { text }\nattlist.action &= [ a:defaultValue = \"1\" ] attribute colspan { text }?\nlabel |= notAllowed\nstart = data | board | label\n"
  },
  {
    "path": "trytond/ir/ui/board.rng",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<grammar xmlns=\"http://relaxng.org/ns/structure/1.0\"\n         xmlns:a=\"http://relaxng.org/ns/compatibility/annotations/1.0\">\n  <define name=\"board\">\n    <element>\n      <name ns=\"\">board</name>\n      <ref name=\"attlist.board\"/>\n      <zeroOrMore>\n        <choice>\n          <ref name=\"image\"/>\n          <ref name=\"separator\"/>\n          <ref name=\"label\"/>\n          <ref name=\"newline\"/>\n          <ref name=\"link\"/>\n          <ref name=\"notebook\"/>\n          <ref name=\"group\"/>\n          <ref name=\"hpaned\"/>\n          <ref name=\"vpaned\"/>\n          <ref name=\"action\"/>\n        </choice>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.board\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"4\">\n        <name ns=\"\">col</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"image\">\n    <element>\n      <name ns=\"\">image</name>\n      <ref name=\"attlist.image\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">name</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">colspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">yexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">yfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">xexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">xfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">help</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">states</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"separator\">\n    <element>\n      <name ns=\"\">separator</name>\n      <ref name=\"attlist.separator\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"\">\n        <name ns=\"\">string</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <choice>\n      <attribute>\n        <name ns=\"\">name</name>\n        <text/>\n      </attribute>\n      <attribute>\n        <name ns=\"\">name</name>\n        <text/>\n      </attribute>\n    </choice>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">states</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0.0\">\n        <name ns=\"\">xalign</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">colspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">yexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">yfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">xexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">xfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">help</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"label\">\n    <element>\n      <name ns=\"\">label</name>\n      <ref name=\"attlist.label\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"\">\n        <name ns=\"\">string</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <choice>\n      <attribute>\n        <name ns=\"\">name</name>\n        <text/>\n      </attribute>\n      <attribute>\n        <name ns=\"\">name</name>\n        <text/>\n      </attribute>\n    </choice>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">states</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0.0\">\n        <name ns=\"\">xalign</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0.5\">\n        <name ns=\"\">yalign</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">yexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">yfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">xexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">xfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">colspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">help</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"newline\">\n    <element>\n      <name ns=\"\">newline</name>\n      <ref name=\"attlist.newline\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.newline\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">id</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"link\">\n    <element>\n      <name ns=\"\">link</name>\n      <ref name=\"attlist.link\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.link\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">name</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.link\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">id</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.link\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">colspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.link\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">states</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.link\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">icon</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.link\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"show\">\n        <name ns=\"\">empty</name>\n        <choice>\n          <value>show</value>\n          <value>hide</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"notebook\">\n    <element>\n      <name ns=\"\">notebook</name>\n      <ref name=\"attlist.notebook\"/>\n      <zeroOrMore>\n        <ref name=\"page\"/>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.notebook\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"4\">\n        <name ns=\"\">colspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"page\">\n    <element>\n      <name ns=\"\">page</name>\n      <ref name=\"attlist.page\"/>\n      <zeroOrMore>\n        <choice>\n          <ref name=\"image\"/>\n          <ref name=\"separator\"/>\n          <ref name=\"label\"/>\n          <ref name=\"newline\"/>\n          <ref name=\"link\"/>\n          <ref name=\"notebook\"/>\n          <ref name=\"group\"/>\n          <ref name=\"hpaned\"/>\n          <ref name=\"vpaned\"/>\n          <ref name=\"action\"/>\n        </choice>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.page\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">angle</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.page\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"Unknown\">\n        <name ns=\"\">string</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.page\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"4\">\n        <name ns=\"\">col</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.page\" combine=\"interleave\">\n    <choice>\n      <attribute>\n        <name ns=\"\">name</name>\n        <text/>\n      </attribute>\n      <attribute>\n        <name ns=\"\">id</name>\n        <text/>\n      </attribute>\n    </choice>\n  </define>\n  <define name=\"group\">\n    <element>\n      <name ns=\"\">group</name>\n      <ref name=\"attlist.group\"/>\n      <zeroOrMore>\n        <choice>\n          <ref name=\"image\"/>\n          <ref name=\"separator\"/>\n          <ref name=\"label\"/>\n          <ref name=\"newline\"/>\n          <ref name=\"link\"/>\n          <ref name=\"notebook\"/>\n          <ref name=\"group\"/>\n          <ref name=\"hpaned\"/>\n          <ref name=\"vpaned\"/>\n          <ref name=\"action\"/>\n        </choice>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">string</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">colspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">yexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">yfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0.5\">\n        <name ns=\"\">yalign</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">xexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">xfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0.5\">\n        <name ns=\"\">xalign</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">rowspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"4\">\n        <name ns=\"\">col</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">id</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"hpaned\">\n    <element>\n      <name ns=\"\">hpaned</name>\n      <ref name=\"attlist.paned\"/>\n      <zeroOrMore>\n        <ref name=\"child\"/>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"vpaned\">\n    <element>\n      <name ns=\"\">vpaned</name>\n      <ref name=\"attlist.paned\"/>\n      <zeroOrMore>\n        <ref name=\"child\"/>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.paned\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"4\">\n        <name ns=\"\">colspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.paned\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">position</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.paned\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">id</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"child\">\n    <element>\n      <name ns=\"\">child</name>\n      <ref name=\"attlist.child\"/>\n      <zeroOrMore>\n        <choice>\n          <ref name=\"image\"/>\n          <ref name=\"separator\"/>\n          <ref name=\"label\"/>\n          <ref name=\"newline\"/>\n          <ref name=\"link\"/>\n          <ref name=\"notebook\"/>\n          <ref name=\"group\"/>\n          <ref name=\"hpaned\"/>\n          <ref name=\"vpaned\"/>\n          <ref name=\"action\"/>\n        </choice>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.child\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">id</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"data\">\n    <element>\n      <name ns=\"\">data</name>\n      <ref name=\"attlist.data\"/>\n      <oneOrMore>\n        <ref name=\"xpath\"/>\n      </oneOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.data\" combine=\"interleave\">\n    <empty/>\n  </define>\n  <define name=\"xpath\">\n    <element>\n      <name ns=\"\">xpath</name>\n      <ref name=\"attlist.xpath\"/>\n      <zeroOrMore>\n        <choice>\n          <ref name=\"image\"/>\n          <ref name=\"separator\"/>\n          <ref name=\"label\"/>\n          <ref name=\"newline\"/>\n          <ref name=\"link\"/>\n          <ref name=\"notebook\"/>\n          <ref name=\"group\"/>\n          <ref name=\"hpaned\"/>\n          <ref name=\"vpaned\"/>\n          <ref name=\"action\"/>\n          <ref name=\"page\"/>\n          <ref name=\"child\"/>\n          <ref name=\"board\"/>\n        </choice>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.xpath\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">expr</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.xpath\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"inside\">\n        <name ns=\"\">position</name>\n        <choice>\n          <value>inside</value>\n          <value>replace</value>\n          <value>replace_attributes</value>\n          <value>after</value>\n          <value>before</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"action\">\n    <element>\n      <name ns=\"\">action</name>\n      <ref name=\"attlist.action\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.action\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">name</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.action\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">colspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"label\" combine=\"choice\">\n    <notAllowed/>\n  </define>\n  <start>\n    <choice>\n      <ref name=\"data\"/>\n      <ref name=\"board\"/>\n      <ref name=\"label\"/>\n    </choice>\n  </start>\n</grammar>\n"
  },
  {
    "path": "trytond/ir/ui/calendar.rnc",
    "content": "namespace a = \"http://relaxng.org/ns/compatibility/annotations/1.0\"\n\ncalendar = element calendar { attlist.calendar, field* }\nattlist.calendar &=\n  attribute dtstart { text }\nattlist.calendar &=\n  attribute dtend { text }?\nattlist.calendar &=\n  attribute mode { \"day\"\n      | \"week\"\n      | \"month\" }?\nattlist.calendar &= [a:defaultValue = \"1\" ] attribute editable { \"0\" | \"1\" }?\nattlist.calendar &= attribute color { text }?\nattlist.calendar &= attribute background_color { text }?\nattlist.calendar &=\n  attribute width { text }?\nattlist.calendar &=\n  attribute height { text }?\nfield = element field { attlist.field, empty }\nattlist.field &= attribute name { text }\ndata = element data { attlist.data, xpath* }\nattlist.data &= empty\n\nxpath = element xpath {\n    attlist.xpath, (field | calendar)*\n  }\nattlist.xpath &= attribute expr { text }\nattlist.xpath &=\n  [ a:defaultValue = \"inside\" ]\n  attribute position { \"inside\"\n      | \"replace\"\n      | \"replace_attributes\"\n      | \"after\"\n      | \"before\" }?\n\nstart = data | calendar\n"
  },
  {
    "path": "trytond/ir/ui/calendar.rng",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<grammar xmlns=\"http://relaxng.org/ns/structure/1.0\"\n         xmlns:a=\"http://relaxng.org/ns/compatibility/annotations/1.0\">\n  <define name=\"calendar\">\n    <element>\n      <name ns=\"\">calendar</name>\n      <ref name=\"attlist.calendar\"/>\n      <zeroOrMore>\n        <ref name=\"field\"/>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.calendar\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">dtstart</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.calendar\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">dtend</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.calendar\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">mode</name>\n        <choice>\n          <value>day</value>\n          <value>week</value>\n          <value>month</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.calendar\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">editable</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.calendar\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">color</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.calendar\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">background_color</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.calendar\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">width</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.calendar\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">height</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"field\">\n    <element>\n      <name ns=\"\">field</name>\n      <ref name=\"attlist.field\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">name</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"data\">\n    <element>\n      <name ns=\"\">data</name>\n      <ref name=\"attlist.data\"/>\n      <zeroOrMore>\n        <ref name=\"xpath\"/>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.data\" combine=\"interleave\">\n    <empty/>\n  </define>\n  <define name=\"xpath\">\n    <element>\n      <name ns=\"\">xpath</name>\n      <ref name=\"attlist.xpath\"/>\n      <zeroOrMore>\n        <choice>\n          <ref name=\"field\"/>\n          <ref name=\"calendar\"/>\n        </choice>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.xpath\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">expr</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.xpath\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"inside\">\n        <name ns=\"\">position</name>\n        <choice>\n          <value>inside</value>\n          <value>replace</value>\n          <value>replace_attributes</value>\n          <value>after</value>\n          <value>before</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <start>\n    <choice>\n      <ref name=\"data\"/>\n      <ref name=\"calendar\"/>\n    </choice>\n  </start>\n</grammar>\n"
  },
  {
    "path": "trytond/ir/ui/form.rnc",
    "content": "namespace a = \"http://relaxng.org/ns/compatibility/annotations/1.0\"\n\nform =\n  element form {\n    attlist.form,\n    (label\n     | field\n     | image\n     | separator\n     | newline\n     | button\n     | link\n     | notebook\n     | group\n     | hpaned\n     | vpaned)*\n  }\nattlist.form &= attribute on_write { text }?\nattlist.form &=\n  [ a:defaultValue = \"1\" ] attribute creatable { \"0\" | \"1\" }?\nattlist.form &= [ a:defaultValue = \"4\" ] attribute col { text }?\nattlist.form &= attribute cursor { text }?\n\nlabel = element label { attlist.label, empty }\nattlist.label &= [ a:defaultValue = \"\" ] attribute string { text }?\nattlist.label &= ( attribute name { text } | attribute id { text } )\nattlist.label &= attribute states { text }?\nattlist.label &= [ a:defaultValue = \"0.0\" ] attribute xalign { text }?\nattlist.label &= [ a:defaultValue = \"0.5\" ] attribute yalign { text }?\nattlist.label &=\n  [ a:defaultValue = \"0\" ] attribute yexpand { \"0\" | \"1\" }?\nattlist.label &= [ a:defaultValue = \"0\" ] attribute yfill { \"0\" | \"1\" }?\nattlist.label &=\n  [ a:defaultValue = \"0\" ] attribute xexpand { \"0\" | \"1\" }?\nattlist.label &= [ a:defaultValue = \"1\" ] attribute xfill { \"0\" | \"1\" }?\nattlist.label &= [ a:defaultValue = \"1\" ] attribute colspan { text }?\nattlist.label &= attribute help { text }?\n\nfield = element field { attlist.field, empty }\nattlist.field &= attribute name { text }\nattlist.field &= [ a:defaultValue = \"1\" ] attribute colspan { text }?\nattlist.field &=\n  attribute widget {\n    \"binary\"\n    | \"boolean\"\n    | \"callto\"\n    | \"char\"\n    | \"date\"\n    | \"datetime\"\n    | \"dict\"\n    | \"document\"\n    | \"email\"\n    | \"float\"\n    | \"html\"\n    | \"image\"\n    | \"integer\"\n    | \"many2many\"\n    | \"many2one\"\n    | \"multiselection\"\n    | \"numeric\"\n    | \"one2many\"\n    | \"one2one\"\n    | \"password\"\n    | \"progressbar\"\n    | \"pyson\"\n    | \"reference\"\n    | \"richtext\"\n    | \"selection\"\n    | \"sip\"\n    | \"text\"\n    | \"time\"\n    | \"timedelta\"\n    | \"url\"\n  }?\nattlist.field &= attribute fill { \"0\" | \"1\" }?\nattlist.field &= attribute yexpand { \"0\" | \"1\" }?\nattlist.field &= attribute yfill { \"0\" | \"1\" }?\nattlist.field &= attribute empty { \"0\" | \"1\" }?\nattlist.field &=\n  [ a:defaultValue = \"1\" ] attribute xexpand { \"0\" | \"1\" }?\nattlist.field &= [ a:defaultValue = \"1\" ] attribute xfill { \"0\" | \"1\" }?\nattlist.field &= [ a:defaultValue = \"0.0\" ] attribute xalign { text }?\nattlist.field &= [ a:defaultValue = \"0.5\" ] attribute yalign { text }?\nattlist.field &= attribute help { text }?\nattlist.field &= attribute width { text }?\nattlist.field &= attribute height { text }?\nattlist.field &= attribute readonly { \"0\" | \"1\" }?\nattlist.field &=\n  [ a:defaultValue = \"0\" ] attribute tree_invisible { \"0\" | \"1\" }?\nattlist.field &= attribute mode { text }?\nattlist.field &= attribute view_ids { text }?\nattlist.field &= attribute product { text }?\nattlist.field &=\n  [ a:defaultValue = \"0\" ] attribute invisible { \"0\" | \"1\" }?\nattlist.field &=\n  [ a:defaultValue = \"1\" ] attribute create { \"0\" | \"1\" }?\nattlist.field &=\n  [ a:defaultValue = \"1\" ] attribute delete { \"0\" | \"1\" }?\nattlist.field &=\n  [ a:defaultValue = \"left_to_right\" ] attribute orientation {\n    \"left_to_right\"\n    | \"right_to_left\"\n    | \"bottom_to_top\"\n    | \"top_to_bottom\"\n  }?\nattlist.field &= attribute spell { text }?\nattlist.field &=\n  [a:defaultValue = \"0\"] attribute filename_visible { \"0\" | \"1\" }?\nattlist.field &= [a:defaultValue = \"0\"] attribute pre_validate { \"0\" | \"1\" }?\nattlist.field &= attribute icon { text }?\nattlist.field &= [a:defaultValue = \"1\"] attribute completion { \"0\" | \"1\" }?\nattlist.field &= attribute string { text }?\nattlist.field &= [a:defaultValue = \"1\"] attribute factor { text }?\nattlist.field &= attribute filename { text }?\nattlist.field &= attribute help_field { text }?\nattlist.field &=\n  [a:defaultValue = \"0\"] attribute toolbar { \"0\" | \"1\" }?\nattlist.field &= attribute symbol { text }?\nattlist.field &= [a:defaultValue = \"1\"] attribute grouping { \"0\" | \"1\" }?\nimage = element image { attlist.image, empty }\nattlist.image &= attribute name { text }\nattlist.image &= [a:defaultValue = \"icon\"] attribute type { \"icon\" | \"url\" }?\nattlist.affix &= attribute url_size { text }?\nattlist.image &= [ a:defaultValue = \"1\" ] attribute colspan { text }?\nattlist.image &=\n  [ a:defaultValue = \"0\" ] attribute yexpand { \"0\" | \"1\" }?\nattlist.image &= [ a:defaultValue = \"0\" ] attribute yfill { \"0\" | \"1\" }?\nattlist.image &=\n  [ a:defaultValue = \"1\" ] attribute xexpand { \"0\" | \"1\" }?\nattlist.image &=\n  [ a:defaultValue = \"48\" ] attribute size {text }?\nattlist.image &= [ a:defaultValue = \"0\" ] attribute xfill { \"0\" | \"1\" }?\nattlist.image &= attribute help { text }?\nattlist.image &= attribute states { text }?\nseparator = element separator { attlist.separator, empty }\nattlist.separator &= [ a:defaultValue = \"\" ] attribute string { text }?\nattlist.separator &= ( attribute name { text } | attribute id { text} )\nattlist.separator &= attribute states { text }?\nattlist.separator &=\n  [ a:defaultValue = \"0.0\" ] attribute xalign { text }?\nattlist.separator &=\n  [ a:defaultValue = \"1\" ] attribute colspan { text }?\nattlist.separator &=\n  [ a:defaultValue = \"0\" ] attribute yexpand { \"0\" | \"1\" }?\nattlist.separator &=\n  [ a:defaultValue = \"0\" ] attribute yfill { \"0\" | \"1\" }?\nattlist.separator &=\n  [ a:defaultValue = \"1\" ] attribute xexpand { \"0\" | \"1\" }?\nattlist.separator &=\n  [ a:defaultValue = \"0\" ] attribute xfill { \"0\" | \"1\" }?\nattlist.separator &= attribute help { text }?\nnewline = element newline { attlist.newline, empty }\nattlist.newline &= empty\nbutton = element button { attlist.button, empty }\nattlist.button &= [ a:defaultValue = \"1\" ] attribute colspan { text }?\nattlist.button &= attribute help { text }?\nattlist.button &= attribute string { text }?\nattlist.button &= attribute icon { text }?\nattlist.button &= attribute confirm { text }?\nattlist.button &= attribute name { text }\nattlist.button &= attribute states { text }?\nattlist.button &=\n    [ a:defaultValue=\"action\" ]\n    attribute keyword { \"relate\" | \"print\" | \"action\" }?\nattlist.button &= [ a:defaultValue = \"0\" ] attribute rule { \"0\" | \"1\" }?\nattlist.button &= attribute change { text }?\nattlist.button &= attribute type { \"class\" | \"instance\" }?\nlink = element link { attlist.link, empty }\nattlist.link &= attribute name { text }\nattlist.link &= attribute id { text }?\nattlist.link &= [ a:defaultValue = \"1\" ] attribute colspan { text }?\nattlist.link &= attribute states { text }?\nattlist.link &= attribute icon { text }?\nattlist.link &= [ a:defaultValue = \"show\" ] attribute empty { \"show\" | \"hide\" }?\nnotebook = element notebook { attlist.notebook, page* }\nattlist.notebook &= [ a:defaultValue = \"4\" ] attribute colspan { text }?\nattlist.notebook &= [ a:defaultValue = \"1\" ] attribute yexpand { \"0\" | \"1\" }?\nattlist.notebook &= [ a:defaultValue = \"1\" ] attribute yfill { \"0\" | \"1\" }?\nattlist.notebook &= attribute states { text }?\nattlist.notebook &= attribute width { text }?\nattlist.notebook &= attribute height { text }?\npage =\n  element page {\n    attlist.page,\n    (label\n     | field\n     | image\n     | separator\n     | newline\n     | button\n     | link\n     | notebook\n     | group\n     | hpaned\n     | vpaned)*\n  }\nattlist.page &= attribute angle { text }?\nattlist.page &= attribute icon { text }?\nattlist.page &=\n  [ a:defaultValue = \"Unknown\" ] attribute string { text }?\nattlist.page &= [ a:defaultValue = \"4\" ] attribute col { text }?\nattlist.page &= ( attribute name { text } | attribute id { text } )\nattlist.page &= attribute states { text }?\ngroup =\n  element group {\n    attlist.group,\n    (label\n     | field\n     | image\n     | separator\n     | newline\n     | button\n     | link\n     | notebook\n     | group\n     | hpaned\n     | vpaned)*\n  }\nattlist.group &= attribute string { text }?\nattlist.group &= [ a:defaultValue = \"1\" ] attribute colspan { text }?\nattlist.group &=\n  [ a:defaultValue = \"0\" ] attribute yexpand { \"0\" | \"1\" }?\nattlist.group &= [ a:defaultValue = \"1\" ] attribute yfill { \"0\" | \"1\" }?\nattlist.group &= [ a:defaultValue = \"0.5\" ] attribute yalign { text }?\nattlist.group &=\n  [ a:defaultValue = \"0\" ] attribute xexpand { \"0\" | \"1\" }?\nattlist.group &= [ a:defaultValue = \"1\" ] attribute xfill { \"0\" | \"1\" }?\nattlist.group &= [ a:defaultValue = \"0.5\" ] attribute xalign { text }?\nattlist.group &= [ a:defaultValue = \"1\" ] attribute rowspan { text }?\nattlist.group &= [ a:defaultValue = \"4\" ] attribute col { text }?\nattlist.group &= ( attribute name { text } | attribute id { text } )\nattlist.group &= attribute states { text }?\nattlist.group &= [ a:defaultValue = \"0\" ] attribute homogeneous { \"0\" | \"1\" }?\nattlist.group &= attribute expandable { \"0\" | \"1\" }?\n\nhpaned = element hpaned { attlist.paned, child* }\n\nvpaned = element vpaned { attlist.paned, child* }\n\nattlist.paned &= [ a:defaultValue = \"4\" ] attribute colspan { text }?\nattlist.paned &= attribute position { text }?\nattlist.paned &= attribute id { text }\n\nchild =\n  element child {\n    attlist.child,\n    (label\n     | field\n     | image\n     | separator\n     | newline\n     | button\n     | link\n     | notebook\n     | group\n     | hpaned\n     | vpaned)*\n  }\n\nattlist.child &= attribute id { text }\n\ndata = element data { attlist.data, xpath* }\nattlist.data &= empty\n\nxpath = element xpath { attlist.xpath,\n    (label\n    | field\n    | image\n    | separator\n    | newline\n    | button\n    | link\n    | notebook\n    | group\n    | hpaned\n    | vpaned\n    | form\n    | page\n    | child)*\n  }\nattlist.xpath &= attribute expr { text }\nattlist.xpath &=\n  [ a:defaultValue = \"inside\" ]\n  attribute position { \"inside\" | \"replace\" | \"replace_attributes\" | \"after\" | \"before\" }?\n\nstart = data | form\n"
  },
  {
    "path": "trytond/ir/ui/form.rng",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<grammar xmlns=\"http://relaxng.org/ns/structure/1.0\"\n         xmlns:a=\"http://relaxng.org/ns/compatibility/annotations/1.0\">\n  <define name=\"form\">\n    <element>\n      <name ns=\"\">form</name>\n      <ref name=\"attlist.form\"/>\n      <zeroOrMore>\n        <choice>\n          <ref name=\"label\"/>\n          <ref name=\"field\"/>\n          <ref name=\"image\"/>\n          <ref name=\"separator\"/>\n          <ref name=\"newline\"/>\n          <ref name=\"button\"/>\n          <ref name=\"link\"/>\n          <ref name=\"notebook\"/>\n          <ref name=\"group\"/>\n          <ref name=\"hpaned\"/>\n          <ref name=\"vpaned\"/>\n        </choice>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.form\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">on_write</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.form\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">creatable</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.form\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"4\">\n        <name ns=\"\">col</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.form\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">cursor</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"label\">\n    <element>\n      <name ns=\"\">label</name>\n      <ref name=\"attlist.label\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"\">\n        <name ns=\"\">string</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <choice>\n      <attribute>\n        <name ns=\"\">name</name>\n        <text/>\n      </attribute>\n      <attribute>\n        <name ns=\"\">id</name>\n        <text/>\n      </attribute>\n    </choice>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">states</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0.0\">\n        <name ns=\"\">xalign</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0.5\">\n        <name ns=\"\">yalign</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">yexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">yfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">xexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">xfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">colspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.label\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">help</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"field\">\n    <element>\n      <name ns=\"\">field</name>\n      <ref name=\"attlist.field\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">name</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">colspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">widget</name>\n        <choice>\n          <value>binary</value>\n          <value>boolean</value>\n          <value>callto</value>\n          <value>char</value>\n          <value>date</value>\n          <value>datetime</value>\n          <value>dict</value>\n          <value>document</value>\n          <value>email</value>\n          <value>float</value>\n          <value>html</value>\n          <value>image</value>\n          <value>integer</value>\n          <value>many2many</value>\n          <value>many2one</value>\n          <value>multiselection</value>\n          <value>numeric</value>\n          <value>one2many</value>\n          <value>one2one</value>\n          <value>password</value>\n          <value>progressbar</value>\n          <value>pyson</value>\n          <value>reference</value>\n          <value>richtext</value>\n          <value>selection</value>\n          <value>sip</value>\n          <value>text</value>\n          <value>time</value>\n          <value>timedelta</value>\n          <value>url</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">fill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">yexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">yfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">empty</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">xexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">xfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0.0\">\n        <name ns=\"\">xalign</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0.5\">\n        <name ns=\"\">yalign</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">help</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">width</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">height</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">readonly</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">tree_invisible</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">mode</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">view_ids</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">product</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">invisible</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">create</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">delete</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"left_to_right\">\n        <name ns=\"\">orientation</name>\n        <choice>\n          <value>left_to_right</value>\n          <value>right_to_left</value>\n          <value>bottom_to_top</value>\n          <value>top_to_bottom</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">spell</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">filename_visible</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">pre_validate</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">icon</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">completion</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">string</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">factor</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">filename</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">help_field</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">toolbar</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">symbol</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">grouping</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"image\">\n    <element>\n      <name ns=\"\">image</name>\n      <ref name=\"attlist.image\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">name</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"icon\">\n        <name ns=\"\">type</name>\n        <choice>\n          <value>icon</value>\n          <value>url</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.affix\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">url_size</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">colspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">yexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">yfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">xexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"48\">\n        <name ns=\"\">size</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">xfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">help</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.image\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">states</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"separator\">\n    <element>\n      <name ns=\"\">separator</name>\n      <ref name=\"attlist.separator\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"\">\n        <name ns=\"\">string</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <choice>\n      <attribute>\n        <name ns=\"\">name</name>\n        <text/>\n      </attribute>\n      <attribute>\n        <name ns=\"\">id</name>\n        <text/>\n      </attribute>\n    </choice>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">states</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0.0\">\n        <name ns=\"\">xalign</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">colspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">yexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">yfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">xexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">xfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.separator\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">help</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"newline\">\n    <element>\n      <name ns=\"\">newline</name>\n      <ref name=\"attlist.newline\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.newline\" combine=\"interleave\">\n    <empty/>\n  </define>\n  <define name=\"button\">\n    <element>\n      <name ns=\"\">button</name>\n      <ref name=\"attlist.button\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">colspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">help</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">string</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">icon</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">confirm</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">name</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">states</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"action\">\n        <name ns=\"\">keyword</name>\n        <choice>\n          <value>relate</value>\n          <value>print</value>\n          <value>action</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">rule</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">change</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">type</name>\n        <choice>\n          <value>class</value>\n          <value>instance</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"link\">\n    <element>\n      <name ns=\"\">link</name>\n      <ref name=\"attlist.link\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.link\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">name</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.link\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">id</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.link\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">colspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.link\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">states</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.link\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">icon</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.link\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"show\">\n        <name ns=\"\">empty</name>\n        <choice>\n          <value>show</value>\n          <value>hide</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"notebook\">\n    <element>\n      <name ns=\"\">notebook</name>\n      <ref name=\"attlist.notebook\"/>\n      <zeroOrMore>\n        <ref name=\"page\"/>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.notebook\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"4\">\n        <name ns=\"\">colspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.notebook\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">yexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.notebook\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">yfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.notebook\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">states</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.notebook\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">width</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.notebook\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">height</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"page\">\n    <element>\n      <name ns=\"\">page</name>\n      <ref name=\"attlist.page\"/>\n      <zeroOrMore>\n        <choice>\n          <ref name=\"label\"/>\n          <ref name=\"field\"/>\n          <ref name=\"image\"/>\n          <ref name=\"separator\"/>\n          <ref name=\"newline\"/>\n          <ref name=\"button\"/>\n          <ref name=\"link\"/>\n          <ref name=\"notebook\"/>\n          <ref name=\"group\"/>\n          <ref name=\"hpaned\"/>\n          <ref name=\"vpaned\"/>\n        </choice>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.page\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">angle</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.page\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">icon</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.page\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"Unknown\">\n        <name ns=\"\">string</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.page\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"4\">\n        <name ns=\"\">col</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.page\" combine=\"interleave\">\n    <choice>\n      <attribute>\n        <name ns=\"\">name</name>\n        <text/>\n      </attribute>\n      <attribute>\n        <name ns=\"\">id</name>\n        <text/>\n      </attribute>\n    </choice>\n  </define>\n  <define name=\"attlist.page\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">states</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"group\">\n    <element>\n      <name ns=\"\">group</name>\n      <ref name=\"attlist.group\"/>\n      <zeroOrMore>\n        <choice>\n          <ref name=\"label\"/>\n          <ref name=\"field\"/>\n          <ref name=\"image\"/>\n          <ref name=\"separator\"/>\n          <ref name=\"newline\"/>\n          <ref name=\"button\"/>\n          <ref name=\"link\"/>\n          <ref name=\"notebook\"/>\n          <ref name=\"group\"/>\n          <ref name=\"hpaned\"/>\n          <ref name=\"vpaned\"/>\n        </choice>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">string</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">colspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">yexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">yfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0.5\">\n        <name ns=\"\">yalign</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">xexpand</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">xfill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0.5\">\n        <name ns=\"\">xalign</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">rowspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"4\">\n        <name ns=\"\">col</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <choice>\n      <attribute>\n        <name ns=\"\">name</name>\n        <text/>\n      </attribute>\n      <attribute>\n        <name ns=\"\">id</name>\n        <text/>\n      </attribute>\n    </choice>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">states</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">homogeneous</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.group\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">expandable</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"hpaned\">\n    <element>\n      <name ns=\"\">hpaned</name>\n      <ref name=\"attlist.paned\"/>\n      <zeroOrMore>\n        <ref name=\"child\"/>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"vpaned\">\n    <element>\n      <name ns=\"\">vpaned</name>\n      <ref name=\"attlist.paned\"/>\n      <zeroOrMore>\n        <ref name=\"child\"/>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.paned\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"4\">\n        <name ns=\"\">colspan</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.paned\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">position</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.paned\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">id</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"child\">\n    <element>\n      <name ns=\"\">child</name>\n      <ref name=\"attlist.child\"/>\n      <zeroOrMore>\n        <choice>\n          <ref name=\"label\"/>\n          <ref name=\"field\"/>\n          <ref name=\"image\"/>\n          <ref name=\"separator\"/>\n          <ref name=\"newline\"/>\n          <ref name=\"button\"/>\n          <ref name=\"link\"/>\n          <ref name=\"notebook\"/>\n          <ref name=\"group\"/>\n          <ref name=\"hpaned\"/>\n          <ref name=\"vpaned\"/>\n        </choice>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.child\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">id</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"data\">\n    <element>\n      <name ns=\"\">data</name>\n      <ref name=\"attlist.data\"/>\n      <zeroOrMore>\n        <ref name=\"xpath\"/>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.data\" combine=\"interleave\">\n    <empty/>\n  </define>\n  <define name=\"xpath\">\n    <element>\n      <name ns=\"\">xpath</name>\n      <ref name=\"attlist.xpath\"/>\n      <zeroOrMore>\n        <choice>\n          <ref name=\"label\"/>\n          <ref name=\"field\"/>\n          <ref name=\"image\"/>\n          <ref name=\"separator\"/>\n          <ref name=\"newline\"/>\n          <ref name=\"button\"/>\n          <ref name=\"link\"/>\n          <ref name=\"notebook\"/>\n          <ref name=\"group\"/>\n          <ref name=\"hpaned\"/>\n          <ref name=\"vpaned\"/>\n          <ref name=\"form\"/>\n          <ref name=\"page\"/>\n          <ref name=\"child\"/>\n        </choice>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.xpath\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">expr</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.xpath\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"inside\">\n        <name ns=\"\">position</name>\n        <choice>\n          <value>inside</value>\n          <value>replace</value>\n          <value>replace_attributes</value>\n          <value>after</value>\n          <value>before</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <start>\n    <choice>\n      <ref name=\"data\"/>\n      <ref name=\"form\"/>\n    </choice>\n  </start>\n</grammar>\n"
  },
  {
    "path": "trytond/ir/ui/graph.rnc",
    "content": "namespace a = \"http://relaxng.org/ns/compatibility/annotations/1.0\"\n\ngraph = element graph { attlist.graph, x*, y* }\nattlist.graph &=\n  [ a:defaultValue = \"vbar\" ]\n  attribute type { \"vbar\" | \"hbar\" | \"line\" | \"pie\" }?\nattlist.graph &= attribute background { text }?\nattlist.graph &= attribute color { text }?\nattlist.graph &=\n  [ a:defaultValue = \"1\" ] attribute legend { \"0\" | \"1\" }?\nx = element x { attlist.x, field }\nattlist.x &= empty\ny = element y { attlist.y, field+ }\nattlist.y &= empty\nfield = element field { attlist.field, empty }\nattlist.field &= attribute name { text }\nattlist.field &= attribute string { text }?\nattlist.field &= attribute key { text }?\nattlist.field &= attribute domain { text }?\nattlist.field &= attribute fill { \"0\" | \"1\" }?\nattlist.field &= attribute empty { \"0\" | \"1\" }?\nattlist.field &= attribute color { text }?\nattlist.field &= attribute timedelta { text }?\nattlist.field &=\n    [ a:defaultValue = \"linear\" ]\n    attribute interpolation { \"constant-left\" | \"constant-right\" | \"constant-center\" | \"linear\" }?\ndata = element data { attlist.data, xpath* }\nattlist.data &= empty\nxpath = element xpath { attlist.xpath,\n    (graph\n    | x\n    | y\n    | field)*\n  }\nattlist.xpath &= attribute expr { text }\nattlist.xpath &=\n  [ a:defaultValue = \"inside\" ]\n  attribute position { \"inside\" | \"replace\" | \"replace_attributes\" | \"after\" | \"before\" }?\nstart = data | graph\n"
  },
  {
    "path": "trytond/ir/ui/graph.rng",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<grammar xmlns=\"http://relaxng.org/ns/structure/1.0\"\n         xmlns:a=\"http://relaxng.org/ns/compatibility/annotations/1.0\">\n  <define name=\"graph\">\n    <element>\n      <name ns=\"\">graph</name>\n      <ref name=\"attlist.graph\"/>\n      <zeroOrMore>\n        <ref name=\"x\"/>\n      </zeroOrMore>\n      <zeroOrMore>\n        <ref name=\"y\"/>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.graph\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"vbar\">\n        <name ns=\"\">type</name>\n        <choice>\n          <value>vbar</value>\n          <value>hbar</value>\n          <value>line</value>\n          <value>pie</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.graph\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">background</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.graph\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">color</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.graph\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">legend</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"x\">\n    <element>\n      <name ns=\"\">x</name>\n      <ref name=\"attlist.x\"/>\n      <ref name=\"field\"/>\n    </element>\n  </define>\n  <define name=\"attlist.x\" combine=\"interleave\">\n    <empty/>\n  </define>\n  <define name=\"y\">\n    <element>\n      <name ns=\"\">y</name>\n      <ref name=\"attlist.y\"/>\n      <oneOrMore>\n        <ref name=\"field\"/>\n      </oneOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.y\" combine=\"interleave\">\n    <empty/>\n  </define>\n  <define name=\"field\">\n    <element>\n      <name ns=\"\">field</name>\n      <ref name=\"attlist.field\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">name</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">string</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">key</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">domain</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">fill</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">empty</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">color</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">timedelta</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"linear\">\n        <name ns=\"\">interpolation</name>\n        <choice>\n          <value>constant-left</value>\n          <value>constant-right</value>\n          <value>constant-center</value>\n          <value>linear</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"data\">\n    <element>\n      <name ns=\"\">data</name>\n      <ref name=\"attlist.data\"/>\n      <zeroOrMore>\n        <ref name=\"xpath\"/>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.data\" combine=\"interleave\">\n    <empty/>\n  </define>\n  <define name=\"xpath\">\n    <element>\n      <name ns=\"\">xpath</name>\n      <ref name=\"attlist.xpath\"/>\n      <zeroOrMore>\n        <choice>\n          <ref name=\"graph\"/>\n          <ref name=\"x\"/>\n          <ref name=\"y\"/>\n          <ref name=\"field\"/>\n        </choice>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.xpath\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">expr</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.xpath\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"inside\">\n        <name ns=\"\">position</name>\n        <choice>\n          <value>inside</value>\n          <value>replace</value>\n          <value>replace_attributes</value>\n          <value>after</value>\n          <value>before</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <start>\n    <choice>\n      <ref name=\"data\"/>\n      <ref name=\"graph\"/>\n    </choice>\n  </start>\n</grammar>\n"
  },
  {
    "path": "trytond/ir/ui/icon.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of this\n# repository contains the full copyright notices and license terms.\n\nimport os\n\nfrom trytond.cache import Cache\nfrom trytond.model import ModelSQL, ModelView, fields, sequence_ordered\nfrom trytond.rpc import RPC\nfrom trytond.tools import file_open\nfrom trytond.transaction import Transaction\n\n\nclass Icon(sequence_ordered(), ModelSQL, ModelView):\n    'Icon'\n    __name__ = 'ir.ui.icon'\n\n    name = fields.Char('Name', required=True)\n    module = fields.Char('Module', readonly=True, required=True)\n    path = fields.Char('SVG Path', readonly=True, required=True)\n    icon = fields.Function(fields.Char('Icon', depends=['path']), 'get_icon')\n    _list_icons = Cache('ir.ui.icon.list_icons', context=False)\n\n    @classmethod\n    def __setup__(cls):\n        super(Icon, cls).__setup__()\n        cls.__rpc__.update({\n                'list_icons': RPC(),\n                })\n\n    @classmethod\n    def __register__(cls, module_name):\n        super().__register__(module_name)\n\n        table = cls.__table_handler__(module_name)\n\n        # Migration from 5.0: remove required on sequence\n        table.not_null_action('sequence', 'remove')\n\n    @staticmethod\n    def default_module():\n        return Transaction().context.get('module') or ''\n\n    @staticmethod\n    def default_sequence():\n        return 10\n\n    @classmethod\n    def list_icons(cls):\n        icons = cls._list_icons.get(None)\n        if icons is not None:\n            return icons\n        icons = {}\n        for icon in cls.browse(cls.search([],\n                order=[('sequence', 'ASC'), ('id', 'ASC')])):\n            if icon.name not in icons:\n                icons[icon.name] = icon.id\n        icons = sorted((icon_id, name) for name, icon_id in icons.items())\n        cls._list_icons.set(None, icons)\n        return icons\n\n    def get_icon(self, name):\n        path = os.path.join(self.module, self.path.replace('/', os.sep))\n        with file_open(\n                path,\n                subdir='modules' if self.module not in {'ir', 'res'} else '',\n                mode='r', encoding='utf-8') as fp:\n            return fp.read()\n\n    @classmethod\n    def create(cls, vlist):\n        icons = super().create(vlist)\n        cls._list_icons.clear()\n        return icons\n\n    @classmethod\n    def write(cls, *args):\n        super().write(*args)\n        cls._list_icons.clear()\n\n    @classmethod\n    def delete(cls, icons):\n        super().delete(icons)\n        cls._list_icons.clear()\n"
  },
  {
    "path": "trytond/ir/ui/icon.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\n     this repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <record model=\"ir.ui.view\" id=\"icon_view_tree\">\n            <field name=\"model\">ir.ui.icon</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">icon_view_list</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"icon_view_form\">\n            <field name=\"model\">ir.ui.icon</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">icon_view_form</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_icon_form\">\n            <field name=\"name\">Icons</field>\n            <field name=\"res_model\">ir.ui.icon</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_icon_form_view1\">\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"view\" ref=\"icon_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_icon_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_icon_form_view2\">\n            <field name=\"sequence\" eval=\"20\"/>\n            <field name=\"view\" ref=\"icon_view_form\"/>\n            <field name=\"act_window\" ref=\"act_icon_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_ui\"\n            action=\"act_icon_form\"\n            sequence=\"20\"\n            id=\"menu_icon_form\"/>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/ui/icons/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License."
  },
  {
    "path": "trytond/ir/ui/menu.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom collections import defaultdict\nfrom itertools import groupby\n\nfrom trytond.model import (\n    DeactivableMixin, ModelSQL, ModelView, fields, sequence_ordered, tree)\nfrom trytond.pool import Pool\nfrom trytond.rpc import RPC\nfrom trytond.tools import grouped_slice\nfrom trytond.transaction import Transaction\n\n\ndef one_in(i, j):\n    \"\"\"Check the presence of an element of setA in setB\n    \"\"\"\n    for k in i:\n        if k in j:\n            return True\n    return False\n\n\nCLIENT_ICONS = [(x, x) for x in [\n        'tryton-add',\n        'tryton-archive',\n        'tryton-attach',\n        'tryton-back',\n        'tryton-bookmark-border',\n        'tryton-bookmark',\n        'tryton-bookmarks',\n        'tryton-cancel',\n        'tryton-clear',\n        'tryton-close',\n        'tryton-copy',\n        'tryton-create',\n        'tryton-date',\n        'tryton-delete',\n        'tryton-email',\n        'tryton-error',\n        'tryton-exit',\n        'tryton-export',\n        'tryton-filter',\n        'tryton-format-align-center',\n        'tryton-format-align-justify',\n        'tryton-format-align-left',\n        'tryton-format-align-right',\n        'tryton-format-bold',\n        'tryton-format-color-text',\n        'tryton-format-italic',\n        'tryton-format-underline',\n        'tryton-forward',\n        'tryton-history',\n        'tryton-import',\n        'tryton-info',\n        'tryton-launch',\n        'tryton-link',\n        'tryton-log',\n        'tryton-menu',\n        'tryton-note',\n        'tryton-ok',\n        'tryton-open',\n        'tryton-print',\n        'tryton-public',\n        'tryton-refresh',\n        'tryton-remove',\n        'tryton-save',\n        'tryton-search',\n        'tryton-star-border',\n        'tryton-star',\n        'tryton-switch',\n        'tryton-translate',\n        'tryton-unarchive',\n        'tryton-undo',\n        'tryton-warning',\n        ]]\n\n\nclass UIMenu(\n        DeactivableMixin,\n        sequence_ordered(order='ASC NULLS LAST'),\n        tree(separator=' / '),\n        ModelSQL, ModelView):\n    \"UI menu\"\n    __name__ = 'ir.ui.menu'\n\n    name = fields.Char('Menu', required=True, translate=True)\n    childs = fields.One2Many('ir.ui.menu', 'parent', 'Children')\n    parent = fields.Many2One('ir.ui.menu', 'Parent Menu', ondelete='CASCADE')\n    complete_name = fields.Function(fields.Char('Complete Name'),\n        'get_rec_name', searcher='search_rec_name')\n    icon = fields.Selection('list_icons', 'Icon', translate=False)\n    action = fields.Function(fields.Reference('Action',\n            selection=[\n                ('', ''),\n                ('ir.action.report', 'ir.action.report'),\n                ('ir.action.act_window', 'ir.action.act_window'),\n                ('ir.action.wizard', 'ir.action.wizard'),\n                ('ir.action.url', 'ir.action.url'),\n                ], translate=False), 'get_action', setter='set_action')\n    action_keywords = fields.One2Many('ir.action.keyword', 'model',\n        'Action Keywords')\n    favorite = fields.Function(fields.Boolean('Favorite'), 'get_favorite')\n\n    @classmethod\n    def order_complete_name(cls, tables):\n        return cls.name.convert_order('name', tables, cls)\n\n    @staticmethod\n    def default_icon():\n        return 'tryton-folder'\n\n    @classmethod\n    def default_sequence(cls):\n        return 50\n\n    @staticmethod\n    def list_icons():\n        pool = Pool()\n        Icon = pool.get('ir.ui.icon')\n        return sorted(CLIENT_ICONS\n            + [(name, name) for _, name in Icon.list_icons()])\n\n    @classmethod\n    def search_global(cls, text):\n        # TODO improve search clause\n        for record in cls.search([\n                    ('rec_name', 'ilike', '%%%s%%' % text),\n                    ]):\n            if record.action:\n                yield record, record.rec_name, record.icon\n\n    @classmethod\n    def search(cls, domain, offset=0, limit=None, order=None, count=False,\n            query=False):\n        menus = super(UIMenu, cls).search(domain, offset=offset, limit=limit,\n                order=order, count=False, query=query)\n        if query:\n            return menus\n\n        if menus:\n            parent_ids = {x.parent.id for x in menus if x.parent}\n            parents = set()\n            for sub_parent_ids in grouped_slice(parent_ids):\n                parents.update(cls.search([\n                            ('id', 'in', list(sub_parent_ids)),\n                            ]))\n            # Re-browse to avoid side-cache access\n            menus = cls.browse([x.id for x in menus\n                    if (x.parent and x.parent in parents) or not x.parent])\n\n        if count:\n            return len(menus)\n        return menus\n\n    @classmethod\n    def get_action(cls, menus, name):\n        pool = Pool()\n        actions = dict((m.id, None) for m in menus)\n        with Transaction().set_context(active_test=False):\n            menus = cls.browse(menus)\n        action_keywords = sum((list(m.action_keywords) for m in menus), [])\n\n        def action_type(keyword):\n            return keyword.action.type\n        action_keywords.sort(key=action_type)\n        for type, action_keywords in groupby(action_keywords, key=action_type):\n            action_keywords = list(action_keywords)\n            action2keywords = defaultdict(list)\n            for action_keyword in action_keywords:\n                model = action_keyword.model\n                actions[model.id] = '%s,-1' % type\n                action2keywords[action_keyword.action.id].append(\n                    action_keyword)\n\n            Action = pool.get(type)\n            with Transaction().set_context(active_test=False):\n                factions = Action.search([\n                        ('action', 'in', list(action2keywords.keys())),\n                        ])\n            for action in factions:\n                for action_keyword in action2keywords[action.id]:\n                    actions[action_keyword.model.id] = str(action)\n        return actions\n\n    @classmethod\n    def set_action(cls, menus, name, value):\n        pool = Pool()\n        ActionKeyword = pool.get('ir.action.keyword')\n        action_keywords = []\n        transaction = Transaction()\n        for i in range(0, len(menus), transaction.database.IN_MAX):\n            sub_menus = menus[i:i + transaction.database.IN_MAX]\n            action_keywords += ActionKeyword.search([\n                ('keyword', '=', 'tree_open'),\n                ('model', 'in', [str(menu) for menu in sub_menus]),\n                ])\n        if action_keywords:\n            with Transaction().set_context(_timestamp=False):\n                ActionKeyword.delete(action_keywords)\n        if not value:\n            return\n        if isinstance(value, str):\n            action_type, action_id = value.split(',')\n        else:\n            action_type, action_id = value\n        if int(action_id) <= 0:\n            return\n        Action = pool.get(action_type)\n        action = Action(int(action_id))\n        to_create = []\n        for menu in menus:\n            with Transaction().set_context(_timestamp=False):\n                to_create.append({\n                        'keyword': 'tree_open',\n                        'model': str(menu),\n                        'action': action.action.id,\n                        })\n        if to_create:\n            ActionKeyword.create(to_create)\n\n    @classmethod\n    def get_favorite(cls, menus, name):\n        pool = Pool()\n        Favorite = pool.get('ir.ui.menu.favorite')\n        user = Transaction().user\n        favorites = Favorite.search([\n                ('menu', 'in', [m.id for m in menus]),\n                ('user', '=', user),\n                ])\n        menu2favorite = dict((m.id, False if m.action else None)\n            for m in menus)\n        menu2favorite.update(dict((f.menu.id, True) for f in favorites))\n        return menu2favorite\n\n\nclass UIMenuFavorite(sequence_ordered(), ModelSQL, ModelView):\n    \"Menu Favorite\"\n    __name__ = 'ir.ui.menu.favorite'\n\n    menu = fields.Many2One('ir.ui.menu', 'Menu', required=True,\n        ondelete='CASCADE')\n    user = fields.Many2One('res.user', 'User', required=True,\n        ondelete='CASCADE')\n\n    @classmethod\n    def __setup__(cls):\n        super(UIMenuFavorite, cls).__setup__()\n        cls.__rpc__.update({\n                'get': RPC(),\n                'set': RPC(readonly=False),\n                'unset': RPC(readonly=False),\n                })\n\n    @staticmethod\n    def default_user():\n        return Transaction().user\n\n    @classmethod\n    def get(cls):\n        user = Transaction().user\n        favorites = cls.search([\n                ('user', '=', user),\n                ])\n        return [(f.menu.id, f.menu.rec_name, f.menu.icon) for f in favorites]\n\n    @classmethod\n    def set(cls, menu_id):\n        user = Transaction().user\n        cls.create([{\n                    'menu': menu_id,\n                    'user': user,\n                    }])\n\n    @classmethod\n    def unset(cls, menu_id):\n        user = Transaction().user\n        favorites = cls.search([\n                ('menu', '=', menu_id),\n                ('user', '=', user),\n                ])\n        cls.delete(favorites)\n"
  },
  {
    "path": "trytond/ir/ui/menu.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <record model=\"ir.ui.view\" id=\"menu_view_tree_tree\">\n            <field name=\"model\">ir.ui.menu</field>\n            <field name=\"type\">tree</field>\n            <field name=\"field_childs\">childs</field>\n            <field name=\"priority\" eval=\"20\"/>\n            <field name=\"name\">ui_menu_tree</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"menu_view_list\">\n            <field name=\"model\">ir.ui.menu</field>\n            <field name=\"type\">tree</field>\n            <field name=\"priority\" eval=\"10\"/>\n            <field name=\"name\">ui_menu_list</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"menu_view_form\">\n            <field name=\"model\">ir.ui.menu</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">ui_menu_form</field>\n        </record>\n\n        <record model=\"ir.action.act_window\" id=\"act_menu_tree\">\n            <field name=\"name\">Menu</field>\n            <field name=\"res_model\">ir.ui.menu</field>\n            <field name=\"usage\">menu</field>\n            <field name=\"domain\" eval=\"[('parent', '=', None)]\" pyson=\"1\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_menu_tree_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"menu_view_tree_tree\"/>\n            <field name=\"act_window\" ref=\"act_menu_tree\"/>\n        </record>\n\n        <record model=\"ir.action.act_window\" id=\"act_menu_list\">\n            <field name=\"name\">Menu</field>\n            <field name=\"res_model\">ir.ui.menu</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_menu_list_view1\">\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"view\" ref=\"menu_view_list\"/>\n            <field name=\"act_window\" ref=\"act_menu_list\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_menu_list_view2\">\n            <field name=\"sequence\" eval=\"20\"/>\n            <field name=\"view\" ref=\"menu_view_form\"/>\n            <field name=\"act_window\" ref=\"act_menu_list\"/>\n        </record>\n\n        <menuitem\n            parent=\"menu_ui\"\n            action=\"act_menu_list\"\n            sequence=\"10\"\n            id=\"menu_menu_list\"/>\n\n        <record model=\"ir.ui.view\" id=\"menu_favorite_view_list\">\n            <field name=\"model\">ir.ui.menu.favorite</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">ui_menu_favorite_list</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"menu_favorite_view_form\">\n            <field name=\"model\">ir.ui.menu.favorite</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">ui_menu_favorite_form</field>\n        </record>\n\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/ui/tree.rnc",
    "content": "namespace a = \"http://relaxng.org/ns/compatibility/annotations/1.0\"\n\ntree = element tree { attlist.tree,\n    (field\n     | button)*\n  }\nattlist.tree &= attribute on_write { text }?\nattlist.tree &= attribute editable { \"0\" | \"1\" }?\nattlist.tree &=\n  [ a:defaultValue = \"1\" ] attribute creatable { \"0\" | \"1\" }?\nattlist.tree &= attribute sequence { text }?\nattlist.tree &=\n  [ a:defaultValue = \"0\" ] attribute keyword_open { \"0\" | \"1\" }?\nattlist.tree &=\n  [ a:defaultValue = \"0\" ] attribute tree_state { \"0\" | \"1\" }?\nattlist.tree &= attribute visual { text }?\nfield = element field { attlist.field, (prefix | suffix)* }\nattlist.field &= attribute name { text }\nattlist.field &= attribute readonly { \"0\" | \"1\" }?\nattlist.field &=\n  attribute widget {\n    \"binary\"\n    | \"boolean\"\n    | \"callto\"\n    | \"char\"\n    | \"date\"\n    | \"datetime\"\n    | \"email\"\n    | \"float\"\n    | \"image\"\n    | \"integer\"\n    | \"many2many\"\n    | \"many2one\"\n    | \"multiselection\"\n    | \"numeric\"\n    | \"one2many\"\n    | \"one2one\"\n    | \"progressbar\"\n    | \"reference\"\n    | \"selection\"\n    | \"sip\"\n    | \"text\"\n    | \"time\"\n    | \"timedelta\"\n    | \"url\"\n  }?\nattlist.field &=\n  [ a:defaultValue = \"0\" ] attribute tree_invisible { text }?\nattlist.field &= attribute optional { \"0\" | \"1\" }?\nattlist.field &=\n  [ a:defaultValue = \"0\" ] attribute expand { xsd:integer }?\nattlist.field &= attribute visual { text }?\nattlist.field &= attribute icon { text }?\nattlist.field &= attribute sum { text }?\nattlist.field &= attribute width { text }?\nattlist.field &= attribute height { text }?\nattlist.field &=\n  [ a:defaultValue = \"1\" ] attribute create { \"0\" | \"1\" }?\nattlist.field &=\n  [ a:defaultValue = \"1\" ] attribute delete { \"0\" | \"1\" }?\nattlist.field &=\n  [ a:defaultValue = \"left_to_right\" ] attribute orientation {\n    \"left_to_right\"\n    | \"right_to_left\"\n    | \"bottom_to_top\"\n    | \"top_to_bottom\"\n  }?\nattlist.field &= [a:defaultValue = \"0\"] attribute pre_validate { \"0\" | \"1\" }?\nattlist.field &= [a:defaultValue = \"1\"] attribute completion { \"0\" | \"1\" }?\nattlist.field &= attribute string { text }?\nattlist.field &= [a:defaultValue = \"1\"] attribute factor { text }?\nattlist.field &= attribute filename { text }?\nattlist.field &= attribute help_field { text }?\nattlist.field &= attribute view_ids { text }?\nattlist.field &= attribute symbol { text }?\nattlist.field &= [a:defaultValue = \"1\"] attribute grouping { \"0\" | \"1\" }?\nprefix = element prefix { attlist.affix, empty }\nsuffix = element suffix { attlist.affix, empty }\nattlist.affix &= attribute string { text }?\nattlist.affix &= ( attribute name { text } | attribute id { text } )\nattlist.affix &= attribute icon { text }?\nattlist.affix &= [a:defaultValue = \"icon\"] attribute icon_type { \"icon\" | \"url\" }?\nattlist.affix &= attribute url_size { text }?\nbutton = element button { attlist.button, empty }\nattlist.button &= attribute help { text }?\nattlist.button &= attribute string { text }?\nattlist.button &= attribute confirm { text }?\nattlist.button &= attribute name { text }\nattlist.button &= attribute states { text }?\nattlist.button &=\n    [ a:defaultValue=\"action\" ]\n    attribute keyword { \"relate\" | \"print\" | \"action\" }?\nattlist.button &= attribute change { text }?\nattlist.button &= attribute type { \"class\" | \"instance\" }?\nattlist.button &=\n  [ a:defaultValue = \"0\" ] attribute tree_invisible { text }?\ndata = element data { attlist.data, xpath* }\nattlist.data &= empty\nxpath = element xpath { attlist.xpath,\n    (field\n    | prefix\n    | suffix\n    | button\n    | tree\n    )*\n  }\nattlist.xpath &= attribute expr { text }\nattlist.xpath &=\n  [ a:defaultValue = \"inside\" ]\n  attribute position { \"inside\" | \"replace\" | \"replace_attributes\" | \"after\" | \"before\" }?\nstart = tree | data\n"
  },
  {
    "path": "trytond/ir/ui/tree.rng",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<grammar xmlns=\"http://relaxng.org/ns/structure/1.0\"\n         xmlns:a=\"http://relaxng.org/ns/compatibility/annotations/1.0\"\n         datatypeLibrary=\"http://www.w3.org/2001/XMLSchema-datatypes\">\n  <define name=\"tree\">\n    <element>\n      <name ns=\"\">tree</name>\n      <ref name=\"attlist.tree\"/>\n      <zeroOrMore>\n        <choice>\n          <ref name=\"field\"/>\n          <ref name=\"button\"/>\n        </choice>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.tree\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">on_write</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.tree\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">editable</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.tree\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">creatable</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.tree\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">sequence</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.tree\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">keyword_open</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.tree\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">tree_state</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.tree\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">visual</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"field\">\n    <element>\n      <name ns=\"\">field</name>\n      <ref name=\"attlist.field\"/>\n      <zeroOrMore>\n        <choice>\n          <ref name=\"prefix\"/>\n          <ref name=\"suffix\"/>\n        </choice>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">name</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">readonly</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">widget</name>\n        <choice>\n          <value>binary</value>\n          <value>boolean</value>\n          <value>callto</value>\n          <value>char</value>\n          <value>date</value>\n          <value>datetime</value>\n          <value>email</value>\n          <value>float</value>\n          <value>image</value>\n          <value>integer</value>\n          <value>many2many</value>\n          <value>many2one</value>\n          <value>multiselection</value>\n          <value>numeric</value>\n          <value>one2many</value>\n          <value>one2one</value>\n          <value>progressbar</value>\n          <value>reference</value>\n          <value>selection</value>\n          <value>sip</value>\n          <value>text</value>\n          <value>time</value>\n          <value>timedelta</value>\n          <value>url</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">tree_invisible</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">optional</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">expand</name>\n        <data type=\"integer\"/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">visual</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">icon</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">sum</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">width</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">height</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">create</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">delete</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"left_to_right\">\n        <name ns=\"\">orientation</name>\n        <choice>\n          <value>left_to_right</value>\n          <value>right_to_left</value>\n          <value>bottom_to_top</value>\n          <value>top_to_bottom</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">pre_validate</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">completion</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">string</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">factor</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">filename</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">help_field</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">view_ids</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">symbol</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"1\">\n        <name ns=\"\">grouping</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"prefix\">\n    <element>\n      <name ns=\"\">prefix</name>\n      <ref name=\"attlist.affix\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"suffix\">\n    <element>\n      <name ns=\"\">suffix</name>\n      <ref name=\"attlist.affix\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.affix\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">string</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.affix\" combine=\"interleave\">\n    <choice>\n      <attribute>\n        <name ns=\"\">name</name>\n        <text/>\n      </attribute>\n      <attribute>\n        <name ns=\"\">id</name>\n        <text/>\n      </attribute>\n    </choice>\n  </define>\n  <define name=\"attlist.affix\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">icon</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.affix\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"icon\">\n        <name ns=\"\">icon_type</name>\n        <choice>\n          <value>icon</value>\n          <value>url</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.affix\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">url_size</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"button\">\n    <element>\n      <name ns=\"\">button</name>\n      <ref name=\"attlist.button\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">help</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">string</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">confirm</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">name</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">states</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"action\">\n        <name ns=\"\">keyword</name>\n        <choice>\n          <value>relate</value>\n          <value>print</value>\n          <value>action</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">change</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">type</name>\n        <choice>\n          <value>class</value>\n          <value>instance</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.button\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">tree_invisible</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"data\">\n    <element>\n      <name ns=\"\">data</name>\n      <ref name=\"attlist.data\"/>\n      <zeroOrMore>\n        <ref name=\"xpath\"/>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.data\" combine=\"interleave\">\n    <empty/>\n  </define>\n  <define name=\"xpath\">\n    <element>\n      <name ns=\"\">xpath</name>\n      <ref name=\"attlist.xpath\"/>\n      <zeroOrMore>\n        <choice>\n          <ref name=\"field\"/>\n          <ref name=\"prefix\"/>\n          <ref name=\"suffix\"/>\n          <ref name=\"button\"/>\n          <ref name=\"tree\"/>\n        </choice>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.xpath\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">expr</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.xpath\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"inside\">\n        <name ns=\"\">position</name>\n        <choice>\n          <value>inside</value>\n          <value>replace</value>\n          <value>replace_attributes</value>\n          <value>after</value>\n          <value>before</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <start>\n    <choice>\n      <ref name=\"tree\"/>\n      <ref name=\"data\"/>\n    </choice>\n  </start>\n</grammar>\n"
  },
  {
    "path": "trytond/ir/ui/ui.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <record model=\"ir.ui.icon\" id=\"board_icon\">\n            <field name=\"name\">tryton-board</field>\n            <field name=\"path\">ui/icons/tryton-board.svg</field>\n        </record>\n        <record model=\"ir.ui.icon\" id=\"calendar_icon\">\n            <field name=\"name\">tryton-calendar</field>\n            <field name=\"path\">ui/icons/tryton-calendar.svg</field>\n        </record>\n        <record model=\"ir.ui.icon\" id=\"folder_icon\">\n            <field name=\"name\">tryton-folder</field>\n            <field name=\"path\">ui/icons/tryton-folder.svg</field>\n        </record>\n        <record model=\"ir.ui.icon\" id=\"form_icon\">\n            <field name=\"name\">tryton-form</field>\n            <field name=\"path\">ui/icons/tryton-form.svg</field>\n        </record>\n        <record model=\"ir.ui.icon\" id=\"graph_icon\">\n            <field name=\"name\">tryton-graph</field>\n            <field name=\"path\">ui/icons/tryton-graph.svg</field>\n        </record>\n        <record model=\"ir.ui.icon\" id=\"list_icon\">\n            <field name=\"name\">tryton-list</field>\n            <field name=\"path\">ui/icons/tryton-list.svg</field>\n        </record>\n        <record model=\"ir.ui.icon\" id=\"settings_icon\">\n            <field name=\"name\">tryton-settings</field>\n            <field name=\"path\">ui/icons/tryton-settings.svg</field>\n        </record>\n        <record model=\"ir.ui.icon\" id=\"tree_icon\">\n            <field name=\"name\">tryton-tree</field>\n            <field name=\"path\">ui/icons/tryton-tree.svg</field>\n        </record>\n\n        <menuitem\n            name=\"Administration\"\n            sequence=\"9999\"\n            id=\"menu_administration\"\n            icon=\"tryton-settings\"/>\n        <menuitem\n            name=\"User Interface\"\n            parent=\"menu_administration\"\n            sequence=\"50\"\n            id=\"menu_ui\"/>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/ui/view.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport json\nimport os\n\nfrom lxml import etree\n\nfrom trytond.cache import Cache\nfrom trytond.i18n import gettext\nfrom trytond.model import Index, ModelSQL, ModelView, fields\nfrom trytond.model.exceptions import ValidationError\nfrom trytond.pool import Pool\nfrom trytond.pyson import PYSON, Bool, Eval, If, PYSONDecoder\nfrom trytond.rpc import RPC\nfrom trytond.tools import file_open\nfrom trytond.transaction import Transaction\nfrom trytond.wizard import Button, StateView, Wizard\n\nfrom ..action import DomainError\n\n\nclass XMLError(ValidationError):\n    pass\n\n\nclass View(ModelSQL, ModelView):\n    \"View\"\n    __name__ = 'ir.ui.view'\n    _rec_name = 'model'\n    model = fields.Char('Model', states={\n            'required': Eval('type') != 'board',\n            })\n    priority = fields.Integer('Priority', required=True)\n    type = fields.Selection([\n            (None, ''),\n            ('tree', 'Tree'),\n            ('form', 'Form'),\n            ('graph', 'Graph'),\n            ('calendar', 'Calendar'),\n            ('board', 'Board'),\n            ('list-form', \"List Form\"),\n            ], 'View Type',\n        domain=[\n            If(Bool(Eval('inherit')),\n                ('type', '=', None),\n                ('type', '!=', None)),\n            ],\n        depends=['inherit'])\n    type_string = type.translated('type')\n    data = fields.Text('Data')\n    name = fields.Char('Name', states={\n            'invisible': ~(Eval('module') & Eval('name')),\n            }, depends=['module'], readonly=True)\n    arch = fields.Function(fields.Text('View Architecture', states={\n                'readonly': Bool(Eval('name')),\n                }, depends=['name']), 'get_arch', setter='set_arch')\n    inherit = fields.Many2One('ir.ui.view', 'Inherited View',\n            ondelete='CASCADE')\n    field_childs = fields.Char('Children Field', states={\n            'invisible': Eval('type') != 'tree',\n            }, depends=['type'])\n    module = fields.Char('Module', states={\n            'invisible': ~Eval('module'),\n            }, readonly=True)\n    domain = fields.Char('Domain', states={\n            'invisible': ~Eval('inherit'),\n            }, depends=['inherit'])\n    _get_rng_cache = Cache('ir_ui_view.get_rng')\n    _view_get_cache = Cache('ir_ui_view.view_get')\n    __module_index = None\n\n    @classmethod\n    def __setup__(cls):\n        super(View, cls).__setup__()\n        table = cls.__table__()\n\n        cls.__rpc__['view_get'] = RPC(instantiate=0, cache=dict(days=1))\n        cls._order.insert(0, ('priority', 'ASC'))\n        cls._buttons.update({\n                'show': {\n                    'readonly': Eval('type') != 'form',\n                    'depends': ['type'],\n                    },\n                })\n        cls._sql_indexes.update({\n                Index(table,\n                    (table.model, Index.Equality()),\n                    (table.inherit, Index.Equality())),\n                Index(\n                    table,\n                    (table.id, Index.Equality()),\n                    (table.inherit, Index.Equality())),\n                })\n\n    @staticmethod\n    def default_priority():\n        return 16\n\n    @staticmethod\n    def default_module():\n        return Transaction().context.get('module') or ''\n\n    def get_rec_name(self, name):\n        return '%s (%s)' % (\n            self.model,\n            self.inherit.rec_name if self.inherit else self.type_string)\n\n    @classmethod\n    @ModelView.button_action('ir.act_view_show')\n    def show(cls, views):\n        pass\n\n    @classmethod\n    def get_rng(cls, type_):\n        key = (cls.__name__, type_)\n        rng = cls._get_rng_cache.get(key)\n        if rng is None:\n            if type_ == 'list-form':\n                type_ = 'form'\n            rng_name = os.path.join(os.path.dirname(__file__), type_ + '.rng')\n            with open(rng_name, 'rb') as fp:\n                rng = etree.fromstring(fp.read())\n            cls._get_rng_cache.set(key, rng)\n        return rng\n\n    @property\n    def rng_type(self):\n        if self.inherit:\n            return self.inherit.rng_type\n        return self.type\n\n    @classmethod\n    def validate(cls, views):\n        super(View, cls).validate(views)\n        cls.check_xml(views)\n\n    @classmethod\n    def check_xml(cls, views):\n        \"Check XML\"\n        for view in views:\n            if not view.arch:\n                continue\n            xml = view.arch.strip()\n            if not xml:\n                continue\n            tree = etree.fromstring(xml)\n\n            if hasattr(etree, 'RelaxNG'):\n                validator = etree.RelaxNG(etree=cls.get_rng(view.rng_type))\n                if not validator.validate(tree):\n                    error_log = '\\n'.join(map(str,\n                            validator.error_log.filter_from_errors()))\n                    raise XMLError(\n                        gettext('ir.msg_view_invalid_xml', name=view.rec_name),\n                        error_log)\n            root_element = tree.getroottree().getroot()\n\n            # validate pyson attributes\n            validates = {\n                'states': fields.states_validate,\n            }\n\n            def encode(element):\n                for attr in ('states', 'domain', 'spell'):\n                    if not element.get(attr):\n                        continue\n                    try:\n                        value = PYSONDecoder().decode(element.get(attr))\n                        validates.get(attr, lambda a: True)(value)\n                    except Exception as e:\n                        error_log = '%s: <%s %s=\"%s\"/>' % (\n                            e, element.get('id') or element.get('name'), attr,\n                            element.get(attr))\n                        raise XMLError(\n                            gettext(\n                                'ir.msg_view_invalid_xml', name=view.rec_name),\n                            error_log) from e\n                for child in element:\n                    encode(child)\n            encode(root_element)\n\n    def get_arch(self, name):\n        value = None\n        if self.name and self.module:\n            path = os.path.join(self.module, 'view', self.name + '.xml')\n            try:\n                with file_open(path,\n                        subdir='modules', mode='r', encoding='utf-8') as fp:\n                    value = fp.read()\n            except IOError:\n                pass\n        if not value:\n            value = self.data\n        return value\n\n    @classmethod\n    def set_arch(cls, views, name, value):\n        cls.write(views, {'data': value})\n\n    @classmethod\n    def delete(cls, views):\n        super(View, cls).delete(views)\n        # Restart the cache\n        cls._view_get_cache.clear()\n        ModelView._fields_view_get_cache.clear()\n\n    @classmethod\n    def create(cls, vlist):\n        views = super(View, cls).create(vlist)\n        # Restart the cache\n        cls._view_get_cache.clear()\n        ModelView._fields_view_get_cache.clear()\n        return views\n\n    @classmethod\n    def write(cls, views, values, *args):\n        super(View, cls).write(views, values, *args)\n        # Restart the cache\n        cls._view_get_cache.clear()\n        ModelView._fields_view_get_cache.clear()\n\n    @property\n    def _module_index(self):\n        from trytond.modules import create_graph, get_module_list\n        if self.__class__.__module_index is None:\n            graph = create_graph(get_module_list())\n            modules = [m.name for m in graph]\n            self.__class__.__module_index = {\n                m: i for i, m in enumerate(reversed(modules))}\n        return self.__class__.__module_index\n\n    def view_get(self, model=None):\n        key = (self.id, model)\n        result = self._view_get_cache.get(key)\n        if result:\n            return result\n        if self.inherit:\n            if self.inherit.model == model:\n                return self.inherit.view_get(model=model)\n            else:\n                arch = self.inherit.view_get(self.inherit.model)['arch']\n        else:\n            arch = self.arch\n\n        views = self.__class__.search(['OR', [\n                    ('inherit', '=', self.id),\n                    ('model', '=', model),\n                    ], [\n                    ('id', '=', self.id),\n                    ('inherit', '!=', None),\n                    ],\n                ])\n        views.sort(\n            key=lambda v: self._module_index.get(v.module, -1), reverse=True)\n        parser = etree.XMLParser(remove_comments=True, resolve_entities=False)\n        tree = etree.fromstring(arch, parser=parser)\n        decoder = PYSONDecoder({'context': Transaction().context})\n        for view in views:\n            if view.domain and not decoder.decode(view.domain):\n                continue\n            if not view.arch or not view.arch.strip():\n                continue\n            tree_inherit = etree.fromstring(view.arch, parser=parser)\n            tree = self.inherit_apply(tree, tree_inherit)\n        if model:\n            root = tree.getroottree().getroot()\n            self._translate(root, model, Transaction().language)\n        arch = etree.tostring(tree, encoding='utf-8').decode('utf-8')\n        result = {\n            'type': self.rng_type,\n            'view_id': self.id,\n            'arch': arch,\n            'field_childs': self.field_childs,\n            }\n        self._view_get_cache.set(key, result)\n        return result\n\n    @classmethod\n    def inherit_apply(cls, tree, inherit):\n        root_inherit = inherit.getroottree().getroot()\n        for element in root_inherit:\n            expr = element.get('expr')\n            targets = tree.xpath(expr)\n            assert targets, \"No elements found for expression %r\" % expr\n            for target in targets:\n                position = element.get('position', 'inside')\n                new_tree = getattr(cls, '_inherit_apply_%s' % position)(\n                    tree, element, target)\n                if new_tree:\n                    tree = new_tree\n        return tree\n\n    @classmethod\n    def _inherit_apply_replace(cls, tree, element, target):\n        parent = target.getparent()\n        if parent is None:\n            tree, = element\n            return tree\n        cls._inherit_apply_after(tree, element, target)\n        parent.remove(target)\n\n    @classmethod\n    def _inherit_apply_replace_attributes(cls, tree, element, target):\n        child, = element\n        for attr in child.attrib:\n            target.set(attr, child.get(attr))\n\n    @classmethod\n    def _inherit_apply_inside(cls, tree, element, target):\n        target.extend(list(element))\n\n    @classmethod\n    def _inherit_apply_after(cls, tree, element, target):\n        parent = target.getparent()\n        next_ = target.getnext()\n        if next_ is not None:\n            for child in element:\n                index = parent.index(next_)\n                parent.insert(index, child)\n        else:\n            parent.extend(list(element))\n\n    @classmethod\n    def _inherit_apply_before(cls, tree, element, target):\n        parent = target.getparent()\n        for child in element:\n            index = parent.index(target)\n            parent.insert(index, child)\n\n    @classmethod\n    def _translate(cls, element, model, language):\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        for attr in ['string', 'sum', 'confirm', 'help']:\n            if element.get(attr):\n                translation = Translation.get_source(\n                    model, 'view', language, element.get(attr))\n                if translation:\n                    element.set(attr, translation)\n        for child in element:\n            cls._translate(child, model, language)\n\n\nclass ShowViewStart(ModelView):\n    'Show view'\n    __name__ = 'ir.ui.view.show.start'\n    __no_slots__ = True\n\n\nclass ShowView(Wizard):\n    'Show view'\n    __name__ = 'ir.ui.view.show'\n\n    class ShowStateView(StateView):\n\n        def __init__(self, model_name, buttons):\n            StateView.__init__(self, model_name, None, buttons)\n\n        def get_view(self, wizard, state_name):\n            pool = Pool()\n            View = pool.get('ir.ui.view')\n            view_id = Transaction().context.get('active_id')\n            if not view_id:\n                # Set type to please ModuleTestCase.test_wizards\n                return {'type': 'form'}\n            view = View(view_id)\n            Model = pool.get(view.model)\n            return Model.fields_view_get(view_id=view.id)\n\n        def get_defaults(self, wizard, state_name, fields):\n            return {}\n\n    start = ShowStateView('ir.ui.view.show.start', [\n            Button('Close', 'end', 'tryton-close', default=True),\n            ])\n\n\nclass ViewTreeWidth(ModelSQL, ModelView):\n    \"View Tree Width\"\n    __name__ = 'ir.ui.view_tree_width'\n    _rec_name = 'model'\n    model = fields.Char('Model', required=True)\n    field = fields.Char('Field', required=True)\n    user = fields.Many2One('res.user', 'User', required=True,\n        ondelete='CASCADE')\n    width = fields.Integer('Width', required=True)\n\n    @classmethod\n    def __setup__(cls):\n        super(ViewTreeWidth, cls).__setup__()\n        table = cls.__table__()\n        cls.__rpc__.update({\n                'set_width': RPC(readonly=False),\n                })\n        cls._sql_indexes.add(\n            Index(\n                table,\n                (table.user, Index.Equality()),\n                (table.model, Index.Equality()),\n                (table.field, Index.Equality())))\n\n    @classmethod\n    def delete(cls, records):\n        ModelView._fields_view_get_cache.clear()\n        super(ViewTreeWidth, cls).delete(records)\n\n    @classmethod\n    def create(cls, vlist):\n        res = super(ViewTreeWidth, cls).create(vlist)\n        ModelView._fields_view_get_cache.clear()\n        return res\n\n    @classmethod\n    def write(cls, records, values, *args):\n        super(ViewTreeWidth, cls).write(records, values, *args)\n        ModelView._fields_view_get_cache.clear()\n\n    @classmethod\n    def set_width(cls, model, fields):\n        '''\n        Set width for the current user on the model.\n        fields is a dictionary with key: field name and value: width.\n        '''\n        records = cls.search([\n            ('user', '=', Transaction().user),\n            ('model', '=', model),\n            ('field', 'in', list(fields.keys())),\n            ])\n        cls.delete(records)\n\n        to_create = []\n        for field in list(fields.keys()):\n            to_create.append({\n                    'model': model,\n                    'field': field,\n                    'user': Transaction().user,\n                    'width': fields[field],\n                    })\n        if to_create:\n            cls.create(to_create)\n\n\nclass ViewTreeOptional(ModelSQL, ModelView):\n    \"View Tree Optional\"\n    __name__ = 'ir.ui.view_tree_optional'\n    view_id = fields.Many2One(\n        'ir.ui.view', \"View ID\", required=True, ondelete='CASCADE',\n        domain=[\n            ('type', '=', 'tree'),\n            ])\n    user = fields.Many2One(\n        'res.user', \"User\", required=True, ondelete='CASCADE')\n    field = fields.Char(\"Field\", required=True)\n    value = fields.Boolean(\"Value\")\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        cls.__rpc__.update({\n                'set_optional': RPC(readonly=False),\n                })\n        table = cls.__table__()\n        cls._sql_indexes.add(\n            Index(\n                table,\n                (table.user, Index.Equality()),\n                (table.view_id, Index.Equality())))\n\n    @classmethod\n    def create(cls, vlist):\n        records = super().create(vlist)\n        ModelView._fields_view_get_cache.clear()\n        return records\n\n    @classmethod\n    def write(cls, *args):\n        super().write(*args)\n        ModelView._fields_view_get_cache.clear()\n\n    @classmethod\n    def delete(cls, records):\n        ModelView._fields_view_get_cache.clear()\n        super().delete(records)\n\n    @classmethod\n    def set_optional(cls, view_id, fields):\n        \"Store optional field that must be displayed\"\n        user = Transaction().user\n        records = cls.search([\n                ('view_id', '=', view_id),\n                ('user', '=', user),\n                ])\n        cls.delete(records)\n        to_create = []\n        for field, value in fields.items():\n            to_create.append({\n                    'view_id': view_id,\n                    'user': user,\n                    'field': field,\n                    'value': bool(value),\n                    })\n        if to_create:\n            cls.create(to_create)\n\n\nclass ViewTreeState(ModelSQL, ModelView):\n    'View Tree State'\n    __name__ = 'ir.ui.view_tree_state'\n    _rec_name = 'model'\n    model = fields.Char('Model', required=True)\n    domain = fields.Char('Domain', required=True)\n    user = fields.Many2One('res.user', 'User', required=True,\n            ondelete='CASCADE')\n    child_name = fields.Char('Child Name')\n    nodes = fields.Text('Expanded Nodes')\n    selected_nodes = fields.Text('Selected Nodes')\n\n    @classmethod\n    def __setup__(cls):\n        super(ViewTreeState, cls).__setup__()\n        cls.__rpc__.update({\n                'set': RPC(readonly=False, check_access=False),\n                'get': RPC(check_access=False, cache=dict(days=1)),\n                })\n\n        table = cls.__table__()\n        cls._sql_indexes.add(\n            Index(\n                table,\n                (table.user, Index.Equality()),\n                (table.model, Index.Equality()),\n                (table.child_name, Index.Equality()),\n                (table.domain, Index.Equality())))\n\n    @staticmethod\n    def default_nodes():\n        return '[]'\n\n    @staticmethod\n    def default_selected_nodes():\n        return '[]'\n\n    @classmethod\n    def set(cls, model, domain, child_name, nodes, selected_nodes):\n        # Normalize the json domain\n        domain = json.dumps(json.loads(domain), separators=(',', ':'))\n        current_user = Transaction().user\n        records = cls.search([\n                ('user', '=', current_user),\n                ('model', '=', model),\n                ('domain', '=', domain),\n                ('child_name', '=', child_name),\n                ])\n        cls.delete(records)\n        cls.create([{\n                    'user': current_user,\n                    'model': model,\n                    'domain': domain,\n                    'child_name': child_name,\n                    'nodes': nodes,\n                    'selected_nodes': selected_nodes,\n                    }])\n\n    @classmethod\n    def get(cls, model, domain, child_name):\n        # Normalize the json domain\n        domain = json.dumps(json.loads(domain), separators=(',', ':'))\n        current_user = Transaction().user\n        try:\n            expanded_info, = cls.search([\n                    ('user', '=', current_user),\n                    ('model', '=', model),\n                    ('domain', '=', domain),\n                    ('child_name', '=', child_name),\n                    ],\n                limit=1)\n        except ValueError:\n            return (cls.default_nodes(), cls.default_selected_nodes())\n        state = cls(expanded_info)\n        return (state.nodes or cls.default_nodes(),\n            state.selected_nodes or cls.default_selected_nodes())\n\n\nclass ViewSearch(ModelSQL, ModelView):\n    \"View Search\"\n    __name__ = 'ir.ui.view_search'\n\n    name = fields.Char('Name', required=True)\n    model = fields.Char('Model', required=True)\n    domain = fields.Char('Domain', help=\"The PYSON domain.\")\n    user = fields.Many2One('res.user', 'User', ondelete='CASCADE')\n\n    @classmethod\n    def __setup__(cls):\n        super(ViewSearch, cls).__setup__()\n        cls.__rpc__.update({\n                'get_search': RPC(),\n                })\n\n    @classmethod\n    def __register__(cls, module):\n        super().__register__(module)\n        table_h = cls.__table_handler__(module)\n\n        # Migration from 5.6: remove user required\n        table_h.not_null_action('user', 'remove')\n\n    @staticmethod\n    def default_user():\n        return Transaction().user\n\n    @classmethod\n    def validate_fields(cls, searches, field_names):\n        super().validate_fields(searches, field_names)\n        cls.check_domain(searches, field_names)\n\n    @classmethod\n    def check_domain(cls, searches, field_names):\n        decoder = PYSONDecoder()\n        if field_names and 'domain' not in field_names:\n            return\n        for search in searches:\n            try:\n                value = decoder.decode(search.domain)\n            except Exception as exception:\n                raise DomainError(\n                    gettext('ir.msg_view_search_invalid_domain',\n                        domain=search.domain,\n                        search=search.rec_name)) from exception\n            if isinstance(value, PYSON):\n                if not value.types() == set([list]):\n                    raise DomainError(\n                        gettext('ir.msg_view_search_invalid_domain',\n                            domain=search.domain,\n                            search=search.rec_name))\n            elif not isinstance(value, list):\n                raise DomainError(\n                    gettext('ir.msg_view_search_invalid_domain',\n                        domain=search.domain,\n                        search=search.rec_name))\n            else:\n                try:\n                    fields.domain_validate(value)\n                except Exception as exception:\n                    raise DomainError(\n                        gettext('ir.msg_view_search_invalid_domain',\n                            domain=search.domain,\n                            search=search.rec_name)) from exception\n\n    @classmethod\n    def get_search(cls):\n        decoder = PYSONDecoder()\n        searches = cls.search_read(\n            [], order=[('model', 'ASC'), ('name', 'ASC')],\n            fields_names=['id', 'name', 'model', 'domain', '_delete'])\n        result = {}\n        for search in searches:\n            result.setdefault(search['model'], []).append((\n                    search['id'],\n                    search['name'],\n                    decoder.decode(search['domain']),\n                    search['_delete']))\n        return result\n"
  },
  {
    "path": "trytond/ir/ui/view.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n\n        <record model=\"ir.action.wizard\" id=\"act_view_show\">\n            <field name=\"name\">Show View</field>\n            <field name=\"wiz_name\">ir.ui.view.show</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"view_view_form\">\n            <field name=\"model\">ir.ui.view</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">ui_view_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"view_view_tree\">\n            <field name=\"model\">ir.ui.view</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">ui_view_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_view_form\">\n            <field name=\"name\">Views</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">ir.ui.view</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_view_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"view_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_view_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_view_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"view_view_form\"/>\n            <field name=\"act_window\" ref=\"act_view_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_ui\"\n            action=\"act_view_form\"\n            sequence=\"10\"\n            id=\"menu_view\"/>\n        <record model=\"ir.model.button\" id=\"view_show_button\">\n            <field name=\"name\">show</field>\n            <field name=\"string\">Show</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.ui.view')]\"/>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"view_tree_width_view_form\">\n            <field name=\"model\">ir.ui.view_tree_width</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">ui_view_tree_width_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"view_tree_width_view_tree\">\n            <field name=\"model\">ir.ui.view_tree_width</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">ui_view_tree_width_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_view_tree_width_form\">\n            <field name=\"name\">View Tree Width</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">ir.ui.view_tree_width</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_view_tree_width_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"view_tree_width_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_view_tree_width_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_view_tree_width_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"view_tree_width_view_form\"/>\n            <field name=\"act_window\" ref=\"act_view_tree_width_form\"/>\n        </record>\n        <menuitem\n            parent=\"menu_ui\"\n            action=\"act_view_tree_width_form\"\n            sequence=\"50\"\n            id=\"menu_view_tree_width\"/>\n\n        <record model=\"ir.ui.view\" id=\"view_tree_optional_view_form\">\n            <field name=\"model\">ir.ui.view_tree_optional</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">ui_view_tree_optional_form</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"view_tree_optional_view_tree\">\n            <field name=\"model\">ir.ui.view_tree_optional</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">ui_view_tree_optional_list</field>\n        </record>\n\n        <record model=\"ir.action.act_window\" id=\"act_view_tree_optional_form\">\n            <field name=\"name\">View Tree Optional</field>\n            <field name=\"res_model\">ir.ui.view_tree_optional</field>\n        </record>\n        <record model=\"ir.action.act_window.view\" id=\"act_view_tree_optional_form_view1\">\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"view\" ref=\"view_tree_optional_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_view_tree_optional_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\" id=\"act_view_tree_optional_form_view2\">\n            <field name=\"sequence\" eval=\"20\"/>\n            <field name=\"view\" ref=\"view_tree_optional_view_form\"/>\n            <field name=\"act_window\" ref=\"act_view_tree_optional_form\"/>\n        </record>\n\n        <menuitem\n            parent=\"menu_ui\"\n            action=\"act_view_tree_optional_form\"\n            sequence=\"50\"\n            id=\"menu_view_tree_optional\"/>\n\n        <record model=\"ir.ui.view\" id=\"view_tree_state_form\">\n            <field name=\"model\">ir.ui.view_tree_state</field> \n            <field name=\"type\">form</field>\n            <field name=\"name\">ui_view_tree_state_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"view_tree_state_tree\">\n            <field name=\"model\">ir.ui.view_tree_state</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">ui_view_tree_state_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_view_tree_state\">\n            <field name=\"name\">Tree State</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">ir.ui.view_tree_state</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_view_tree_state_tree\">\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"view\" ref=\"view_tree_state_tree\"/>\n            <field name=\"act_window\" ref=\"act_view_tree_state\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_view_tree_state_form\">\n            <field name=\"sequence\" eval=\"20\"/>\n            <field name=\"view\" ref=\"view_tree_state_form\"/>\n            <field name=\"act_window\" ref=\"act_view_tree_state\"/>\n        </record>\n        <menuitem\n            parent=\"menu_ui\"\n            action=\"act_view_tree_state\"\n            sequence=\"50\"\n            id=\"menu_view_tree_state\"/>\n\n        <record model=\"ir.ui.view\" id=\"view_search_form\">\n            <field name=\"model\">ir.ui.view_search</field> \n            <field name=\"type\">form</field>\n            <field name=\"name\">ui_view_search_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"view_search_tree\">\n            <field name=\"model\">ir.ui.view_search</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">ui_view_search_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_view_search\">\n            <field name=\"name\">View Search</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">ir.ui.view_search</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_view_search_tree\">\n            <field name=\"sequence\" eval=\"10\"/>\n            <field name=\"view\" ref=\"view_search_tree\"/>\n            <field name=\"act_window\" ref=\"act_view_search\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_view_search_form\">\n            <field name=\"sequence\" eval=\"20\"/>\n            <field name=\"view\" ref=\"view_search_form\"/>\n            <field name=\"act_window\" ref=\"act_view_search\"/>\n        </record>\n        <menuitem\n            parent=\"menu_ui\"\n            action=\"act_view_search\"\n            sequence=\"50\"\n            id=\"menu_view_search\"/>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/ir/view/action_act_window_domain_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"6\">\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <label name=\"sequence\"/>\n    <field name=\"sequence\"/>\n    <label name=\"active\"/>\n    <field name=\"active\"/>\n    <label name=\"count\"/>\n    <field name=\"count\"/>\n    <label name=\"act_window\"/>\n    <field name=\"act_window\"/>\n    <newline/>\n    <label name=\"domain\"/>\n    <field name=\"domain\" colspan=\"5\" widget=\"pyson\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/action_act_window_domain_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"act_window\"/>\n    <field name=\"name\"/>\n    <field name=\"domain\"/>\n    <field name=\"count\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/action_act_window_domain_list2.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree sequence=\"sequence\">\n    <field name=\"sequence\" tree_invisible=\"1\"/>\n    <field name=\"name\" expand=\"1\"/>\n    <field name=\"count\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/action_act_window_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <label name=\"active\"/>\n    <field name=\"active\" xexpand=\"0\" width=\"100\"/>\n    <notebook colspan=\"4\">\n        <page string=\"General\" id=\"general\">\n            <label name=\"res_model\"/>\n            <field name=\"res_model\"/>\n            <label name=\"context_model\"/>\n            <field name=\"context_model\"/>\n            <label name=\"usage\"/>\n            <field name=\"usage\"/>\n            <label name=\"icon\"/>\n            <field name=\"icon\"/>\n            <field name=\"act_window_views\" colspan=\"4\"\n                view_ids=\"ir.act_window_view_view_list2\"/>\n            <field name=\"act_window_domains\" colspan=\"4\"\n                view_ids=\"ir.act_window_domain_view_list2\"/>\n            <label name=\"domain\"/>\n            <field name=\"domain\" colspan=\"3\" widget=\"pyson\"/>\n            <label name=\"context_domain\"/>\n            <field name=\"context_domain\" colspan=\"3\" widget=\"pyson\"/>\n            <label name=\"context\"/>\n            <field name=\"context\" colspan=\"3\" widget=\"pyson\"/>\n            <label name=\"order\"/>\n            <field name=\"order\" colspan=\"3\"/>\n            <label name=\"search_value\"/>\n            <field name=\"search_value\" colspan=\"3\" widget=\"pyson\"/>\n            <label name=\"limit\"/>\n            <field name=\"limit\"/>\n        </page>\n        <page name=\"keywords\">\n            <field name=\"keywords\" colspan=\"4\"/>\n        </page>\n        <page name=\"groups\">\n            <field name=\"groups\" colspan=\"4\"/>\n        </page>\n    </notebook>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/action_act_window_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"name\" expand=\"2\"/>\n    <field name=\"res_model\" expand=\"1\"/>\n    <field name=\"domain\" expand=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/action_act_window_view_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"act_window\"/>\n    <field name=\"act_window\" colspan=\"3\"/>\n    <label name=\"sequence\"/>\n    <field name=\"sequence\"/>\n    <label name=\"active\"/>\n    <field name=\"active\"/>\n    <label name=\"view\"/>\n    <field name=\"view\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/action_act_window_view_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"act_window\"/>\n    <field name=\"sequence\"/>\n    <field name=\"view\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/action_act_window_view_list2.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree sequence=\"sequence\">\n    <field name=\"sequence\" tree_invisible=\"1\"/>\n    <field name=\"view\" expand=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/action_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <label name=\"active\"/>\n    <field name=\"active\" xexpand=\"0\" width=\"100\"/>\n    <notebook colspan=\"4\">\n        <page string=\"General\" id=\"general\">\n            <label name=\"records\"/>\n            <field name=\"records\"/>\n            <label name=\"usage\"/>\n            <field name=\"usage\"/>\n            <label name=\"icon\"/>\n            <field name=\"icon\"/>\n        </page>\n        <page name=\"keywords\">\n            <field name=\"keywords\" colspan=\"4\"/>\n        </page>\n        <page name=\"groups\">\n            <field name=\"groups\" colspan=\"4\"/>\n        </page>\n    </notebook>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/action_keyword_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"action\"/>\n    <field name=\"action\"/>\n    <newline/>\n    <label name=\"model\"/>\n    <field name=\"model\"/>\n    <label name=\"keyword\"/>\n    <field name=\"keyword\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/action_keyword_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"action\" expand=\"2\"/>\n    <field name=\"model\" expand=\"1\"/>\n    <field name=\"keyword\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/action_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"name\" expand=\"2\"/>\n    <field name=\"type\" expand=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/action_report_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <group id=\"checkboxes\" colspan=\"2\" col=\"-1\">\n        <label name=\"active\"/>\n        <field name=\"active\" xexpand=\"0\" width=\"25\"/>\n        <label name=\"translatable\"/>\n        <field name=\"translatable\" xexpand=\"0\" width=\"25\"/>\n        <label name=\"single\"/>\n        <field name=\"single\" xexpand=\"0\" width=\"25\"/>\n        <label name=\"direct_print\"/>\n        <field name=\"direct_print\" xexpand=\"0\" width=\"25\"/>\n    </group>\n    <notebook colspan=\"4\">\n        <page string=\"General\" id=\"general\">\n            <label name=\"model\"/>\n            <field name=\"model\"/>\n            <label name=\"report_name\"/>\n            <field name=\"report_name\"/>\n            <label name=\"icon\"/>\n            <field name=\"icon\"/>\n            <label name=\"record_name\"/>\n            <field name=\"record_name\"/>\n            <label name=\"report_content\"/>\n            <group col=\"-1\" id=\"report_content\">\n                <field name=\"report_content\" xexpand=\"0\"/>\n                <field name=\"report_content_html\" string=\"Edit\" widget=\"html\" xexpand=\"0\"/>\n            </group>\n            <label name=\"report\"/>\n            <field name=\"report\"/>\n            <label name=\"template_extension\"/>\n            <field name=\"template_extension\"/>\n            <label name=\"extension\"/>\n            <field name=\"extension\"/>\n        </page>\n        <page name=\"keywords\">\n            <field name=\"keywords\" colspan=\"4\"/>\n        </page>\n        <page name=\"groups\">\n            <field name=\"groups\" colspan=\"4\"/>\n        </page>\n    </notebook>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/action_report_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"name\" expand=\"2\"/>\n    <field name=\"type\" expand=\"1\"/>\n    <field name=\"model\" expand=\"1\"/>\n    <field name=\"report_name\" expand=\"1\"/>\n</tree>\n\n"
  },
  {
    "path": "trytond/ir/view/action_url_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <label name=\"active\"/>\n    <field name=\"active\" xexpand=\"0\" width=\"100\"/>\n    <notebook colspan=\"4\">\n        <page string=\"General\" id=\"general\">\n            <label name=\"url\"/>\n            <field name=\"url\"/>\n            <label name=\"icon\"/>\n            <field name=\"icon\"/>\n        </page>\n        <page name=\"keywords\">\n            <field name=\"keywords\" colspan=\"4\"/>\n        </page>\n        <page name=\"groups\">\n            <field name=\"groups\" colspan=\"4\"/>\n        </page>\n    </notebook>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/action_url_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"name\" expand=\"2\"/>\n    <field name=\"type\" expand=\"1\"/>\n    <field name=\"url\" expand=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/action_wizard_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <label name=\"active\"/>\n    <field name=\"active\" xexpand=\"0\" width=\"100\"/>\n    <notebook colspan=\"4\">\n        <page string=\"General\" id=\"general\">\n            <label name=\"wiz_name\"/>\n            <field name=\"wiz_name\"/>\n            <label name=\"model\"/>\n            <field name=\"model\"/>\n            <label name=\"icon\"/>\n            <field name=\"icon\"/>\n            <newline/>\n            <label name=\"window\"/>\n            <field name=\"window\"/>\n        </page>\n        <page name=\"keywords\">\n            <field name=\"keywords\" colspan=\"4\"/>\n        </page>\n        <page name=\"groups\">\n            <field name=\"groups\" colspan=\"4\"/>\n        </page>\n    </notebook>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/action_wizard_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"name\" expand=\"2\"/>\n    <field name=\"type\" expand=\"1\"/>\n    <field name=\"wiz_name\" expand=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/attachment_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"2\">\n    <label name=\"resource\"/>\n    <field name=\"resource\"/>\n    <label name=\"name\"/>\n    <group id=\"name_data\" col=\"1\" colspan=\"1\">\n        <field name=\"data\" filename_visible=\"1\"/>\n        <group name=\"link\" string=\"\">\n            <field name=\"name\"/>\n        </group>\n    </group>\n    <label name=\"type\"/>\n    <field name=\"type\"/>\n    <label name=\"link\"/>\n    <field name=\"link\" widget=\"url\"/>\n    <label name=\"copy_to_resources\"/>\n    <field name=\"copy_to_resources\" yexpand=\"0\"/>\n    <notebook>\n        <page string=\"Document\" name=\"data\" col=\"1\">\n            <field name=\"data\" widget=\"document\"/>\n        </page>\n        <page name=\"description\" col=\"1\">\n            <field name=\"description\"/>\n        </page>\n    </notebook>\n    <group id=\"last\" col=\"4\" colspan=\"2\">\n        <label name=\"last_user\"/>\n        <field name=\"last_user\"/>\n        <label name=\"last_modification\"/>\n        <field name=\"last_modification\"/>\n    </group>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/attachment_form_preview.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"1\">\n    <field name=\"data\" widget=\"document\" readonly=\"1\"/>\n    <label name=\"name\" string=\"\" xalign=\"0.5\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/attachment_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree editable=\"1\">\n    <field name=\"resource\" expand=\"2\"/>\n    <field name=\"name\" expand=\"2\"/>\n    <field name=\"summary\" expand=\"1\" optional=\"1\"/>\n    <field name=\"last_user\" expand=\"1\" optional=\"1\"/>\n    <field name=\"last_modification\" widget=\"date\" optional=\"1\"/>\n    <field name=\"last_modification\" widget=\"time\" optional=\"1\"\n        string=\"Last Modification Time\"/>\n    <field name=\"type\" optional=\"1\"/>\n    <field name=\"data\"/>\n    <field name=\"link\" widget=\"url\" expand=\"1\"/>\n    <!-- To allow client to set description field -->\n    <field name=\"description\" tree_invisible=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/cron_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"method\"/>\n    <field name=\"method\"/>\n    <label name=\"active\"/>\n    <field name=\"active\"/>\n    <label id=\"interval_label\" string=\"Every\"/>\n    <group id=\"interval\" col=\"-1\" colspan=\"3\">\n        <field name=\"interval_number\"/>\n        <field name=\"interval_type\"/>\n    </group>\n    <label id=\"time_label\" string=\"At\"/>\n    <group id=\"time\" col=\"-1\" colspan=\"3\">\n        <label name=\"weekday\"/>\n        <field name=\"weekday\" xexpand=\"0\" widget=\"selection\"/>\n        <label name=\"day\"/>\n        <field name=\"day\" xexpand=\"0\"/>\n        <label name=\"hour\"/>\n        <field name=\"hour\" xexpand=\"0\"/>\n        <label name=\"minute\"/>\n        <field name=\"minute\" xexpand=\"0\"/>\n        <label name=\"timezone\"/>\n        <field name=\"timezone\"/>\n    </group>\n    <label name=\"next_call\"/>\n    <field name=\"next_call\"/>\n    <button name=\"run_once\" colspan=\"2\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/cron_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"method\" expand=\"1\"/>\n    <field name=\"next_call\" widget=\"date\" string=\"Next Call Date\" optional=\"1\"/>\n    <field name=\"next_call\" widget=\"time\" string=\"Next Call Time\" optional=\"1\"/>\n    <field name=\"interval_number\"/>\n    <field name=\"interval_type\"/>\n    <button name=\"run_once\" string=\"Run Once\" tree_invisible=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/email_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"user\"/>\n    <field name=\"user\"/>\n    <label name=\"at\"/>\n    <field name=\"at\"/>\n    <label name=\"recipients\"/>\n    <field name=\"recipients\" colspan=\"3\"/>\n    <label name=\"recipients_secondary\"/>\n    <field name=\"recipients_secondary\" colspan=\"3\"/>\n    <label name=\"recipients_hidden\"/>\n    <field name=\"recipients_hidden\" colspan=\"3\"/>\n    <label name=\"subject\"/>\n    <field name=\"subject\" colspan=\"3\"/>\n    <separator name=\"body\" colspan=\"4\"/>\n    <field name=\"body\" colspan=\"4\" widget=\"richtext\" toolbar=\"0\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/email_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"resource\" expand=\"2\"/>\n    <field name=\"user\"/>\n    <field name=\"at\" widget=\"date\"/>\n    <field name=\"at\" widget=\"time\"/>\n    <field name=\"recipients\" expand=\"1\"/>\n    <field name=\"recipients_secondary\" expand=\"1\"/>\n    <field name=\"recipients_hidden\" expand=\"1\"/>\n    <field name=\"subject\" expand=\"2\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/email_template_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <label name=\"model\"/>\n    <field name=\"model\"/>\n    <label id=\"recipients_label\" string=\"Recipients:\"/>\n    <group id=\"recipients\" col=\"-1\" colspan=\"3\">\n        <field name=\"recipients\"/>\n        <field name=\"recipients_pyson\" widget=\"pyson\"/>\n    </group>\n    <label id=\"recipients_secondary_label\" string=\"Secondary Recipients:\"/>\n    <group id=\"recipients_secondary\" col=\"-1\" colspan=\"3\">\n        <field name=\"recipients_secondary\"/>\n        <field name=\"recipients_secondary_pyson\" widget=\"pyson\"/>\n    </group>\n    <label id=\"recipients_hidden_label\" string=\"Hidden Recipients:\"/>\n    <group id=\"recipients_hidden\" col=\"-1\" colspan=\"3\">\n        <field name=\"recipients_hidden\"/>\n        <field name=\"recipients_hidden_pyson\" widget=\"pyson\"/>\n    </group>\n    <label name=\"subject\"/>\n    <field name=\"subject\" colspan=\"3\"/>\n    <separator name=\"body\" colspan=\"4\"/>\n    <field name=\"body\" colspan=\"4\" widget=\"richtext\"/>\n    <field name=\"reports\" colspan=\"4\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/email_template_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"model\" expand=\"1\"/>\n    <field name=\"name\" expand=\"2\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/error_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"origin\"/>\n    <field name=\"rec_name\" colspan=\"3\"/>\n\n    <separator name=\"message\" colspan=\"4\"/>\n    <field name=\"message\" colspan=\"4\"/>\n\n    <separator name=\"description\" colspan=\"4\"/>\n    <field name=\"description\" colspan=\"4\"/>\n\n    <label name=\"state\"/>\n    <field name=\"state\"/>\n    <group col=\"-1\" colspan=\"2\" id=\"buttons\">\n        <button name=\"open\" icon=\"tryton-back\"/>\n        <button name=\"process\" icon=\"tryton-forward\"/>\n        <button name=\"solve\" icon=\"tryton-close\"/>\n    </group>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/error_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"rec_name\" string=\"Origin\" expand=\"1\"/>\n    <field name=\"summary\" expand=\"2\"/>\n    <field name=\"state\"/>\n    <button name=\"open\"/>\n    <button name=\"process\"/>\n    <button name=\"solve\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/export_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"name\"/>\n    <field name=\"name\" colspan=\"3\"/>\n    <label name=\"resource\"/>\n    <field name=\"resource\"/>\n    <label name=\"header\"/>\n    <field name=\"header\"/>\n    <field name=\"export_fields\" colspan=\"4\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/export_line_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"2\">\n    <label name=\"export\"/>\n    <field name=\"export\"/>\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/export_line_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"export\" expand=\"1\"/>\n    <field name=\"name\" expand=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/export_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"name\" expand=\"1\"/>\n    <field name=\"resource\" expand=\"1\"/>\n    <field name=\"create_uid\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/icon_view_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <image name=\"name\" xexpand=\"0\"/>\n    <group id=\"form\">\n        <label name=\"name\"/>\n        <field name=\"name\"/>\n        <label name=\"sequence\"/>\n        <field name=\"sequence\"/>\n        <label name=\"module\"/>\n        <field name=\"module\"/>\n        <label name=\"path\"/>\n        <field name=\"path\"/>\n    </group>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/icon_view_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree sequence=\"sequence\">\n    <field name=\"name\" icon=\"name\" expand=\"2\"/>\n    <field name=\"module\" optional=\"0\"/>\n    <field name=\"path\" expand=\"1\" optional=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/lang_config_start_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"2\">\n    <image name=\"tryton-info\" xexpand=\"0\" xfill=\"0\"/>\n    <label string=\"You can now load additional translations to the system.\"\n        id=\"load\" yalign=\"0.0\" xalign=\"0.0\" xexpand=\"1\"/>\n    <field name=\"languages\" colspan=\"2\" widget=\"multiselection\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/lang_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"6\">\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <label name=\"code\"/>\n    <field name=\"code\"/>\n    <label name=\"active\"/>\n    <field name=\"active\"/>\n    <label name=\"direction\"/>\n    <field name=\"direction\"/>\n    <label name=\"translatable\"/>\n    <field name=\"translatable\"/>\n    <label name=\"parent\"/>\n    <field name=\"parent\"/>\n    <separator string=\"Date Formatting\" colspan=\"6\" id=\"date\"/>\n    <label name=\"date\"/>\n    <field name=\"date\"/>\n    <label name=\"am\"/>\n    <field name=\"am\"/>\n    <label name=\"pm\"/>\n    <field name=\"pm\"/>\n    <separator string=\"Numbers Formatting\" colspan=\"6\" id=\"number\"/>\n    <label name=\"grouping\"/>\n    <field name=\"grouping\"/>\n    <label name=\"thousands_sep\"/>\n    <field name=\"thousands_sep\"/>\n    <label name=\"decimal_point\"/>\n    <field name=\"decimal_point\"/>\n    <separator string=\"Monetary Formatting\" colspan=\"6\" id=\"monetary\"/>\n    <label name=\"mon_grouping\"/>\n    <field name=\"mon_grouping\"/>\n    <label name=\"mon_thousands_sep\"/>\n    <field name=\"mon_thousands_sep\"/>\n    <label name=\"mon_decimal_point\"/>\n    <field name=\"mon_decimal_point\"/>\n    <newline/>\n    <label name=\"positive_sign\"/>\n    <field name=\"positive_sign\"/>\n    <label name=\"negative_sign\"/>\n    <field name=\"negative_sign\"/>\n    <newline/>\n    <label name=\"p_sign_posn\"/>\n    <field name=\"p_sign_posn\"/>\n    <label name=\"n_sign_posn\"/>\n    <field name=\"n_sign_posn\"/>\n    <newline/>\n    <label name=\"p_cs_precedes\"/>\n    <field name=\"p_cs_precedes\"/>\n    <label name=\"n_cs_precedes\"/>\n    <field name=\"n_cs_precedes\"/>\n    <newline/>\n    <label name=\"p_sep_by_space\"/>\n    <field name=\"p_sep_by_space\"/>\n    <label name=\"n_sep_by_space\"/>\n    <field name=\"n_sep_by_space\"/>\n    <group id=\"buttons\" colspan=\"6\" col=\"-1\">\n        <button name=\"load_translations\" icon=\"tryton-launch\"/>\n        <button name=\"unload_translations\" icon=\"tryton-launch\"/>\n    </group>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/lang_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"name\" expand=\"1\"/>\n    <field name=\"code\" optional=\"1\"/>\n    <field name=\"direction\" optional=\"1\"/>\n    <field name=\"translatable\"/>\n    <button name=\"load_translations\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/message_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"1\">\n    <field name=\"text\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/message_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"text\" expand=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/model_access_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"6\">\n    <label name=\"model\"/>\n    <field name=\"model\"/>\n    <label name=\"group\"/>\n    <field name=\"group\"/>\n    <label name=\"active\"/>\n    <field name=\"active\"/>\n    <group id=\"checkboxes\" colspan=\"6\">\n        <label name=\"perm_read\"/>\n        <field name=\"perm_read\"/>\n        <label name=\"perm_write\"/>\n        <field name=\"perm_write\"/>\n        <label name=\"perm_create\"/>\n        <field name=\"perm_create\"/>\n        <label name=\"perm_delete\"/>\n        <field name=\"perm_delete\"/>\n    </group>\n    <separator name=\"description\" colspan=\"6\"/>\n    <field name=\"description\" colspan=\"6\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/model_access_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"perm_read\"/>\n    <field name=\"perm_write\"/>\n    <field name=\"perm_create\"/>\n    <field name=\"perm_delete\"/>\n    <field name=\"model\" expand=\"1\"/>\n    <field name=\"group\" expand=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/model_button_click_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"button\"/>\n    <field name=\"button\"/>\n    <label name=\"active\"/>\n    <field name=\"active\"/>\n    <label name=\"record_id\"/>\n    <field name=\"record_id\"/>\n    <label name=\"user\"/>\n    <field name=\"user\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/model_button_click_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"button\" expand=\"2\"/>\n    <field name=\"record_id\" expand=\"1\"/>\n    <field name=\"user\" expand=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/model_button_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"model\"/>\n    <field name=\"model\"/>\n    <label name=\"active\"/>\n    <field name=\"active\"/>\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <label name=\"string\"/>\n    <field name=\"string\"/>\n    <separator name=\"help\" colspan=\"4\"/>\n    <field name=\"help\" colspan=\"4\"/>\n    <separator name=\"confirm\" colspan=\"4\"/>\n    <field name=\"confirm\" colspan=\"4\"/>\n    <field name=\"groups\" colspan=\"4\"/>\n    <field name=\"rules\" colspan=\"2\"/>\n    <field name=\"reset_by\" colspan=\"2\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/model_button_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"model\" expand=\"1\"/>\n    <field name=\"name\" expand=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/model_button_rule_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"button\"/>\n    <field name=\"button\"/>\n    <newline/>\n    <label name=\"description\"/>\n    <field name=\"description\" colspan=\"3\"/>\n    <label name=\"number_user\"/>\n    <field name=\"number_user\"/>\n    <label name=\"group\"/>\n    <field name=\"group\"/>\n    <label name=\"condition\"/>\n    <field name=\"condition\" colspan=\"3\" widget=\"pyson\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/model_button_rule_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"button\" expand=\"2\"/>\n    <field name=\"description\" expand=\"1\"/>\n    <field name=\"number_user\"/>\n    <field name=\"group\" expand=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/model_data_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"module\"/>\n    <field name=\"module\"/>\n    <label name=\"model\"/>\n    <field name=\"model\"/>\n    <label name=\"fs_id\"/>\n    <field name=\"fs_id\"/>\n    <label name=\"db_id\"/>\n    <field name=\"db_id\"/>\n    <label name=\"noupdate\"/>\n    <field name=\"noupdate\"/>\n    <newline/>\n    <label name=\"out_of_sync\"/>\n    <field name=\"out_of_sync\"/>\n    <button name=\"sync\" colspan=\"2\"/>\n    <group id=\"values\" colspan=\"2\" yexpand=\"1\" yfill=\"1\" col=\"1\">\n        <separator name=\"values\"/>\n        <field name=\"values\"/>\n    </group>\n    <group id=\"fs_values\" colspan=\"2\" yexpand=\"1\" yfill=\"1\" col=\"1\">\n        <separator name=\"fs_values\"/>\n        <field name=\"fs_values\"/>\n    </group>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/model_data_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"module\" optional=\"0\"/>\n    <field name=\"model\" expand=\"1\"/>\n    <field name=\"fs_id\" expand=\"1\"/>\n    <field name=\"db_id\" optional=\"1\"/>\n    <field name=\"noupdate\"/>\n    <field name=\"out_of_sync\"/>\n    <button name=\"sync\"/>\n</tree>\n\n"
  },
  {
    "path": "trytond/ir/view/model_field_access_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"6\">\n    <label name=\"field\"/>\n    <field name=\"field\"/>\n    <label name=\"group\"/>\n    <field name=\"group\"/>\n    <label name=\"active\"/>\n    <field name=\"active\"/>\n    <group id=\"checkboxes\" colspan=\"6\">\n        <label name=\"perm_read\"/>\n        <field name=\"perm_read\"/>\n        <label name=\"perm_write\"/>\n        <field name=\"perm_write\"/>\n        <label name=\"perm_create\"/>\n        <field name=\"perm_create\"/>\n        <label name=\"perm_delete\"/>\n        <field name=\"perm_delete\"/>\n    </group>\n    <separator name=\"description\" colspan=\"6\"/>\n    <field name=\"description\" colspan=\"6\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/model_field_access_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"perm_read\"/>\n    <field name=\"perm_write\"/>\n    <field name=\"perm_create\"/>\n    <field name=\"perm_delete\"/>\n    <field name=\"field\" expand=\"1\"/>\n    <field name=\"group\" expand=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/model_field_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <label name=\"model\"/>\n    <field name=\"model\" readonly=\"1\"/>\n    <label name=\"ttype\"/>\n    <field name=\"ttype\"/>\n    <label name=\"relation\"/>\n    <field name=\"relation\"/>\n    <label name=\"field_description\"/>\n    <field name=\"field_description\" colspan=\"3\"/>\n    <label name=\"help\" yfill=\"1\"/>\n    <field name=\"help\" colspan=\"3\"/>\n    <label name=\"access\"/>\n    <field name=\"access\"/>\n    <label name=\"module\"/>\n    <field name=\"module\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/model_field_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"name\" expand=\"2\"/>\n    <field name=\"model\" expand=\"1\"/>\n    <field name=\"ttype\" optional=\"0\"/>\n    <field name=\"relation\" expand=\"1\" optional=\"1\"/>\n    <field name=\"field_description\" expand=\"1\" optional=\"0\"/>\n    <field name=\"access\" optional=\"1\"/>\n    <field name=\"module\" optional=\"0\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/model_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"6\">\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <label name=\"model\"/>\n    <field name=\"model\"/>\n    <label name=\"module\"/>\n    <field name=\"module\"/>\n    <label name=\"global_search_p\"/>\n    <field name=\"global_search_p\"/>\n    <separator name=\"info\" colspan=\"6\"/>\n    <field name=\"info\" colspan=\"6\"/>\n    <field name=\"fields\" colspan=\"6\" readonly=\"1\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/model_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"name\" expand=\"2\"/>\n    <field name=\"model\" expand=\"1\"/>\n    <field name=\"info\" expand=\"1\" optional=\"1\"/>\n    <field name=\"global_search_p\"/>\n    <field name=\"module\" optional=\"0\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/model_print_model_graph_start_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"2\">\n    <label name=\"level\"/>\n    <field name=\"level\"/>\n    <label name=\"filter\"/>\n    <field name=\"filter\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/module_activate_upgrade_done_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"2\">\n    <image name=\"tryton-info\" xexpand=\"0\" xfill=\"0\"/>\n    <label string=\"The modules have been upgraded / activated.\"\n        id=\"modules\"\n        yalign=\"0.0\" xalign=\"0.0\" xexpand=\"1\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/module_activate_upgrade_start_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"2\">\n    <image name=\"tryton-info\" xexpand=\"0\" xfill=\"0\"/>\n    <group col=\"1\" id=\"labels\">\n        <label string=\"Your system will be upgraded.\" id=\"upgraded\"\n            yalign=\"0.0\" xalign=\"0.0\" xexpand=\"1\"/>\n        <label string=\"Note that this operation may take a few minutes.\"\n            id=\"operation\"\n            yalign=\"0.0\" xalign=\"0.0\" xexpand=\"1\"/>\n    </group>\n    <separator name=\"module_info\" colspan=\"2\"/>\n    <field name=\"module_info\" colspan=\"2\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/module_config_start_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"2\">\n    <image name=\"tryton-info\" xexpand=\"0\" xfill=\"0\"/>\n    <label string=\"You can now activate additional modules to the system.\"\n        id=\"activate\" yalign=\"0.0\" xalign=\"0.0\" xexpand=\"1\"/>\n    <field name=\"modules\" colspan=\"2\" widget=\"multiselection\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/module_config_wizard_done_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"2\">\n    <image name=\"tryton-info\" xexpand=\"0\" xfill=\"0\"/>\n    <label string=\"The configuration is done.\" id=\"done\"\n        yalign=\"0.0\" xalign=\"0.0\" xexpand=\"1\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/module_config_wizard_first_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"2\">\n    <image name=\"tryton-info\" xexpand=\"0\" xfill=\"0\"/>\n    <label string=\"You will be able to configure your installation depending on the modules you have installed.\"\n        id=\"configure\"\n        yalign=\"0.0\" xalign=\"0.0\" xexpand=\"1\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/module_config_wizard_item_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree editable=\"1\">\n    <field name=\"action\" expand=\"1\"/>\n    <field name=\"sequence\" optional=\"1\"/>\n    <field name=\"state\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/module_config_wizard_other_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"2\">\n    <image name=\"tryton-info\" xexpand=\"0\" xfill=\"0\"/>\n    <field name=\"percentage\" widget=\"progressbar\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/module_dependency_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"module\"/>\n    <field name=\"module\"/>\n    <newline/>\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <label name=\"state\"/>\n    <field name=\"state\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/module_dependency_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"module\"/>\n    <field name=\"name\" expand=\"1\"/>\n    <field name=\"state\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/module_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form on_write=\"on_write\">\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <label name=\"version\"/>\n    <field name=\"version\"/>\n    <field name=\"dependencies\" colspan=\"4\"/>\n    <label name=\"state\"/>\n    <field name=\"state\" readonly=\"1\"/>\n    <group col=\"-1\" colspan=\"2\" id=\"button\">\n        <button string=\"Mark for Upgrade\" name=\"upgrade\"/>\n        <button string=\"Mark for Deactivation (beta)\" name=\"deactivate\"/>\n        <button string=\"Mark for Activation\" name=\"activate\"/>\n        <button string=\"Cancel Activation\" name=\"activate_cancel\"/>\n        <button string=\"Cancel Upgrade\" name=\"upgrade_cancel\"/>\n        <button string=\"Cancel Deactivation\" name=\"deactivate_cancel\"/>\n    </group>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/module_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree on_write=\"on_write\">\n    <field name=\"name\" expand=\"1\"/>\n    <field name=\"version\" optional=\"1\"/>\n    <field name=\"state\"/>\n    <button string=\"Mark for Upgrade\" name=\"upgrade\"/>\n    <button string=\"Mark for Activation\" name=\"activate\"/>\n    <button string=\"Cancel Activation\" name=\"activate_cancel\"/>\n    <button string=\"Cancel Upgrade\" name=\"upgrade_cancel\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/note_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"resource\"/>\n    <field name=\"resource\"/>\n    <label name=\"unread\"/>\n    <field name=\"unread\"/>\n    <label name=\"last_user\"/>\n    <field name=\"last_user\"/>\n    <label name=\"last_modification\"/>\n    <field name=\"last_modification\"/>\n    <label name=\"copy_to_resources\"/>\n    <field name=\"copy_to_resources\" yexpand=\"0\"/>\n    <field name=\"message\" colspan=\"4\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/note_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"unread\"/>\n    <field name=\"resource\" expand=\"1\"/>\n    <field name=\"last_user\" string=\"User\" expand=\"1\" optional=\"1\"/>\n    <field name=\"last_modification\" widget=\"date\" string=\"Date\" optional=\"1\"/>\n    <field name=\"last_modification\" widget=\"time\" string=\"Time\" optional=\"1\"/>\n    <field name=\"message_wrapped\" expand=\"2\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/rule_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"rule_group\"/>\n    <field name=\"rule_group\"/>\n    <newline/>\n    <label name=\"domain\"/>\n    <field name=\"domain\" colspan=\"3\" widget=\"pyson\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/rule_group_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"6\">\n    <label name=\"model\"/>\n    <field name=\"model\"/>\n    <label name=\"global_p\"/>\n    <field name=\"global_p\"/>\n    <label name=\"default_p\"/>\n    <field name=\"default_p\"/>\n    <group col=\"4\" colspan=\"6\" id=\"perm\">\n        <label name=\"perm_read\"/>\n        <field name=\"perm_read\"/>\n        <label name=\"perm_write\"/>\n        <field name=\"perm_write\"/>\n        <label name=\"perm_create\"/>\n        <field name=\"perm_create\"/>\n        <label name=\"perm_delete\"/>\n        <field name=\"perm_delete\"/>\n    </group>\n    <label name=\"name\"/>\n    <field name=\"name\" colspan=\"5\"/>\n    <field name=\"rules\" colspan=\"6\"/>\n    <label string=\"The rule is satisfied if at least one test is True.\"\n        colspan=\"6\" xalign=\"0.0\" id=\"satisfied\"/>\n    <label string=\"If there is no test defined, the rule is always satisfied if not global.\"\n        colspan=\"6\" xalign=\"0.0\" id=\"no_test\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/rule_group_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"perm_read\"/>\n    <field name=\"perm_write\"/>\n    <field name=\"perm_create\"/>\n    <field name=\"perm_delete\"/>\n    <field name=\"model\" expand=\"1\"/>\n    <field name=\"name\" expand=\"1\"/>\n    <field name=\"global_p\"/>\n    <field name=\"default_p\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/rule_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"rule_group\"/>\n    <field name=\"domain\" expand=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/sequence_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"name\"/>\n    <field name=\"name\" colspan=\"3\"/>\n    <label name=\"sequence_type\"/>\n    <field name=\"sequence_type\" widget=\"selection\"/>\n    <label name=\"active\"/>\n    <field name=\"active\"/>\n    <label name=\"prefix\"/>\n    <field name=\"prefix\"/>\n    <label name=\"suffix\"/>\n    <field name=\"suffix\"/>\n    <label name=\"type\"/>\n    <field name=\"type\"/>\n    <group string=\"Incremental\" id=\"incremental\" colspan=\"4\">\n        <label name=\"padding\"/>\n        <field name=\"padding\" />\n        <label name=\"number_increment\"/>\n        <field name=\"number_increment\"/>\n        <label name=\"number_next\"/>\n        <field name=\"number_next\"/>\n    </group>\n    <group string=\"Timestamp\" id=\"timestamp\" colspan=\"4\">\n        <label name=\"timestamp_rounding\"/>\n        <field name=\"timestamp_rounding\"/>\n        <label name=\"timestamp_offset\"/>\n        <field name=\"timestamp_offset\"/>\n        <label name=\"last_timestamp\"/>\n        <field name=\"last_timestamp\"/>\n    </group>\n    <separator string=\"Legend (Placeholders for prefix, suffix)\" colspan=\"4\"\n        id=\"legend\"/>\n    <label string=\"Year:\" id=\"label_year\"/>\n    <label string=\"${year}\" colspan=\"3\" xalign=\"0.0\" xexpand=\"1\" id=\"year\"/>\n    <label string=\"Month:\" id=\"label_month\"/>\n    <label string=\"${month}\" colspan=\"3\" xalign=\"0.0\" xexpand=\"1\" id=\"month\"/>\n    <label string=\"Day:\" id=\"label_day\"/>\n    <label string=\"${day}\" colspan=\"3\" xalign=\"0.0\" xexpand=\"1\" id=\"day\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/sequence_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"name\" expand=\"2\"/>\n    <field name=\"sequence_type\" expand=\"1\"/>\n    <field name=\"type\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/sequence_type_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/sequence_type_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"name\" expand=\"2\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/translation_clean_start_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"2\">\n    <image name=\"tryton-question\" xexpand=\"0\" xfill=\"0\"/>\n    <label string=\"Clean Translations?\" id=\"clean\"\n        yalign=\"0.0\" xalign=\"0.0\" xexpand=\"1\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/translation_clean_succeed_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <image name=\"tryton-info\" xexpand=\"0\" xfill=\"0\"/>\n    <label string=\"Translations cleaned successfully.\" id=\"succeed\" yalign=\"0.0\" xalign=\"0.0\" xexpand=\"1\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/translation_export_result_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"language\"/>\n    <field name=\"language\"/>\n    <label name=\"module\"/>\n    <field name=\"module\"/>\n    <label name=\"file\"/>\n    <field name=\"file\" colspan=\"3\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/translation_export_start_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"language\"/>\n    <field name=\"language\" widget=\"selection\"/>\n    <label name=\"module\"/>\n    <field name=\"module\" widget=\"selection\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/translation_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"6\">\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <label name=\"type\"/>\n    <field name=\"type\"/>\n    <label name=\"res_id\"/>\n    <field name=\"res_id\"/>\n    <label name=\"fuzzy\"/>\n    <field name=\"fuzzy\"/>\n    <label name=\"lang\"/>\n    <field name=\"lang\"/>\n    <label name=\"module\"/>\n    <field name=\"module\"/>\n    <label name=\"overriding_module\"/>\n    <field name=\"overriding_module\"/>\n    <group col=\"2\" colspan=\"6\" yexpand=\"1\" yfill=\"1\" id=\"src_value\">\n        <separator name=\"src\"/>\n        <separator name=\"value\"/>\n        <field name=\"src\"/>\n        <field name=\"value\"/>\n    </group>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/translation_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree editable=\"1\">\n    <field name=\"src\" widget=\"char\" expand=\"2\"/>\n    <field name=\"value\" widget=\"char\" expand=\"2\"/>\n    <field name=\"fuzzy\"/>\n    <field name=\"name\" expand=\"1\" optional=\"1\"/>\n    <field name=\"lang\"/>\n    <field name=\"type\" optional=\"1\"/>\n    <field name=\"res_id\" optional=\"1\"/>\n    <field name=\"module\" optional=\"0\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/translation_set_start_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"2\">\n    <image name=\"tryton-question\" xexpand=\"0\" xfill=\"0\"/>\n    <label string=\"Synchronize Translations?\" id=\"synchronize\"\n        yalign=\"0.0\" xalign=\"0.0\" xexpand=\"1\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/translation_set_succeed_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"2\">\n    <image name=\"tryton-info\" xexpand=\"0\" xfill=\"0\"/>\n    <label string=\"Translations set successfully.\" id=\"succeed\" yalign=\"0.0\" xalign=\"0.0\" xexpand=\"1\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/translation_update_start_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"language\"/>\n    <field name=\"language\" widget=\"selection\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/trigger_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"name\"/>\n    <field name=\"name\" colspan=\"3\"/>\n    <label name=\"model\"/>\n    <field name=\"model\"/>\n    <group colspan=\"2\" col=\"10\" id=\"checkboxes\">\n        <label name=\"active\"/>\n        <field name=\"active\" xexpand=\"0\"/>\n        <label name=\"on_time\"/>\n        <field name=\"on_time\" xexpand=\"0\"/>\n        <label name=\"on_create\"/>\n        <field name=\"on_create\" xexpand=\"0\"/>\n        <label name=\"on_write\"/>\n        <field name=\"on_write\" xexpand=\"0\"/>\n        <label name=\"on_delete\"/>\n        <field name=\"on_delete\" xexpand=\"0\"/>\n    </group>\n    <label name=\"condition\"/>\n    <field name=\"condition\" colspan=\"3\" widget=\"pyson\"/>\n    <label name=\"limit_number\"/>\n    <field name=\"limit_number\"/>\n    <label name=\"minimum_time_delay\"/>\n    <field name=\"minimum_time_delay\"/>\n    <label name=\"action\"/>\n    <field name=\"action\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/trigger_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"name\" expand=\"1\"/>\n    <field name=\"model\" expand=\"1\"/>\n    <field name=\"on_time\"/>\n    <field name=\"on_create\"/>\n    <field name=\"on_write\"/>\n    <field name=\"on_delete\"/>\n    <field name=\"action\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/ui_menu_favorite_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"menu\"/>\n    <field name=\"menu\"/>\n    <label name=\"sequence\"/>\n    <field name=\"sequence\"/>\n    <label name=\"user\"/>\n    <field name=\"user\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/ui_menu_favorite_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree sequence=\"sequence\">\n    <field name=\"menu\"/>\n    <field name=\"sequence\" tree_invisible=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/ui_menu_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <label name=\"active\"/>\n    <field name=\"active\"/>\n    <label name=\"parent\"/>\n    <field name=\"parent\"/>\n    <label name=\"icon\"/>\n    <field name=\"icon\"/>\n    <label name=\"action\"/>\n    <field name=\"action\"/>\n    <label name=\"sequence\"/>\n    <field name=\"sequence\"/>\n    <label name=\"complete_name\"/>\n    <field name=\"complete_name\" colspan=\"3\"/>\n    <field name=\"groups\" colspan=\"4\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/ui_menu_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"complete_name\" icon=\"icon\" expand=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/ui_menu_tree.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree keyword_open=\"1\" tree_state=\"1\">\n    <field name=\"name\" icon=\"icon\" expand=\"1\"/>\n    <field name=\"favorite\" tree_invisible=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/ui_view_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"model\"/>\n    <field name=\"model\"/>\n    <label name=\"type\"/>\n    <field name=\"type\"/>\n    <label name=\"inherit\"/>\n    <field name=\"inherit\"/>\n    <label name=\"domain\"/>\n    <field name=\"domain\" widget=\"pyson\"/>\n    <label name=\"priority\"/>\n    <field name=\"priority\"/>\n    <label name=\"field_childs\"/>\n    <field name=\"field_childs\"/>\n    <label name=\"module\"/>\n    <field name=\"module\"/>\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <separator name=\"arch\" colspan=\"4\"/>\n    <field name=\"arch\" colspan=\"4\"/>\n    <button name=\"show\" colspan=\"4\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/ui_view_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"priority\" optional=\"1\"/>\n    <field name=\"model\" expand=\"2\"/>\n    <field name=\"type\"/>\n    <field name=\"inherit\" expand=\"1\" optional=\"0\"/>\n    <field name=\"domain\" expand=\"1\" optional=\"1\"/>\n    <field name=\"field_childs\" optional=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/ui_view_search_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <label name=\"user\"/>\n    <field name=\"user\"/>\n\n    <label name=\"model\"/>\n    <field name=\"model\"/>\n    <newline/>\n\n    <label name=\"domain\"/>\n    <field name=\"domain\" colspan=\"3\" widget=\"pyson\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/ui_view_search_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"user\" expand=\"1\"/>\n    <field name=\"name\" expand=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/ui_view_tree_optional_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"view_id\"/>\n    <field name=\"view_id\"/>\n    <label name=\"user\"/>\n    <field name=\"user\"/>\n\n    <label name=\"field\"/>\n    <field name=\"field\"/>\n    <label name=\"value\"/>\n    <field name=\"value\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/ui_view_tree_optional_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"view_id\" expand=\"1\"/>\n    <field name=\"user\" expand=\"1\"/>\n    <field name=\"field\" expand=\"1\"/>\n    <field name=\"value\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/ui_view_tree_state_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"model\"/>\n    <field name=\"model\"/>\n    <label name=\"user\"/>\n    <field name=\"user\"/>\n    <label name=\"domain\"/>\n    <field name=\"domain\"/>\n    <label name=\"child_name\"/>\n    <field name=\"child_name\"/>\n    <separator name=\"nodes\" colspan=\"4\"/>\n    <field name=\"nodes\" colspan=\"4\"/>\n    <separator name=\"selected_nodes\" colspan=\"4\"/>\n    <field name=\"selected_nodes\" colspan=\"4\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/ui_view_tree_state_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"user\" expand=\"1\"/>\n    <field name=\"model\" expand=\"1\"/>\n    <field name=\"domain\" expand=\"1\"/>\n    <field name=\"child_name\"/>\n</tree>\n"
  },
  {
    "path": "trytond/ir/view/ui_view_tree_width_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"model\"/>\n    <field name=\"model\"/>\n    <label name=\"field\"/>\n    <field name=\"field\"/>\n    <label name=\"user\"/>\n    <field name=\"user\"/>\n    <label name=\"width\"/>\n    <field name=\"width\"/>\n</form>\n"
  },
  {
    "path": "trytond/ir/view/ui_view_tree_width_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"model\" expand=\"1\"/>\n    <field name=\"field\" expand=\"1\"/>\n    <field name=\"user\" expand=\"1\"/>\n    <field name=\"width\"/>\n</tree>\n"
  },
  {
    "path": "trytond/model/__init__.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom .active import DeactivableMixin\nfrom .avatar import avatar_mixin\nfrom .descriptors import dualmethod\nfrom .dictschema import DictSchemaMixin\nfrom .digits import DigitsMixin\nfrom .match import MatchMixin\nfrom .model import Model\nfrom .modelsingleton import ModelSingleton\nfrom .modelsql import Check, Exclude, Index, ModelSQL, Unique\nfrom .modelstorage import EvalEnvironment, ModelStorage\nfrom .modelview import ModelView\nfrom .multivalue import MultiValueMixin, ValueMixin\nfrom .order import sequence_ordered\nfrom .symbol import SymbolMixin\nfrom .tree import tree\nfrom .union import UnionMixin\nfrom .workflow import Workflow\n\n__all__ = ['Model', 'ModelView', 'ModelStorage', 'ModelSingleton', 'ModelSQL',\n    'Check', 'Unique', 'Exclude', 'Index',\n    'Workflow', 'DictSchemaMixin', 'MatchMixin', 'UnionMixin', 'dualmethod',\n    'MultiValueMixin', 'ValueMixin', 'SymbolMixin', 'DigitsMixin',\n    'EvalEnvironment', 'sequence_ordered', 'DeactivableMixin', 'tree',\n    'avatar_mixin']\n"
  },
  {
    "path": "trytond/model/active.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the toplevel of this\n# repository contains the full copyright notices and license terms.\nfrom trytond.i18n import lazy_gettext\nfrom trytond.pyson import Eval\n\nfrom . import fields\nfrom .model import Model\nfrom .modelview import ModelView\n\n\nclass DeactivableMixin(Model):\n    \"Mixin to allow to soft deletion of records\"\n    __slots__ = ()\n\n    active = fields.Boolean(\n        lazy_gettext('ir.msg_active'),\n        help=lazy_gettext('ir.msg_active_help'))\n\n    @classmethod\n    def default_active(cls):\n        return True\n\n    @classmethod\n    def __post_setup__(cls):\n        super().__post_setup__()\n\n        inactive = ~Eval('active', cls.default_active())\n        for name, field in cls._fields.items():\n            if name == 'active':\n                continue\n            if 'readonly' in field.states:\n                field.states['readonly'] |= inactive\n            else:\n                field.states['readonly'] = inactive\n\n        if issubclass(cls, ModelView):\n            for states in cls._buttons.values():\n                if 'readonly' in states:\n                    states['readonly'] |= inactive\n                else:\n                    states['readonly'] = inactive\n                if 'active' not in states.setdefault('depends', []):\n                    states['depends'].append('active')\n"
  },
  {
    "path": "trytond/model/avatar.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.i18n import lazy_gettext\nfrom trytond.model import fields\nfrom trytond.pool import Pool\n\n\ndef avatar_mixin(size=64, default=None):\n    class AvatarMixin:\n        __slots__ = ()\n        avatars = fields.One2Many(\n            'ir.avatar', 'resource', lazy_gettext('ir.msg_avatars'), size=1)\n        avatar = fields.Function(\n            fields.Binary(lazy_gettext('ir.msg_avatar')),\n            '_get_avatar', setter='_set_avatar')\n        avatar_url = fields.Function(\n            fields.Char(lazy_gettext('ir.msg_avatar_url')), '_get_avatar_url')\n\n        @property\n        def has_avatar(self):\n            if self.avatars:\n                avatar, = self.avatars\n                return bool(avatar.image_id or avatar.image)\n            return False\n\n        def _get_avatar(self, name):\n            if self.avatars:\n                avatar, = self.avatars\n                return avatar.get(size=size)\n            return None\n\n        @classmethod\n        def _set_avatar(cls, records, name, value):\n            pool = Pool()\n            Avatar = pool.get('ir.avatar')\n            avatars = []\n            image = Avatar.convert(value)\n            for record in records:\n                if record.avatars:\n                    avatar, = record.avatars\n                else:\n                    avatar = Avatar(resource=record)\n                avatars.append(avatar)\n            Avatar.save(avatars)\n            # Use write the image to store only once in filestore\n            Avatar.write(avatars, {\n                    'image': image,\n                    })\n\n        def _get_avatar_url(self, name):\n            if self.avatars:\n                avatar, = self.avatars\n                return avatar.url\n\n        @classmethod\n        def generate_avatar(cls, records, field='rec_name'):\n            from trytond.ir.avatar import PIL, generate\n            if not PIL:\n                return\n            records = [r for r in records if not r.has_avatar]\n            if not records:\n                return\n            for record in records:\n                avatar = generate(size, getattr(record, field))\n                if avatar:\n                    record.avatar = avatar\n            cls.save(records)\n\n        @classmethod\n        def copy(cls, avatars, default=None):\n            if default is None:\n                default = {}\n            else:\n                default = default.copy()\n            default.setdefault('avatars', [])\n            return super().copy(avatars, default=default)\n\n        if default:\n\n            @classmethod\n            def create(cls, vlist):\n                records = super().create(vlist)\n                cls.generate_avatar(records, field=default)\n                return records\n\n            @classmethod\n            def write(cls, *args):\n                records = sum(args[0:None:2], [])\n                super().write(*args)\n                cls.generate_avatar(records, field=default)\n\n    return AvatarMixin\n"
  },
  {
    "path": "trytond/model/descriptors.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport functools\n\n\nclass dualmethod(object):\n    \"\"\"Descriptor implementing combination of class and instance method\n\n    When called on an instance, the class is passed as the first argument and a\n    list with the instance as the second.\n    When called on a class, the class itsefl is passed as the first argument.\n\n    >>> class Example(object):\n    ...     @dualmethod\n    ...     def method(cls, instances):\n    ...         print(len(instances))\n    ...\n    >>> Example.method([Example()])\n    1\n    >>> Example().method()\n    1\n    \"\"\"\n    def __init__(self, func):\n        self.func = func\n\n    def __get__(self, instance, owner):\n\n        @functools.wraps(self.func)\n        def newfunc(*args, **kwargs):\n            if instance:\n                return self.func(owner, [instance], *args, **kwargs)\n            else:\n                return self.func(owner, *args, **kwargs)\n        return newfunc\n"
  },
  {
    "path": "trytond/model/dictschema.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the toplevel of this\n# repository contains the full copyright notices and license terms.\nimport json\nfrom collections import OrderedDict\n\nfrom trytond.cache import Cache\nfrom trytond.config import config\nfrom trytond.i18n import gettext, lazy_gettext\nfrom trytond.model import fields\nfrom trytond.model.exceptions import ValidationError\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval, PYSONDecoder\nfrom trytond.rpc import RPC\nfrom trytond.tools import slugify\nfrom trytond.transaction import Transaction\n\n\nclass DomainError(ValidationError):\n    pass\n\n\nclass SelectionError(ValidationError):\n    pass\n\n\nclass DictSchemaMixin(object):\n    __slots__ = ()\n    _rec_name = 'string'\n    name = fields.Char(lazy_gettext('ir.msg_dict_schema_name'), required=True)\n    string = fields.Char(\n        lazy_gettext('ir.msg_dict_schema_string'),\n        translate=True, required=True)\n    help = fields.Text(\n        lazy_gettext('ir.msg_dict_schema_help'),\n        translate=True)\n    type_ = fields.Selection([\n            ('boolean', lazy_gettext('ir.msg_dict_schema_boolean')),\n            ('integer', lazy_gettext('ir.msg_dict_schema_integer')),\n            ('char', lazy_gettext('ir.msg_dict_schema_char')),\n            ('float', lazy_gettext('ir.msg_dict_schema_float')),\n            ('numeric', lazy_gettext('ir.msg_dict_schema_numeric')),\n            ('date', lazy_gettext('ir.msg_dict_schema_date')),\n            ('datetime', lazy_gettext('ir.msg_dict_schema_datetime')),\n            ('selection', lazy_gettext('ir.msg_dict_schema_selection')),\n            ('multiselection',\n                lazy_gettext('ir.msg_dict_schema_multiselection')),\n            ], lazy_gettext('ir.msg_dict_schema_type'), required=True)\n    digits = fields.Integer(\n        lazy_gettext('ir.msg_dict_schema_digits'),\n        states={\n            'invisible': ~Eval('type_').in_(['float', 'numeric']),\n            }, depends=['type_'])\n    domain = fields.Char(lazy_gettext('ir.msg_dict_schema_domain'))\n    selection = fields.Text(\n        lazy_gettext('ir.msg_dict_schema_selection'),\n        states={\n            'invisible': ~Eval('type_').in_(['selection', 'multiselection']),\n            }, translate=True, depends=['type_'],\n        help=lazy_gettext('ir.msg_dict_schema_selection_help'))\n    selection_sorted = fields.Boolean(\n        lazy_gettext('ir.msg_dict_schema_selection_sorted'),\n        states={\n            'invisible': ~Eval('type_').in_(['selection', 'multiselection']),\n            }, depends=['type_'],\n        help=lazy_gettext('ir.msg_dict_schema_selection_sorted_help'))\n    help_selection = fields.Text(\n        lazy_gettext('ir.msg_dict_schema_help_selection'), translate=True,\n        states={\n            'invisible': ~Eval('type_').in_(['selection', 'multiselection']),\n            },\n        depends=['type_'],\n        help=lazy_gettext('is.msg_dict_schema_help_selection_help'))\n    selection_json = fields.Function(fields.Char(\n            lazy_gettext('ir.msg_dict_schema_selection_json'),\n            states={\n                'invisible': ~Eval('type_').in_(\n                    ['selection', 'multiselection']),\n                },\n            depends=['type_']), 'get_selection_json')\n    help_selection_json = fields.Function(fields.Char(\n            lazy_gettext('ir.msg_dict_schema_help_selection_json'),\n            states={\n                'invisible': ~Eval('type_').in_(\n                    ['selection', 'multiselection']),\n                },\n            depends=['type_']), 'get_selection_json')\n    _relation_fields_cache = Cache('_dict_schema_mixin.get_relation_fields')\n\n    @classmethod\n    def __setup__(cls):\n        super(DictSchemaMixin, cls).__setup__()\n        cls.__rpc__.update({\n                'get_keys': RPC(instantiate=0),\n                'search_get_keys': RPC(),\n                })\n\n    @staticmethod\n    def default_digits():\n        return 2\n\n    @staticmethod\n    def default_selection_sorted():\n        return True\n\n    @fields.depends('name', 'string')\n    def on_change_string(self):\n        if not self.name and self.string:\n            self.name = slugify(self.string.lower(), hyphenate='_')\n\n    @classmethod\n    def validate_fields(cls, schemas, field_names):\n        super().validate_fields(schemas, field_names)\n        cls.check_domain(schemas, field_names)\n        cls.check_selection(schemas, field_names)\n\n    @classmethod\n    def check_domain(cls, schemas, field_names=None):\n        if field_names and 'domain' not in field_names:\n            return\n        for schema in schemas:\n            if not schema.domain:\n                continue\n            try:\n                value = PYSONDecoder().decode(schema.domain)\n            except Exception:\n                raise DomainError(\n                    gettext('ir.msg_dict_schema_invalid_domain',\n                        schema=schema.rec_name))\n            if not isinstance(value, list):\n                raise DomainError(\n                    gettext('ir.msg_dict_schema_invalid_domain',\n                        schema=schema.rec_name))\n\n    @classmethod\n    def check_selection(cls, schemas, field_names=None):\n        if field_names and not (field_names & {\n                    'type_', 'selection_json', 'help_selection_json'}):\n            return\n        for schema in schemas:\n            if schema.type_ not in {'selection', 'multiselection'}:\n                continue\n            for name in ['selection', 'help_selection']:\n                try:\n                    dict(json.loads(schema.get_selection_json(name + '_json')))\n                except Exception:\n                    raise SelectionError(\n                        gettext('ir.msg_dict_schema_invalid_%s' % name,\n                            schema=schema.rec_name))\n\n    def get_selection_json(self, name):\n        field = name[:-len('_json')]\n        db_selection = getattr(self, field) or ''\n        selection = [[w.strip() for w in v.split(':', 1)]\n            for v in db_selection.splitlines() if v]\n        return json.dumps(selection, separators=(',', ':'))\n\n    @classmethod\n    def get_keys(cls, records):\n        pool = Pool()\n        Config = pool.get('ir.configuration')\n        keys = []\n        for record in records:\n            new_key = {\n                'id': record.id,\n                'name': record.name,\n                'string': record.string,\n                'help': record.help,\n                'type': record.type_,\n                'domain': record.domain,\n                'sequence': getattr(record, 'sequence', record.name),\n                }\n            if record.type_ in {'selection', 'multiselection'}:\n                with Transaction().set_context(language=Config.get_language()):\n                    english_key = cls(record.id)\n                    selection = OrderedDict(json.loads(\n                            english_key.selection_json))\n                selection.update(dict(json.loads(record.selection_json)))\n                new_key['selection'] = list(selection.items())\n                new_key['help_selection'] = dict(\n                    json.loads(record.help_selection_json))\n                new_key['sort'] = record.selection_sorted\n            elif record.type_ in ('float', 'numeric'):\n                new_key['digits'] = (16, record.digits)\n            keys.append(new_key)\n        return keys\n\n    @classmethod\n    def search_get_keys(cls, domain, limit=None):\n        schemas = cls.search(domain, limit=limit)\n        return cls.get_keys(schemas)\n\n    @classmethod\n    def get_relation_fields(cls):\n        if not config.get('dict', cls.__name__, default=True):\n            return {}\n        fields = cls._relation_fields_cache.get(cls.__name__)\n        if fields is not None:\n            return fields\n        keys = cls.get_keys(cls.search([]))\n        fields = {k['name']: k for k in keys}\n        cls._relation_fields_cache.set(cls.__name__, fields)\n        return fields\n\n    @classmethod\n    def create(cls, vlist):\n        records = super().create(vlist)\n        cls._relation_fields_cache.clear()\n        return records\n\n    @classmethod\n    def write(cls, *args):\n        super().write(*args)\n        cls._relation_fields_cache.clear()\n\n    @classmethod\n    def delete(cls, records):\n        super().delete(records)\n        cls._relation_fields_cache.clear()\n\n    def format(self, value, lang=None):\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        if lang is None:\n            lang = Lang.get()\n        if value is None:\n            return ''\n        if self.type_ == 'boolean':\n            if value:\n                return gettext('ir.msg_dict_yes')\n            else:\n                return gettext('ir.msg_dict_no')\n        elif self.type_ == 'integer':\n            return lang.format('%i', value)\n        elif self.type_ in {'float', 'numeric'}:\n            return lang.format('%.*f', (self.digits, value))\n        elif self.type_ in {'date', 'datetime'}:\n            return lang.strftime(value)\n        elif self.type_ in {'selection', 'multiselection'}:\n            values = dict(json.loads(self.selection_json))\n            if self.type_ == 'selection':\n                return values.get(value, '')\n            else:\n                return \"; \".join(values.get(v, '') for v in value)\n        return value\n"
  },
  {
    "path": "trytond/model/digits.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.cache import Cache\nfrom trytond.rpc import RPC\n\n\nclass DigitsMixin:\n    __slots__ = ()\n\n    _digits_cache = Cache('_digits_mixin..get_digits', context=False)\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        cls.__rpc__.update({\n                'get_digits': RPC(instantiate=0, cache=dict(days=1)),\n                })\n\n    def get_digits(self):\n        key = str(self)\n        digits = self._digits_cache.get(key)\n        if digits is not None:\n            return digits\n        digits = self._get_digits()\n        self._digits_cache.set(key, digits)\n        return digits\n\n    def _get_digits(self):\n        return (16, self.digits)\n\n    @classmethod\n    def write(cls, *args):\n        super().write(*args)\n        cls._digits_cache.clear()\n"
  },
  {
    "path": "trytond/model/exceptions.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom .modelsql import ForeignKeyError, SQLConstraintError\nfrom .modelstorage import (\n    AccessError, DigitsValidationError, DomainValidationError,\n    ForbiddenCharValidationError, ImportDataError, RequiredValidationError,\n    SelectionValidationError, SizeValidationError, TimeFormatValidationError,\n    ValidationError)\nfrom .modelview import AccessButtonError\nfrom .tree import RecursionError\n\n__all__ = [\n    AccessButtonError,\n    AccessError,\n    DigitsValidationError,\n    DomainValidationError,\n    ForeignKeyError,\n    ImportDataError,\n    RecursionError,\n    RequiredValidationError,\n    SQLConstraintError,\n    ForbiddenCharValidationError,\n    SelectionValidationError,\n    SizeValidationError,\n    TimeFormatValidationError,\n    ValidationError,\n    ]\n"
  },
  {
    "path": "trytond/model/fields/__init__.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom .binary import Binary\nfrom .boolean import Boolean\nfrom .char import Char\nfrom .date import Date, DateTime, Time, TimeDelta, Timestamp\nfrom .dict import Dict\nfrom .field import (\n    SQL_OPERATORS, Field, context_validate, depends, domain_validate,\n    get_eval_fields, on_change_result, states_validate, with_inactive_records)\nfrom .float import Float\nfrom .function import Function, MultiValue\nfrom .integer import BigInteger, Integer\nfrom .many2many import Many2Many\nfrom .many2one import Many2One\nfrom .multiselection import MultiSelection\nfrom .numeric import Numeric\nfrom .one2many import One2Many\nfrom .one2one import One2One\nfrom .reference import Reference\nfrom .selection import Selection\nfrom .text import FullText, Text\n\n__all__ = [\n    depends, with_inactive_records, SQL_OPERATORS, on_change_result,\n    get_eval_fields, states_validate, domain_validate, context_validate, Field,\n    Boolean, Integer, BigInteger, Char, Text, FullText, Float, Numeric, Date,\n    Timestamp, DateTime, Time, TimeDelta, Binary, Selection, Reference,\n    Many2One, One2Many, Many2Many, Function, MultiValue, One2One, Dict,\n    MultiSelection]\n"
  },
  {
    "path": "trytond/model/fields/binary.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom sql import Column, Null\n\nfrom trytond.filestore import filestore\nfrom trytond.tools import cached_property, grouped_slice, reduce_ids\nfrom trytond.transaction import Transaction\n\nfrom .field import Field\n\n\ndef caster(d):\n    if isinstance(d, bytes):\n        return d\n    elif isinstance(d, memoryview):\n        return bytes(d)\n    return bytes(d, encoding='utf8')\n\n\nclass Binary(Field):\n    '''\n    Define a binary field (``bytes``).\n    '''\n    _type = 'binary'\n    _sql_type = 'BLOB'\n    cast = staticmethod(caster)\n\n    def __init__(self, string='', help='', required=False, readonly=False,\n            domain=None, states=None, on_change=None,\n            on_change_with=None, depends=None, context=None, loading='lazy',\n            filename=None, file_id=None, store_prefix=None):\n        self.filename = filename\n        self.file_id = file_id\n        self.store_prefix = store_prefix\n        super(Binary, self).__init__(string=string, help=help,\n            required=required, readonly=readonly, domain=domain, states=states,\n            on_change=on_change, on_change_with=on_change_with,\n            depends=depends, context=context, loading=loading)\n\n    @cached_property\n    def display_depends(self):\n        depends = super().display_depends\n        if self.filename:\n            depends.add(self.filename)\n        return depends\n\n    def get(self, ids, model, name, values=None):\n        '''\n        Convert the binary value into ``bytes``\n\n        :param ids: a list of ids\n        :param model: a string with the name of the model\n        :param name: a string with the name of the field\n        :param values: a dictionary with the read values\n        :return: a dictionary with ids as key and values as value\n        '''\n        if values is None:\n            values = {}\n        transaction = Transaction()\n        res = {}\n        converter = self.cast\n        default = None\n        format_ = Transaction().context.get(\n            '%s.%s' % (model.__name__, name), '')\n        if format_ == 'size':\n            converter = len\n            default = 0\n\n        if self.file_id:\n            table = model.__table__()\n            cursor = transaction.connection.cursor()\n\n            prefix = self.store_prefix\n            if prefix is None:\n                prefix = transaction.database.name\n\n            if format_ == 'size':\n                store_func = filestore.size\n            else:\n                def store_func(id, prefix):\n                    return self.cast(filestore.get(id, prefix=prefix))\n\n            for sub_ids in grouped_slice(ids):\n                cursor.execute(*table.select(\n                        table.id, Column(table, self.file_id),\n                        where=reduce_ids(table.id, sub_ids)\n                        & (Column(table, self.file_id) != Null)\n                        & (Column(table, self.file_id) != '')))\n                for record_id, file_id in cursor:\n                    try:\n                        res[record_id] = store_func(file_id, prefix)\n                    except (IOError, OSError):\n                        pass\n\n        for i in values:\n            if i['id'] in res:\n                continue\n            value = i[name]\n            if value:\n                value = converter(value)\n            else:\n                value = default\n            res[i['id']] = value\n        for i in ids:\n            res.setdefault(i, default)\n        return res\n\n    def set(self, Model, name, ids, value, *args):\n        transaction = Transaction()\n        table = Model.__table__()\n        cursor = transaction.connection.cursor()\n\n        prefix = self.store_prefix\n        if prefix is None:\n            prefix = transaction.database.name\n\n        args = iter((ids, value) + args)\n        for ids, value in zip(args, args):\n            if self.file_id:\n                columns = [Column(table, self.file_id), Column(table, name)]\n                values = [\n                    filestore.set(value, prefix) if value else None, None]\n            else:\n                columns = [Column(table, name)]\n                values = [self.sql_format(value)]\n            cursor.execute(*table.update(columns, values,\n                    where=reduce_ids(table.id, ids)))\n\n    def definition(self, model, language):\n        definition = super().definition(model, language)\n        definition['searchable'] = False\n        definition['filename'] = self.filename\n        return definition\n"
  },
  {
    "path": "trytond/model/fields/boolean.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom .field import Field\n\n\nclass Boolean(Field):\n    '''\n    Define a boolean field (``True`` or ``False``).\n    '''\n    _type = 'boolean'\n    _sql_type = 'BOOL'\n    _py_type = bool\n\n    def __init__(self, string='', help='', readonly=False, domain=None,\n            states=None, on_change=None, on_change_with=None,\n            depends=None, context=None, loading='eager'):\n        super(Boolean, self).__init__(string=string, help=help, required=False,\n            readonly=readonly, domain=domain, states=states,\n            on_change=on_change, on_change_with=on_change_with,\n            depends=depends, context=context, loading=loading)\n\n    __init__.__doc__ = Field.__init__.__doc__\n\n    def _domain_add_null(self, column, operator, value, expression):\n        expression = super(Boolean, self)._domain_add_null(\n            column, operator, value, expression)\n        if operator in ('=', '!='):\n            conv = {\n                False: None,\n                None: False,\n                }\n            if value is False or value is None:\n                if operator == '=':\n                    expression |= (column == conv[value])\n                else:\n                    expression &= (column != conv[value])\n        return expression\n"
  },
  {
    "path": "trytond/model/fields/char.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport string\nimport warnings\n\nfrom sql import Expression, Query\nfrom sql.conditionals import Coalesce, NullIf\nfrom sql.functions import Trim\nfrom sql.operators import Not\n\nfrom trytond.rpc import RPC\nfrom trytond.tools import is_full_text, unescape_wildcard\nfrom trytond.transaction import Transaction\n\nfrom .field import Field, FieldTranslate, size_validate\n\n\nclass Char(FieldTranslate):\n    '''\n    Define a char field (``unicode``).\n    '''\n    _type = 'char'\n    _py_type = str\n    forbidden_chars = '\\t\\n\\r\\x0b\\x0c'\n    search_unaccented = True\n    search_full_text = False\n\n    def __init__(self, string='', size=None, help='', required=False,\n            readonly=False, domain=None, states=None, translate=False,\n            on_change=None, on_change_with=None, depends=None, context=None,\n            loading=None, autocomplete=None, strip=True):\n        '''\n        :param translate: A boolean. If ``True`` the field is translatable.\n        :param size: A integer. If set defines the maximum size of the values.\n        '''\n        if loading is None:\n            loading = 'lazy' if translate else 'eager'\n        super(Char, self).__init__(string=string, help=help, required=required,\n            readonly=readonly, domain=domain, states=states,\n            on_change=on_change, on_change_with=on_change_with,\n            depends=depends, context=context, loading=loading)\n        self.autocomplete = set()\n        if autocomplete:\n            warnings.warn('autocomplete argument is deprecated, use the '\n                'depends decorator', DeprecationWarning, stacklevel=2)\n            self.autocomplete.update(autocomplete)\n        self.strip = strip\n        self.translate = translate\n        self.__size = None\n        self.size = size\n    __init__.__doc__ += Field.__init__.__doc__\n\n    def _get_size(self):\n        return self.__size\n\n    def _set_size(self, value):\n        size_validate(value)\n        self.__size = value\n\n    size = property(_get_size, _set_size)\n\n    @property\n    def strip(self):\n        return self.__strip\n\n    @strip.setter\n    def strip(self, value):\n        assert value in {False, True, 'leading', 'trailing'}\n        self.__strip = value\n\n    @property\n    def _sql_type(self):\n        if isinstance(self.size, int):\n            return 'VARCHAR(%s)' % self.size\n        else:\n            return 'VARCHAR'\n\n    def __set__(self, inst, value):\n        if isinstance(value, str) and self.strip:\n            if self.strip == 'leading':\n                value = value.lstrip()\n            elif self.strip == 'trailing':\n                value = value.rstrip()\n            else:\n                value = value.strip()\n        super().__set__(inst, value)\n\n    def sql_format(self, value):\n        if value is not None and self.strip:\n            if isinstance(value, (Query, Expression)):\n                if self.strip == 'leading':\n                    position = 'LEADING'\n                elif self.strip == 'trailing':\n                    position = 'TRAILING'\n                else:\n                    position = 'BOTH'\n                value = Trim(\n                    value, position=position, characters=string.whitespace)\n            else:\n                if self.strip == 'leading':\n                    value = value.lstrip()\n                elif self.strip == 'trailing':\n                    value = value.rstrip()\n                else:\n                    value = value.strip()\n        return super().sql_format(value)\n\n    def set_rpc(self, model):\n        super(Char, self).set_rpc(model)\n        if self.autocomplete:\n            func_name = 'autocomplete_%s' % self.name\n            assert hasattr(model, func_name), \\\n                'Missing %s on model %s' % (func_name, model.__name__)\n            model.__rpc__.setdefault(func_name, RPC(instantiate=0))\n\n    def _domain_column(self, operator, column):\n        column = super(Char, self)._domain_column(operator, column)\n        if self.search_unaccented and operator.endswith('ilike'):\n            database = Transaction().database\n            column = database.unaccent(column)\n        return column\n\n    def _domain_value(self, operator, value):\n        value = super(Char, self)._domain_value(operator, value)\n        if self.search_unaccented and operator.endswith('ilike'):\n            database = Transaction().database\n            value = database.unaccent(value)\n        return value\n\n    def convert_domain(self, domain, tables, Model):\n        transaction = Transaction()\n        context = transaction.context\n        database = transaction.database\n        expression = super().convert_domain(domain, tables, Model)\n        name, operator, value = domain\n        if operator.endswith('ilike'):\n            table, _ = tables[None]\n            if self.translate:\n                language = transaction.language\n                # Without domain because a different operator is applied\n                model, join, column = self._get_translation_column(\n                    Model, name)\n                column = Coalesce(NullIf(column, ''), self.sql_column(model))\n            else:\n                language = None\n                column = self.sql_column(table)\n            column = self._domain_column(operator, column)\n\n            threshold = context.get(\n                '%s.%s.search_similarity' % (Model.__name__, name),\n                context.get('search_similarity'))\n            if database.has_similarity() and is_full_text(value) and threshold:\n                sim_value = unescape_wildcard(value)\n                sim_value = self._domain_value(operator, sim_value)\n                expression = (\n                    database.similarity(column, sim_value) >= threshold)\n                if operator.startswith('not'):\n                    expression = Not(expression)\n                if self.translate:\n                    expression = table.id.in_(\n                        join.select(model.id, where=expression))\n\n            key = '%s.%s.search_full_text' % (Model.__name__, name)\n            if ((self.search_full_text or context.get(key))\n                    and context.get(key, True)\n                    and database.has_search_full_text()):\n                if context.get(key) or is_full_text(value):\n                    fts_column = database.format_full_text(\n                        column, language=language)\n                    fts_value = value\n                    if key not in context:\n                        fts_value = unescape_wildcard(fts_value)\n                    fts_value = self._domain_value(operator, fts_value)\n                    fts_value = database.format_full_text_query(\n                        fts_value, language=language)\n                    fts = database.search_full_text(fts_column, fts_value)\n                    if operator.startswith('not'):\n                        fts = Not(fts)\n                    if self.translate:\n                        fts = table.id.in_(\n                            join.select(model.id, where=fts))\n                    if database.has_similarity() and is_full_text(value):\n                        if operator.startswith('not'):\n                            expression |= fts\n                        else:\n                            expression &= fts\n                    else:\n                        expression = fts\n        return expression\n\n    def convert_order(self, name, tables, Model):\n        method = getattr(Model, 'order_%s' % name, None)\n        if method:\n            return method(tables)\n        transaction = Transaction()\n        context = transaction.context\n        database = transaction.database\n        key = '%s.%s.order' % (Model.__name__, name)\n        value = context.get(key)\n        order = super().convert_order(name, tables, Model)\n        if value:\n            expression = None\n            table, _ = tables[None]\n            if self.translate:\n                language = transaction.language\n                column = self._get_translation_order(tables, Model, name)\n            else:\n                language = None\n                column = self.sql_column(table)\n            column = self._domain_column('ilike', column)\n            if database.has_similarity():\n                sim_value = unescape_wildcard(value)\n                sim_value = self._domain_value('ilike', sim_value)\n                expression = database.similarity(column, sim_value)\n            key = '%s.%s.search_full_text' % (Model.__name__, name)\n            if ((self.search_full_text or context.get(key))\n                    and database.has_search_full_text()):\n                column = database.format_full_text(column, language=language)\n                value = self._domain_value('ilike', value)\n                value = database.format_full_text_query(\n                    value, language=language)\n                rank = database.rank_full_text(\n                    column, value, normalize=['rank'])\n                if expression:\n                    expression += rank\n                else:\n                    expression = rank\n            if expression:\n                order = [expression]\n        return order\n\n    def definition(self, model, language):\n        definition = super().definition(model, language)\n        definition['autocomplete'] = list(self.autocomplete)\n        definition['strip'] = self.strip\n        if self.size is not None:\n            definition['size'] = self.size\n        return definition\n"
  },
  {
    "path": "trytond/model/fields/date.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\n\nfrom sql.functions import AtTimeZone, Function\n\nfrom trytond import backend\nfrom trytond.pyson import PYSON, PYSONEncoder\nfrom trytond.tools import cached_property\n\nfrom .field import Field, get_eval_fields\n\n\nclass SQLite_Date(Function):\n    __slots__ = ()\n    _function = 'DATE'\n\n\nclass SQLite_DateTime(Function):\n    __slots__ = ()\n    _function = 'DATETIME'\n\n\nclass SQLite_Time(Function):\n    __slots__ = ()\n    _function = 'TIME'\n\n\nclass Date(Field):\n    '''\n    Define a date field (``date``).\n    '''\n    _type = 'date'\n    _sql_type = 'DATE'\n    _py_type = datetime.date\n\n    def sql_format(self, value):\n        if isinstance(value, str):\n            value = datetime.date.fromisoformat(value)\n        elif isinstance(value, datetime.datetime):\n            if value.time() != datetime.time():\n                raise ValueError(\"Date field can not have time\")\n        return super().sql_format(value)\n\n    def sql_cast(self, expression, timezone=None):\n        if backend.name == 'sqlite':\n            return SQLite_Date(expression)\n        if timezone:\n            expression = AtTimeZone(expression, 'utc')\n            expression = AtTimeZone(expression, timezone)\n        return super(Date, self).sql_cast(expression)\n\n\nclass FormatMixin(Field):\n\n    def definition(self, model, language):\n        encoder = PYSONEncoder()\n        definition = super().definition(model, language)\n        definition['format'] = encoder.encode(self.format)\n        return definition\n\n    @cached_property\n    def display_depends(self):\n        depends = super().display_depends\n        if isinstance(self.format, PYSON):\n            depends |= get_eval_fields(self.format)\n        return depends\n\n    @cached_property\n    def validation_depends(self):\n        depends = super().display_depends\n        if isinstance(self.format, PYSON):\n            depends |= get_eval_fields(self.format)\n        return depends\n\n\nclass Timestamp(FormatMixin, Field):\n    '''\n    Define a timestamp field (``datetime``).\n    '''\n    _type = 'timestamp'\n    _sql_type = 'TIMESTAMP'\n    _py_type = datetime.datetime\n    format = '%H:%M:%S.%f'\n\n    def sql_format(self, value):\n        if isinstance(value, str):\n            value = datetime.datetime.fromisoformat(value)\n        return super().sql_format(value)\n\n    def sql_cast(self, expression):\n        if backend.name == 'sqlite':\n            return SQLite_DateTime(expression)\n        return super().sql_cast(expression)\n\n\nclass DateTime(Timestamp):\n    '''\n    Define a datetime field (``datetime``).\n    '''\n    _type = 'datetime'\n    _sql_type = 'DATETIME'\n\n    def __init__(self, string='', format='%H:%M:%S', help='', required=False,\n            readonly=False, domain=None, states=None,\n            on_change=None, on_change_with=None, depends=None,\n            context=None, loading='eager'):\n        '''\n        :param format: The validation format as used by strftime.\n        '''\n        super(DateTime, self).__init__(string=string, help=help,\n            required=required, readonly=readonly, domain=domain, states=states,\n            on_change=on_change, on_change_with=on_change_with,\n            depends=depends, context=context, loading=loading)\n        self.format = format\n\n    __init__.__doc__ += Field.__init__.__doc__\n\n    def sql_format(self, value):\n        value = super().sql_format(value)\n        if isinstance(value, datetime.datetime):\n            value = value.replace(microsecond=0)\n        return value\n\n\nclass Time(FormatMixin, Field):\n    '''\n    Define a time field (``time``).\n    '''\n    _type = 'time'\n    _sql_type = 'TIME'\n    _py_type = datetime.time\n\n    def __init__(self, string='', format='%H:%M:%S', help='', required=False,\n            readonly=False, domain=None, states=None,\n            on_change=None, on_change_with=None, depends=None,\n            context=None, loading='eager'):\n        '''\n        :param format: The validation format as used by strftime.\n        '''\n        super().__init__(string=string, help=help,\n            required=required, readonly=readonly, domain=domain, states=states,\n            on_change=on_change, on_change_with=on_change_with,\n            depends=depends, context=context, loading=loading)\n        self.format = format\n\n    def sql_format(self, value):\n        if isinstance(value, str):\n            value = datetime.time.fromisoformat(value)\n        value = super().sql_format(value)\n        if isinstance(value, datetime.time):\n            value = value.replace(microsecond=0)\n        return value\n\n    def sql_cast(self, expression):\n        if backend.name == 'sqlite':\n            return SQLite_Time(expression)\n        return super(Time, self).sql_cast(expression)\n\n\nclass TimeDelta(Field):\n    '''\n    Define a timedelta field (``timedelta``).\n    '''\n    _type = 'timedelta'\n    _sql_type = 'INTERVAL'\n    _py_type = datetime.timedelta\n\n    def __init__(self, string='', converter=None, help='', required=False,\n            readonly=False, domain=None, states=None,\n            on_change=None, on_change_with=None, depends=None,\n            context=None, loading='eager'):\n        '''\n        :param converter: The name of the context key containing\n            the time converter.\n        '''\n        super(TimeDelta, self).__init__(string=string, help=help,\n            required=required, readonly=readonly, domain=domain, states=states,\n            on_change=on_change, on_change_with=on_change_with,\n            depends=depends, context=context, loading=loading)\n        self.converter = converter\n\n    def sql_format(self, value):\n        if isinstance(value, (int, float)):\n            value = datetime.timedelta(seconds=value)\n        elif isinstance(value, str):\n            if not value.find(':'):\n                raise ValueError(\n                    \"TimeDelta requires a string '%H:%M:%S.%f' or '%H:%M'\")\n            hours, minutes, seconds = (value.split(\":\") + ['00'])[:3]\n            value = datetime.timedelta(\n                hours=int(hours), minutes=int(minutes), seconds=float(seconds))\n        return super().sql_format(value)\n\n    @classmethod\n    def get(cls, ids, model, name, values=None):\n        result = {}\n        for row in values:\n            value = row[name]\n            if (value is not None\n                    and not isinstance(value, datetime.timedelta)):\n                if value >= datetime.timedelta.max.total_seconds():\n                    value = datetime.timedelta.max\n                elif value <= datetime.timedelta.min.total_seconds():\n                    value = datetime.timedelta.min\n                else:\n                    value = datetime.timedelta(seconds=value)\n                result[row['id']] = value\n            else:\n                result[row['id']] = value\n        return result\n\n    def definition(self, model, language):\n        definition = super().definition(model, language)\n        definition['converter'] = self.converter\n        return definition\n"
  },
  {
    "path": "trytond/model/fields/dict.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the toplevel of this\n# repository contains the full copyright notices and license terms.\nimport json\nfrom functools import partial\n\nfrom sql import Cast, CombiningQuery, Literal, Null, Select, operators\n\nfrom trytond import backend\nfrom trytond.pool import Pool\nfrom trytond.protocols.jsonrpc import JSONDecoder, JSONEncoder\nfrom trytond.tools import grouped_slice\nfrom trytond.tools.immutabledict import ImmutableDict\nfrom trytond.transaction import Transaction\n\nfrom .field import SQL_OPERATORS, Field\n\n# Use canonical form\ndumps = partial(\n    json.dumps, cls=JSONEncoder, separators=(',', ':'), sort_keys=True,\n    ensure_ascii=False)\n\n\nclass Dict(Field):\n    'Define dict field.'\n    _type = 'dict'\n    _sql_type = 'JSON'\n    _py_type = dict\n\n    def __init__(self, schema_model, string='', help='', required=False,\n            readonly=False, domain=None, states=None,\n            on_change=None, on_change_with=None, depends=None,\n            context=None, loading='lazy'):\n        super(Dict, self).__init__(string, help, required, readonly, domain,\n            states, on_change, on_change_with, depends, context, loading)\n        self.schema_model = schema_model\n        self.search_unaccented = True\n\n    def get(self, ids, model, name, values=None):\n        dicts = dict((id, None) for id in ids)\n        for value in values or []:\n            data = value[name]\n            if data:\n                # If stored as JSON conversion is done on backend\n                if isinstance(data, str):\n                    data = json.loads(data, object_hook=JSONDecoder())\n                for key, val in data.items():\n                    if isinstance(val, list):\n                        data[key] = tuple(val)\n                dicts[value['id']] = ImmutableDict(data)\n        return dicts\n\n    def sql_format(self, value):\n        value = super().sql_format(value)\n        if isinstance(value, dict):\n            d = {}\n            for k, v in value.items():\n                if v is None:\n                    continue\n                if isinstance(v, list):\n                    v = list(sorted(set(v)))\n                d[k] = v\n            value = dumps(d)\n        return value\n\n    def __set__(self, inst, value):\n        if value:\n            value = ImmutableDict(value)\n        super().__set__(inst, value)\n\n    def translated(self, name=None, type_='values'):\n        \"Return a descriptor for the translated value of the field\"\n        if name is None:\n            name = self.name\n        if name is None:\n            raise ValueError('Missing name argument')\n        return TranslatedDict(name, type_)\n\n    def _domain_column(self, operator, column, key=None):\n        database = Transaction().database\n        column = database.json_get(\n            super()._domain_column(operator, column), key)\n        if operator.endswith('like'):\n            column = Cast(column, database.sql_type('VARCHAR').base)\n            if self.search_unaccented and operator.endswith('ilike'):\n                column = database.unaccent(column)\n        return column\n\n    def _domain_value(self, operator, value):\n        if backend.name == 'sqlite' and isinstance(value, bool):\n            # json_extract returns 0 for JSON false and 1 for JSON true\n            value = int(value)\n        if isinstance(value, (Select, CombiningQuery)):\n            return value\n        if isinstance(value, (list, tuple)):\n            value = sorted(set(value))\n        if operator.endswith('in'):\n            return [dumps(v) for v in value]\n        else:\n            value = dumps(value)\n            if self.search_unaccented and operator.endswith('ilike'):\n                database = Transaction().database\n                value = database.unaccent(value)\n            return value\n\n    def _domain_add_null(self, column, operator, value, expression):\n        expression = super()._domain_add_null(\n            column, operator, value, expression)\n        if value is None and operator.endswith('='):\n            if operator == '=':\n                expression |= (column == Null)\n            else:\n                expression &= (column != Null)\n        return expression\n\n    def convert_domain(self, domain, tables, Model):\n        name, operator, value = domain[:3]\n        if '.' not in name:\n            return super().convert_domain(domain, tables, Model)\n        database = Transaction().database\n        table, _ = tables[None]\n        name, key = name.split('.', 1)\n        Operator = SQL_OPERATORS[operator]\n        raw_column = self.sql_column(table)\n        column = self._domain_column(operator, raw_column, key)\n        expression = Operator(column, self._domain_value(operator, value))\n        if operator in {'=', '!='}:\n            # Try to use custom operators in case there is indexes\n            try:\n                if value is None:\n                    expression = database.json_key_exists(\n                        raw_column, key)\n                    if operator == '=':\n                        expression = operators.Not(expression)\n                # we compare on multi-selection by doing an equality check and\n                # not a contain check\n                elif not isinstance(value, (list, tuple)):\n                    expression = database.json_contains(\n                        raw_column, dumps({key: value}))\n                    if operator == '!=':\n                        expression = operators.Not(expression)\n                        expression &= database.json_key_exists(\n                            raw_column, key)\n                return expression\n            except NotImplementedError:\n                pass\n        elif operator.endswith('in'):\n            # Try to use custom operators in case there is indexes\n            if not value:\n                expression = Literal(operator.startswith('not'))\n            else:\n                op = '!=' if operator.startswith('not') else '='\n                try:\n                    in_expr = Literal(False)\n                    for v in value:\n                        in_expr |= database.json_contains(\n                            self._domain_column(op, raw_column, key),\n                            dumps(v))\n                    if operator.startswith('not'):\n                        in_expr = ~in_expr\n                    expression = in_expr\n                except NotImplementedError:\n                    pass\n        expression = self._domain_add_null(column, operator, value, expression)\n        return expression\n\n    def convert_order(self, name, tables, Model):\n        fname, _, key = name.partition('.')\n        if not key:\n            return super().convert_order(fname, tables, Model)\n        database = Transaction().database\n        table, _ = tables[None]\n        column = self.sql_column(table)\n        return [database.json_get(column, key)]\n\n    def definition(self, model, language):\n        definition = super().definition(model, language)\n        definition['schema_model'] = self.schema_model\n        return definition\n\n\nclass TranslatedDict(object):\n    'A descriptor for translated values of Dict field'\n\n    def __init__(self, name, type_):\n        assert type_ in ['keys', 'values']\n        self.name = name\n        self.type_ = type_\n\n    def __get__(self, inst, cls):\n        if inst is None:\n            return self\n        pool = Pool()\n        schema_model = getattr(cls, self.name).schema_model\n        SchemaModel = pool.get(schema_model)\n\n        value = getattr(inst, self.name)\n        if not value:\n            return value\n\n        domain = []\n        if self.type_ == 'values':\n            domain = [('type_', '=', 'selection')]\n\n        records = []\n        for key_names in grouped_slice(value.keys()):\n            records += SchemaModel.search([\n                    ('name', 'in', key_names),\n                    ] + domain)\n        keys = SchemaModel.get_keys(records)\n\n        if self.type_ == 'keys':\n            return {k['name']: k['string'] for k in keys}\n\n        elif self.type_ == 'values':\n            trans = {k['name']: dict(k['selection']) for k in keys}\n            return {k: v if k not in trans else trans[k].get(v, v)\n                for k, v in value.items()}\n"
  },
  {
    "path": "trytond/model/fields/field.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport warnings\nfrom functools import wraps\n\nimport sql\nfrom sql import (\n    Cast, Column, CombiningQuery, Expression, Literal, Null, Query, Select,\n    operators)\nfrom sql.aggregate import Min\nfrom sql.conditionals import Coalesce, NullIf\nfrom sql.operators import Concat\n\nfrom trytond import backend\nfrom trytond.const import OPERATORS\nfrom trytond.pool import Pool\nfrom trytond.pyson import PYSON, Eval, PYSONDecoder, PYSONEncoder\nfrom trytond.rpc import RPC\nfrom trytond.tools import cached_property\nfrom trytond.tools.string_ import LazyString, StringPartitioned\nfrom trytond.transaction import Transaction\n\n_sql_version = tuple(map(int, sql.__version__.split('.')))\n\n\ndef domain_validate(value):\n    assert isinstance(value, list), 'domain must be a list'\n\n    def test_domain(dom):\n        for arg in dom:\n            if isinstance(arg, str):\n                if arg not in ('AND', 'OR'):\n                    return False\n            elif (isinstance(arg, tuple)\n                or (isinstance(arg, list)\n                    and len(arg) > 2\n                    and ((\n                                isinstance(arg[1], str)\n                                and arg[1] in OPERATORS)\n                        or (\n                                isinstance(arg[1], PYSON)\n                                and arg[1].types() == {str})))):\n                pass\n            elif isinstance(arg, list):\n                if not test_domain(arg):\n                    return False\n        return True\n    assert test_domain(value), 'invalid domain'\n\n\ndef states_validate(value):\n    assert isinstance(value, dict), 'states must be a dict'\n    assert set(value).issubset({'required', 'readonly', 'invisible'}), (\n        'extra keys \"%(keys)s\" in states' % {\n            'keys': set(value) - {'required', 'readonly', 'invisible'},\n            })\n    for state in value:\n        assert isinstance(value[state], (bool, PYSON)), \\\n            'values of states must be PYSON'\n        if hasattr(value[state], 'types'):\n            assert value[state].types() == {bool}, \\\n                'values of states must return boolean'\n\n\ndef depends_validate(value):\n    assert isinstance(value, set), 'depends must be a set'\n\n\ndef context_validate(value):\n    assert isinstance(value, dict), 'context must be a dict'\n\n\ndef size_validate(value):\n    if value is not None:\n        assert isinstance(value, (int, PYSON)), 'size must be PYSON'\n        if hasattr(value, 'types'):\n            assert value.types() <= {int, type(None)}, \\\n                'size must return integer'\n\n\ndef search_order_validate(value):\n    if value is not None:\n        assert isinstance(value, (list, PYSON)), 'search_order must be PYSON'\n        if hasattr(value, 'types'):\n            assert value.types() == {list}, 'search_order must be PYSON'\n\n\ndef _set_value(record, field):\n    try:\n        field, nested = field.split('.', 1)\n    except ValueError:\n        nested = None\n    if field.startswith('_parent_'):\n        field = field[8:]  # Strip '_parent_'\n    if not hasattr(record, field):\n        default = None\n        if hasattr(record, '_defaults') and field in record._defaults:\n            default = record._defaults[field]()\n        setattr(record, field, default)\n    elif nested:\n        parent = getattr(record, field)\n        if parent:\n            _set_value(parent, nested)\n\n\ndef depends(*fields, **kwargs):\n    methods = kwargs.pop('methods', None)\n    assert not kwargs\n\n    def decorator(func):\n        depends = getattr(func, 'depends', set())\n        depends.update(fields)\n        setattr(func, 'depends', depends)\n\n        if methods:\n            depend_methods = getattr(func, 'depend_methods', set())\n            depend_methods.update(methods)\n            setattr(func, 'depend_methods', depend_methods)\n\n        @wraps(func)\n        def wrapper(self, *args, **kwargs):\n            for field in fields:\n                _set_value(self, field)\n            return func(self, *args, **kwargs)\n        return wrapper\n    return decorator\n\n\ndef _iter_eval_fields(value):\n    \"Iterate over evaluated fields\"\n    if isinstance(value, Eval):\n        yield value.basename\n    elif isinstance(value, PYSON):\n        yield from _iter_eval_fields(value.pyson())\n    elif isinstance(value, (list, tuple)):\n        for val in value:\n            yield from _iter_eval_fields(val)\n    elif isinstance(value, dict):\n        for val in value.values():\n            yield from _iter_eval_fields(val)\n\n\ndef get_eval_fields(value):\n    \"Return fields evaluated\"\n    return set(_iter_eval_fields(value))\n\n\ndef instanciate_values(Target, value, **extra):\n    from ..modelstorage import ModelStorage, local_cache\n    kwargs = {}\n    ids = []\n    if issubclass(Target, ModelStorage):\n        kwargs['_local_cache'] = local_cache(Target)\n        kwargs['_ids'] = ids\n\n    def instance(data):\n        if isinstance(data, Target):\n            for k, v in extra.items():\n                setattr(data, k, v)\n            return data\n        elif isinstance(data, dict):\n            if data.get('id', -1) >= 0:\n                values = {}\n                values.update(data)\n                values.update(kwargs)\n                ids.append(data['id'])\n            else:\n                values = data\n            values.update(extra)\n            return Target(**values)\n        else:\n            ids.append(data)\n            return Target(data, **extra, **kwargs)\n    return tuple(instance(x) for x in (value or []))\n\n\ndef instantiate_context(field, record):\n    from ..modelstorage import EvalEnvironment\n    ctx = {}\n    if field.context:\n        pyson_context = PYSONEncoder().encode(field.context)\n        ctx.update(PYSONDecoder(\n                EvalEnvironment(record, record.__class__)).decode(\n                pyson_context))\n    datetime_ = None\n    if getattr(field, 'datetime_field', None):\n        datetime_ = getattr(record, field.datetime_field, None)\n        ctx = {'_datetime': datetime_}\n    return ctx\n\n\ndef on_change_result(record):\n    return record._changed_values\n\n\ndef with_inactive_records(func):\n    @wraps(func)\n    def wrapper(*args, **kwargs):\n        with Transaction().set_context(active_test=False):\n            return func(*args, **kwargs)\n    return wrapper\n\n\nSQL_OPERATORS = {\n    '=': operators.Equal,\n    '!=': operators.NotEqual,\n    'like': operators.Like,\n    'not like': operators.NotLike,\n    'ilike': operators.ILike,\n    'not ilike': operators.NotILike,\n    'in': operators.In,\n    'not in': operators.NotIn,\n    '<=': operators.LessEqual,\n    '>=': operators.GreaterEqual,\n    '<': operators.Less,\n    '>': operators.Greater,\n    }\n\n\ndef sanitize_sql_expression(expression):\n    if isinstance(expression, operators.In) and not expression.right:\n        expression = Literal(False)\n    elif isinstance(expression, operators.NotIn) and not expression.right:\n        expression = Literal(True)\n    return expression\n\n\nclass Field(object):\n    _type = None\n    _sql_type = None\n    _py_type = None\n\n    def __init__(self, string='', help='', required=False, readonly=False,\n            domain=None, states=None, on_change=None,\n            on_change_with=None, depends=None, context=None,\n            loading='eager'):\n        '''\n        :param string: A string for label of the field.\n        :param help: A multi-line help string.\n        :param required: A boolean if ``True`` the field is required.\n        :param readonly: A boolean if ``True`` the field is not editable in\n            the user interface.\n        :param domain: A list that defines a domain constraint.\n        :param states: A dictionary. Possible keys are ``required``,\n            ``readonly`` and ``invisible``. Values are pyson expressions that\n            will be evaluated with record values. This allows to change\n            dynamically the attributes of the field.\n        :param on_change: A list of values. If set, the client will call the\n            method ``on_change_<field_name>`` when the user changes the field\n            value. It then passes this list of values as arguments to the\n            function.\n        :param on_change_with: A list of values. Like ``on_change``, but\n            defined the other way around. The list contains all the fields that\n            must update the current field.\n        :param depends: A set of field name on which this one depends.\n        :param context: A dictionary which will be given to open the relation\n            fields.\n        :param loading: Define how the field must be loaded:\n            ``lazy`` or ``eager``.\n        '''\n        if not isinstance(string, LazyString):\n            assert string, 'a string is required'\n        self.string = string\n        self.help = help\n        self.required = required\n        self.readonly = readonly\n        self.__domain = None\n        self.domain = domain\n        self.__states = None\n        self.states = states or {}\n        self.on_change = set()\n        if on_change:\n            warnings.warn('on_change argument is deprecated, '\n                'use the depends decorator',\n                DeprecationWarning, stacklevel=3)\n            self.on_change.update(on_change)\n        self.on_change_with = set()\n        if on_change_with:\n            warnings.warn('on_change_with argument is deprecated, '\n                'use the depends decorator',\n                DeprecationWarning, stacklevel=3)\n            self.on_change_with.update(on_change_with)\n        self.__depends = None\n        self.depends = depends or set()\n        self.__context = None\n        self.context = context or {}\n        assert loading in ('lazy', 'eager'), \\\n            'loading must be \"lazy\" or \"eager\"'\n        self.loading = loading\n        self.name = None\n\n    @property\n    def string(self):\n        return self.__string\n\n    @string.setter\n    def string(self, value):\n        self.__string = StringPartitioned(value)\n\n    @property\n    def help(self):\n        return self.__help\n\n    @help.setter\n    def help(self, value):\n        self.__help = StringPartitioned(value)\n\n    def _get_domain(self):\n        return self.__domain\n\n    def _set_domain(self, value):\n        if value is None:\n            value = []\n        domain_validate(value)\n        self.__domain = value\n\n    domain = property(_get_domain, _set_domain)\n\n    def _get_states(self):\n        return self.__states\n\n    def _set_states(self, value):\n        states_validate(value)\n        self.__states = value\n\n    states = property(_get_states, _set_states)\n\n    def _get_depends(self):\n        return self.__depends\n\n    def _set_depends(self, value):\n        value = set(value)\n        depends_validate(value)\n        self.__depends = value\n\n    depends = property(_get_depends, _set_depends)\n\n    @cached_property\n    def display_depends(self):\n        depends = get_eval_fields(self.states.get('invisible'))\n        return self.depends | depends\n\n    @cached_property\n    def edition_depends(self):\n        depends = get_eval_fields(self.domain)\n        depends |= get_eval_fields(self.states.get('readonly'))\n        depends |= get_eval_fields(self.states.get('required'))\n        return self.depends | depends\n\n    @cached_property\n    def validation_depends(self):\n        depends = get_eval_fields(self.domain)\n        depends |= get_eval_fields(self.states.get('required'))\n        return self.depends | depends\n\n    def _get_context(self):\n        return self.__context\n\n    def _set_context(self, value):\n        context_validate(value)\n        self.__context = value\n\n    context = property(_get_context, _set_context)\n\n    def __get__(self, inst, cls):\n        if inst is None:\n            return self\n        assert self.name is not None\n        if self.name == 'id':\n            return inst._id\n        return inst.__getattr__(self.name)\n\n    def __set__(self, inst, value):\n        assert self.name is not None\n        if isinstance(value, (Query, Expression)):\n            raise ValueError(\"Can not assign SQL\")\n        if inst._values is None:\n            inst._values = inst._record()\n        if (self._py_type and value is not None\n                and not isinstance(value, self._py_type)):\n            value = self._py_type(value)\n        inst._values[self.name] = value\n\n    def sql_format(self, value):\n        if isinstance(value, (Query, Expression)):\n            return value\n\n        assert self._sql_type is not None\n        database = Transaction().database\n        if (self._py_type and value is not None\n                and not isinstance(value, self._py_type)):\n            value = self._py_type(value)\n        return database.sql_format(self._sql_type, value)\n\n    def sql_type(self):\n        database = Transaction().database\n        return database.sql_type(self._sql_type)\n\n    def sql_cast(self, expression):\n        return Cast(expression, self.sql_type().base)\n\n    def sql_column(self, table):\n        return Column(table, self.name)\n\n    def _domain_column(self, operator, column):\n        return column\n\n    def _domain_value(self, operator, value):\n        if isinstance(value, (Select, CombiningQuery)):\n            return value\n        if operator in ('in', 'not in'):\n            return [self.sql_format(v) for v in value if v is not None]\n        else:\n            return self.sql_format(value)\n\n    def _domain_add_null(self, column, operator, value, expression):\n        if operator in ('in', 'not in'):\n            if (not isinstance(value, (Select, CombiningQuery))\n                    and any(v is None for v in value)):\n                if operator == 'in':\n                    expression |= (column == Null)\n                else:\n                    expression &= (column != Null)\n        return expression\n\n    def convert_domain(self, domain, tables, Model):\n        \"Return a SQL expression for the domain using tables\"\n        table, _ = tables[None]\n        name, operator, value = domain\n        assert name == self.name\n        method = getattr(Model, 'domain_%s' % name, None)\n        if method:\n            return method(domain, tables)\n        Operator = SQL_OPERATORS[operator]\n        column = self.sql_column(table)\n        column = self._domain_column(operator, column)\n        expression = Operator(column, self._domain_value(operator, value))\n        expression = sanitize_sql_expression(expression)\n        expression = self._domain_add_null(column, operator, value, expression)\n        return expression\n\n    def convert_order(self, name, tables, Model):\n        \"Return a SQL expression to order\"\n        assert name == self.name\n        table, _ = tables[None]\n        method = getattr(Model, 'order_%s' % name, None)\n        if method:\n            return method(tables)\n        else:\n            return [self.sql_column(table)]\n\n    def set_rpc(self, model):\n        for attribute, result in (\n                ('on_change', on_change_result),\n                ('on_change_with', None),\n                ):\n            if not getattr(self, attribute):\n                continue\n            func_name = '%s_%s' % (attribute, self.name)\n            assert hasattr(model, func_name), \\\n                'Missing %s on model %s' % (func_name, model.__name__)\n            model.__rpc__.setdefault(\n                func_name, RPC(instantiate=0, result=result))\n\n    def definition(self, model, language):\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        encoder = PYSONEncoder()\n        definition = {\n            'context': encoder.encode(self.context),\n            'loading': self.loading,\n            'name': self.name,\n            'on_change': list(self.on_change),\n            'on_change_with': list(self.on_change_with),\n            'readonly': self.readonly,\n            'required': self.required,\n            'states': encoder.encode(self.states),\n            'type': self._type,\n            'domain': encoder.encode(self.domain),\n            'searchable': hasattr(model, 'search'),\n            'sortable': hasattr(model, 'search'),\n            }\n\n        # Add id to on_change's if they are not cached\n        # Not having the id increase the efficiency of the cache\n        for method in ['on_change', 'on_change_with']:\n            changes = definition[method]\n            if changes:\n                method_name = method + '_' + self.name\n                if not model.__rpc__[method_name].cache:\n                    changes.append('id')\n\n                for name in changes:\n                    target = model\n                    if '.' in name:\n                        prefix, _ = name.rsplit('.', 1)\n                        prefix += '.'\n                    else:\n                        prefix = ''\n                    while name.startswith('_parent_'):\n                        field, name = name.split('.', 1)\n                        target = target._fields[field[8:]].get_target()\n                    field = target._fields[name]\n                    if field and field.context:\n                        eval_fields = get_eval_fields(field.context)\n                        for context_field_name in eval_fields:\n                            prefix_ctx_field_name = (\n                                prefix + context_field_name)\n                            if (context_field_name in field.depends\n                                    and prefix_ctx_field_name not in changes):\n                                changes.append(prefix_ctx_field_name)\n\n        name = '%s,%s' % (model.__name__, self.name)\n        for attr, ttype in [('string', 'field'), ('help', 'help')]:\n            definition[attr] = ''\n            for source in getattr(self, attr):\n                if not isinstance(source, LazyString):\n                    source = (\n                        Translation.get_source(name, ttype, language, source)\n                        or source)\n                definition[attr] += source\n        return definition\n\n    def definition_translations(self, model, language):\n        \"Returns sources used for definition\"\n        name = '%s,%s' % (model.__name__, self.name)\n        translations = []\n        for attr, ttype in [('string', 'field'), ('help', 'help')]:\n            for source in getattr(self, attr):\n                if not isinstance(source, LazyString):\n                    translations.append((name, ttype, language, source))\n        return translations\n\n\nclass FieldTranslate(Field):\n\n    def _get_translation_join(\n            self, Model, name, translation, model, table, from_, language,\n            domain=None):\n        if Model.__name__ == 'ir.model.field':\n            pool = Pool()\n            IrModel = pool.get('ir.model')\n            ModelData = pool.get('ir.model.data')\n            ModelField = pool.get('ir.model.field')\n            Translation = pool.get('ir.translation')\n            model = IrModel.__table__()\n            model_data = ModelData.__table__()\n            model_field = ModelField.__table__()\n            msg_trans = Translation.__table__()\n            if name == 'field_description':\n                type_ = 'field'\n            else:\n                type_ = 'help'\n            translation = translation.select(\n                translation.id.as_('id'),\n                translation.res_id.as_('res_id'),\n                translation.value.as_('value'),\n                translation.name.as_('name'),\n                translation.lang.as_('lang'),\n                translation.type.as_('type'),\n                translation.fuzzy.as_('fuzzy'),\n                )\n            translation |= (msg_trans\n                .join(model_data,\n                    condition=(msg_trans.res_id == model_data.db_id)\n                    & (model_data.model == 'ir.message')\n                    & (msg_trans.name == 'ir.message,text'))\n                .join(model_field,\n                    condition=Concat(\n                        Concat(model_data.module, '.'),\n                        model_data.fs_id) == getattr(model_field, name))\n                .join(model,\n                    condition=model_field.model == model.id)\n                .select(\n                    msg_trans.id.as_('id'),\n                    Literal(-1).as_('res_id'),\n                    msg_trans.value.as_('value'),\n                    Concat(\n                        Concat(model.model, ','),\n                        model_field.name).as_('name'),\n                    msg_trans.lang.as_('lang'),\n                    Literal(type_).as_('type'),\n                    msg_trans.fuzzy.as_('fuzzy'),\n                    ))\n        if backend.name == 'postgresql' and _sql_version >= (1, 1, 0):\n            query = translation.select(\n                translation.res_id.as_('res_id'),\n                translation.value.as_('value'),\n                translation.name.as_('name'),\n                distinct=True,\n                distinct_on=[translation.res_id, translation.name],\n                order_by=[\n                    translation.res_id,\n                    translation.name,\n                    translation.id.desc])\n        else:\n            query = translation.select(\n                translation.res_id.as_('res_id'),\n                Min(translation.value).as_('value'),\n                translation.name.as_('name'),\n                group_by=[translation.res_id, translation.name])\n        if Model.__name__ == 'ir.model':\n            name_ = Concat(Concat(table.model, ','), name)\n            type_ = 'model'\n            res_id = -1\n        elif Model.__name__ == 'ir.model.field':\n            from_ = from_.join(model, 'LEFT',\n                condition=model.id == table.model)\n            name_ = Concat(Concat(model.model, ','), table.name)\n            if name == 'field_description':\n                type_ = 'field'\n            else:\n                type_ = 'help'\n            res_id = -1\n        else:\n            name_ = '%s,%s' % (Model.__name__, name)\n            type_ = 'model'\n            res_id = table.id\n        query.where = (\n            (translation.lang == language)\n            & (translation.type == type_)\n            & (translation.fuzzy == Literal(False))\n            )\n        if domain:\n            _, operator, value = domain\n            Operator = SQL_OPERATORS[operator]\n            column = self._domain_column(operator, translation.value)\n            expression = Operator(column, self._domain_value(operator, value))\n            expression = sanitize_sql_expression(expression)\n            expression = self._domain_add_null(\n                column, operator, value, expression)\n            query.where &= expression\n        return query, from_.join(query, 'LEFT',\n            condition=(query.res_id == res_id) & (query.name == name_))\n\n    def _get_translation_column(self, Model, name, domain=None):\n        from trytond.ir.lang import get_parent_language\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        IrModel = pool.get('ir.model')\n\n        table = join = Model.__table__()\n        model = IrModel.__table__()\n        language = Transaction().language\n        column = None\n        while language:\n            translation = Translation.__table__()\n            translation, join = self._get_translation_join(\n                Model, name, translation, model, table, join, language,\n                domain=domain)\n            column = Coalesce(NullIf(column, ''), translation.value)\n            language = get_parent_language(language)\n        return table, join, column\n\n    def convert_domain(self, domain, tables, Model):\n        if not self.translate:\n            return super(FieldTranslate, self).convert_domain(\n                domain, tables, Model)\n        table, _ = tables[None]\n        name, operator, value = domain\n        model, join, column = self._get_translation_column(\n            Model, name, domain=domain)\n        column = Coalesce(NullIf(column, ''), self.sql_column(model))\n        column = self._domain_column(operator, column)\n        Operator = SQL_OPERATORS[operator]\n        assert name == self.name\n        where = Operator(column, self._domain_value(operator, value))\n        if isinstance(where, operators.In) and not where.right:\n            where = Literal(False)\n        elif isinstance(where, operators.NotIn) and not where.right:\n            where = Literal(True)\n        where = self._domain_add_null(column, operator, value, where)\n        return table.id.in_(join.select(model.id, where=where))\n\n    def _get_translation_order(self, tables, Model, name):\n        from trytond.ir.lang import get_parent_language\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        IrModel = pool.get('ir.model')\n        table, _ = tables[None]\n        join = table\n        language = Transaction().language\n        column = None\n        while language:\n            key = name + '.translation-' + language\n            if key not in tables:\n                translation = Translation.__table__()\n                model = IrModel.__table__()\n                translation, join = self._get_translation_join(\n                    Model, name, translation, model, table, table, language)\n                if join.left == table:\n                    tables[key] = {\n                        None: (join.right, join.condition),\n                        }\n                else:\n                    tables[key] = {\n                        None: (join.left.right, join.left.condition),\n                        'translation': {\n                            None: (join.right, join.condition),\n                            },\n                        }\n            else:\n                if 'translation' not in tables[key]:\n                    translation, _ = tables[key][None]\n                else:\n                    translation, _ = tables[key]['translation'][None]\n            column = Coalesce(NullIf(column, ''), translation.value)\n            language = get_parent_language(language)\n        return column\n\n    def convert_order(self, name, tables, Model):\n        if not self.translate:\n            return super().convert_order(name, tables, Model)\n        assert name == self.name\n        table, _ = tables[None]\n        column = self._get_translation_order(tables, Model, name)\n        return [Coalesce(NullIf(column, ''), self.sql_column(table))]\n\n    def definition(self, model, language):\n        definition = super().definition(model, language)\n        definition['translate'] = self.translate\n        return definition\n"
  },
  {
    "path": "trytond/model/fields/float.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.pyson import PYSON, PYSONEncoder\nfrom trytond.tools import cached_property\n\nfrom .field import Field, get_eval_fields\n\n\ndef digits_validate(value):\n    if value:\n        assert isinstance(value, (tuple, str)), \\\n                'digits must be a tuple or a string'\n        if isinstance(value, tuple):\n            for i in value:\n                assert isinstance(i, (int, PYSON)), \\\n                    'digits must be tuple of integers or PYSON'\n                if isinstance(i, PYSON):\n                    assert i.types() == {int}, \\\n                        'PYSON digits must return an integer'\n\n\ndef _get_digits_depends(field):\n    if isinstance(field.digits, str):\n        return {field.digits}\n    else:\n        return get_eval_fields(field.digits)\n\n\nclass Float(Field):\n    '''\n    Define a float field (``float``).\n    '''\n    _type = 'float'\n    _sql_type = 'FLOAT'\n    _py_type = float\n\n    def __init__(self, string='', digits=None, help='', required=False,\n            readonly=False, domain=None, states=None,\n            on_change=None, on_change_with=None, depends=None,\n            context=None, loading='eager'):\n        '''\n        :param digits: a list of two integers defining the total\n            of digits and the number of decimals of the float.\n        '''\n        super(Float, self).__init__(string=string, help=help,\n            required=required, readonly=readonly, domain=domain, states=states,\n            on_change=on_change, on_change_with=on_change_with,\n            depends=depends, context=context, loading=loading)\n        self.__digits = None\n        self.digits = digits\n\n    __init__.__doc__ += Field.__init__.__doc__\n\n    def _get_digits(self):\n        return self.__digits\n\n    def _set_digits(self, value):\n        digits_validate(value)\n        self.__digits = value\n\n    digits = property(_get_digits, _set_digits)\n\n    def definition(self, model, language):\n        encoder = PYSONEncoder()\n        definition = super().definition(model, language)\n        definition['digits'] = encoder.encode(self.digits)\n        return definition\n\n    @cached_property\n    def display_depends(self):\n        return super().display_depends | _get_digits_depends(self)\n\n    @cached_property\n    def edition_depends(self):\n        return super().edition_depends | _get_digits_depends(self)\n\n    @cached_property\n    def validation_depends(self):\n        return super().validation_depends | _get_digits_depends(self)\n"
  },
  {
    "path": "trytond/model/fields/function.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport copy\nimport inspect\nfrom functools import wraps\n\nfrom trytond.i18n import gettext\nfrom trytond.model.fields.field import Field\nfrom trytond.tools import is_instance_method\nfrom trytond.transaction import Transaction\n\n\ndef getter_context(func):\n    @wraps(func)\n    def wrapper(self, *args, **kwargs):\n        if not self.getter_with_context:\n            transaction = Transaction()\n            context = {\n                k: v for k, v in transaction.context.items()\n                if k in transaction.cache_keys}\n            with transaction.reset_context(), \\\n                    transaction.set_context(context):\n                return func(self, *args, **kwargs)\n        else:\n            return func(self, *args, **kwargs)\n    return wrapper\n\n\nclass Function(Field):\n    '''\n    Define function field (any).\n    '''\n\n    def __init__(self, field, getter, setter=None, searcher=None,\n            getter_with_context=True, loading='lazy'):\n        '''\n        :param field: The field of the function.\n        :param getter: The name of the function for getting values.\n        :param setter: The name of the function to set value.\n        :param searcher: The name of the function to search.\n        :param loading: Define how the field must be loaded:\n            ``lazy`` or ``eager``.\n        '''\n        assert isinstance(field, Field)\n        self._field = field\n        self._type = field._type\n        self.getter = getter\n        self.getter_with_context = getter_with_context\n        self.setter = setter\n        if not self.setter:\n            self._field.readonly = True\n        self.searcher = searcher\n        assert loading in ('lazy', 'eager'), \\\n            'loading must be \"lazy\" or \"eager\"'\n        self.loading = loading\n\n    __init__.__doc__ += Field.__init__.__doc__\n\n    def __copy__(self):\n        return Function(copy.copy(self._field), self.getter,\n            setter=self.setter, searcher=self.searcher,\n            getter_with_context=self.getter_with_context,\n            loading=self.loading)\n\n    def __deepcopy__(self, memo):\n        return Function(copy.deepcopy(self._field, memo), self.getter,\n            setter=self.setter, searcher=self.searcher,\n            getter_with_context=self.getter_with_context,\n            loading=self.loading)\n\n    def __getattr__(self, name):\n        return getattr(self._field, name)\n\n    def __getitem__(self, name):\n        return self._field[name]\n\n    def __setattr__(self, name, value):\n        if name in ('_field', '_type', 'getter', 'setter', 'searcher', 'name'):\n            object.__setattr__(self, name, value)\n            if name != 'name':\n                return\n        setattr(self._field, name, value)\n\n    def set_rpc(self, model):\n        self._field.set_rpc(model)\n\n    def sql_format(self, value):\n        return self._field.sql_format(value)\n\n    def sql_type(self):\n        return None\n\n    def convert_domain(self, domain, tables, Model):\n        name, operator, value = domain[:3]\n        assert name.startswith(self.name)\n        method = getattr(Model, 'domain_%s' % self.name, None)\n        if method:\n            return method(domain, tables)\n        if self.searcher:\n            return getattr(Model, self.searcher)(self.name, domain)\n        raise NotImplementedError(gettext(\n                'ir.msg_search_function_missing',\n                **Model.__names__(self.name)))\n\n    @getter_context\n    def get(self, ids, Model, name, values=None):\n        '''\n        Call the getter.\n        If the function has ``names`` in the function definition then\n        it will call it with a list of name.\n        '''\n        with Transaction().set_context(_check_access=False):\n            method = getattr(Model, self.getter)\n            instance_method = is_instance_method(Model, self.getter)\n            multiple = self.getter_multiple(method)\n\n            records = Model.browse(ids)\n            for record, value in zip(records, values):\n                assert record.id == value['id']\n                for fname, val in value.items():\n                    field = Model._fields.get(fname)\n                    if field and field._type not in {\n                            'many2one', 'reference',\n                            'one2many', 'many2many', 'one2one'}:\n                        record._local_cache[record.id][fname] = val\n\n            def call(name):\n                if not instance_method:\n                    return method(records, name)\n                else:\n                    return dict((r.id, method(r, name)) for r in records)\n            if isinstance(name, list):\n                names = name\n                if multiple:\n                    return call(names)\n                return dict((name, call(name)) for name in names)\n            else:\n                if multiple:\n                    name = [name]\n                return call(name)\n\n    def set(self, Model, name, ids, value, *args):\n        '''\n        Call the setter.\n        '''\n        with Transaction().set_context(_check_access=False):\n            if self.setter:\n                # TODO change setter API to use sequence of records, value\n                setter = getattr(Model, self.setter)\n                args = iter((ids, value) + args)\n                for ids, value in zip(args, args):\n                    setter(Model.browse(ids), name, value)\n            else:\n                raise NotImplementedError(gettext(\n                        'ir.msg_setter_function_missing',\n                        **Model.__names__(self.name)))\n\n    def __get__(self, inst, cls):\n        try:\n            return super().__get__(inst, cls)\n        except AttributeError:\n            if not self.getter.startswith('on_change_with'):\n                raise\n            value = getattr(inst, self.getter)(self.name)\n            # Use temporary instance to not modify instance values\n            temp_inst = cls()\n            # Set the value to have proper type\n            self.__set__(temp_inst, value)\n            return super().__get__(temp_inst, cls)\n\n    def __set__(self, inst, value):\n        self._field.__set__(inst, value)\n\n    def definition(self, model, language):\n        definition = self._field.definition(model, language)\n        definition['searchable'] &= (\n            bool(self.searcher) or hasattr(model, 'domain_' + self.name))\n        definition['sortable'] &= hasattr(model, 'order_' + self.name)\n        return definition\n\n    def getter_multiple(self, method):\n        \"Returns True if getter function accepts multiple fields\"\n        signature = inspect.signature(method)\n        return 'names' in signature.parameters\n\n\nfor name in [\n        'string', 'help', 'domain', 'states', 'depends', 'display_depends',\n        'edition_depends', 'validation_depends', 'context']:\n    def getter(name):\n        return lambda self: getattr(self._field, name)\n\n    def setter(name):\n        return lambda self, value: setattr(self._field, name, value)\n\n    setattr(Function, name, property(getter(name), setter(name)))\n\n\nclass MultiValue(Function):\n\n    def __init__(self, field, loading='lazy'):\n        super(MultiValue, self).__init__(\n            field, '_multivalue_getter', setter='_multivalue_setter',\n            loading=loading)\n\n    def __copy__(self):\n        return MultiValue(copy.copy(self._field), loading=self.loading)\n\n    def __deepcopy__(self, memo):\n        return MultiValue(\n            copy.deepcopy(self._field, memo), loading=self.loading)\n"
  },
  {
    "path": "trytond/model/fields/integer.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom .field import Field\n\n\nclass Integer(Field):\n    '''\n    Define an integer field (``int``).\n    '''\n    _type = 'integer'\n    _sql_type = 'INTEGER'\n    _py_type = int\n\n\nclass BigInteger(Integer):\n    '''\n    Define an integer field (``long``).\n    '''\n    _type = 'biginteger'\n    _sql_type = 'BIGINT'\n"
  },
  {
    "path": "trytond/model/fields/many2many.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom collections import defaultdict\nfrom itertools import chain\n\nfrom sql import Literal, Null\nfrom sql.conditionals import Coalesce\n\nfrom trytond.pool import Pool\nfrom trytond.pyson import PYSONEncoder\nfrom trytond.tools import cached_property, grouped_slice\nfrom trytond.transaction import Transaction\n\nfrom .field import (\n    Field, context_validate, domain_validate, get_eval_fields,\n    instanciate_values, instantiate_context, search_order_validate,\n    size_validate)\nfrom .function import Function\n\n\nclass Many2Many(Field):\n    '''\n    Define many2many field (``list``).\n    '''\n    _type = 'many2many'\n\n    def __init__(self, relation_name, origin, target, string='', order=None,\n            datetime_field=None, size=None, search_order=None,\n            search_context=None, help='', required=False, readonly=False,\n            domain=None, filter=None, states=None, on_change=None,\n            on_change_with=None, depends=None, context=None, loading='lazy'):\n        '''\n        :param relation_name: The name of the relation model\n            or the name of the target model for ModelView only.\n        :param origin: The name of the field to store origin ids.\n        :param target: The name of the field to store target ids.\n        :param order:  a list of tuples that are constructed like this:\n            ``('field name', 'DESC|ASC')``\n            allowing to specify the order of result\n        :param datetime_field: The name of the field that contains the datetime\n            value to read the target records.\n        :param search_order: The order to use when searching for a record\n        :param search_context: The context to use when searching for a record\n        :param filter: A domain to filter target records.\n        '''\n        super(Many2Many, self).__init__(string=string, help=help,\n            required=required, readonly=readonly, domain=domain, states=states,\n            on_change=on_change, on_change_with=on_change_with,\n            depends=depends, context=context, loading=loading)\n        self.relation_name = relation_name\n        self.origin = origin\n        self.target = target\n        self.order = order\n        self.datetime_field = datetime_field\n        self.__size = None\n        self.size = size\n        self.__search_order = None\n        self.search_order = search_order\n        self.__search_context = None\n        self.search_context = search_context or {}\n        self.__filter = None\n        self.filter = filter\n\n    __init__.__doc__ += Field.__init__.__doc__\n\n    def _get_size(self):\n        return self.__size\n\n    def _set_size(self, value):\n        size_validate(value)\n        self.__size = value\n\n    size = property(_get_size, _set_size)\n\n    @property\n    def search_order(self):\n        return self.__search_order\n\n    @search_order.setter\n    def search_order(self, value):\n        search_order_validate(value)\n        self.__search_order = value\n\n    @property\n    def search_context(self):\n        return self.__search_context\n\n    @search_context.setter\n    def search_context(self, value):\n        context_validate(value)\n        self.__search_context = value\n\n    @property\n    def filter(self):\n        return self.__filter\n\n    @filter.setter\n    def filter(self, value):\n        if value is not None:\n            domain_validate(value)\n        self.__filter = value\n\n    @property\n    def add_remove(self):\n        return self.domain\n\n    @cached_property\n    def display_depends(self):\n        depends = super().display_depends\n        if self.datetime_field:\n            depends.add(self.datetime_field)\n        return depends\n\n    @cached_property\n    def edition_depends(self):\n        depends = super().edition_depends\n        depends |= get_eval_fields(self.size)\n        return depends\n\n    @cached_property\n    def validation_depends(self):\n        depends = super().validation_depends\n        depends |= get_eval_fields(self.size)\n        return depends\n\n    def sql_type(self):\n        return None\n\n    def get(self, ids, model, name, values=None):\n        '''\n        Return target records ordered.\n        '''\n        if values is None:\n            values = {}\n        res = {}\n        if not ids:\n            return res\n        for i in ids:\n            res[i] = []\n\n        Relation = self.get_relation()\n        origin_field = Relation._fields[self.origin]\n\n        if (not isinstance(origin_field, Function)\n                or hasattr(Relation, 'order_' + self.field)):\n            order = [(self.origin, None)]\n        else:\n            order = []\n        if self.order is None:\n            order += [(self.target, None)]\n        else:\n            order += self.order\n\n        relations = []\n        for sub_ids in grouped_slice(ids):\n            if origin_field._type == 'reference':\n                references = ['%s,%s' % (model.__name__, x) for x in sub_ids]\n                clause = [(self.origin, 'in', references)]\n            else:\n                clause = [(self.origin, 'in', list(sub_ids))]\n            clause += [(self.target, '!=', None)]\n            if self.filter:\n                clause.append((self.target, 'where', self.filter))\n            relations.append(Relation.search(clause, order=order))\n        relations = Relation.browse(list(chain(*relations)))\n\n        for relation in relations:\n            origin_id = getattr(relation, self.origin).id\n            res[origin_id].append(getattr(relation, self.target).id)\n        return dict((key, tuple(value)) for key, value in res.items())\n\n    def set(self, Model, name, ids, values, *args):\n        '''\n        Set the values.\n\n        values: A list of tuples:\n            (``create``, ``[{<field name>: value}, ...]``),\n            (``write``, [``<ids>``, ``{<field name>: value}``, ...]),\n            (``delete``, ``<ids>``),\n            (``remove``, ``<ids>``),\n            (``add``, ``<ids>``),\n            (``copy``, ``<ids>``, ``[{<field name>: value}, ...]``)\n        '''\n        Relation = self.get_relation()\n        Target = self.get_target()\n        origin_field = Relation._fields[self.origin]\n        relation_to_create = []\n        relation_to_delete = []\n        target_to_write = []\n        target_to_delete = []\n\n        def search_clause(ids):\n            if origin_field._type == 'reference':\n                references = ['%s,%s' % (Model.__name__, x) for x in ids]\n                return (self.origin, 'in', references)\n            else:\n                return (self.origin, 'in', ids)\n\n        def field_value(record_id):\n            if origin_field._type == 'reference':\n                return '%s,%s' % (Model.__name__, record_id)\n            else:\n                return record_id\n\n        def create(ids, vlist):\n            for record_id in ids:\n                for new in Target.create(vlist):\n                    relation_to_create.append({\n                            self.origin: field_value(record_id),\n                            self.target: new.id,\n                            })\n\n        def write(_, *args):\n            actions = iter(args)\n            target_to_write.extend(sum(((Target.browse(ids), values)\n                        for ids, values in zip(actions, actions)), ()))\n\n        def delete(_, target_ids):\n            target_to_delete.extend(Target.browse(target_ids))\n\n        def add(ids, target_ids):\n            target_ids = list(map(int, target_ids))\n            if not target_ids:\n                return\n            existing_ids = set()\n            for sub_ids in grouped_slice(target_ids):\n                relations = Relation.search([\n                        search_clause(ids),\n                        (self.target, 'in', list(sub_ids)),\n                        ])\n                for relation in relations:\n                    existing_ids.add((\n                            getattr(relation, self.origin).id,\n                            getattr(relation, self.target).id))\n            for new_id in target_ids:\n                for record_id in ids:\n                    if (record_id, new_id) in existing_ids:\n                        continue\n                    relation_to_create.append({\n                            self.origin: field_value(record_id),\n                            self.target: new_id,\n                            })\n\n        def remove(ids, target_ids):\n            target_ids = list(map(int, target_ids))\n            if not target_ids:\n                return\n            for sub_ids in grouped_slice(target_ids):\n                relation_to_delete.extend(Relation.search([\n                            search_clause(ids),\n                            (self.target, 'in', list(sub_ids)),\n                            ]))\n\n        def copy(ids, copy_ids, default=None):\n            copy_ids = list(map(int, copy_ids))\n\n            if default is None:\n                default = {}\n            default = default.copy()\n            copies = Target.browse(copy_ids)\n            for new in Target.copy(copies, default=default):\n                for record_id in ids:\n                    relation_to_create.append({\n                            self.origin: field_value(record_id),\n                            self.target: new.id,\n                            })\n\n        actions = {\n            'create': create,\n            'write': write,\n            'delete': delete,\n            'add': add,\n            'remove': remove,\n            'copy': copy,\n            }\n        args = iter((ids, values) + args)\n        for ids, values in zip(args, args):\n            if not values:\n                continue\n            for value in values:\n                action = value[0]\n                args = value[1:]\n                actions[action](ids, *args)\n        # Ordered operations to avoid uniqueness/overlapping constraints\n        if relation_to_delete:\n            Relation.delete(relation_to_delete)\n        if target_to_delete:\n            Target.delete(target_to_delete)\n        if target_to_write:\n            Target.write(*target_to_write)\n        if relation_to_create:\n            Relation.create(relation_to_create)\n\n    def get_relation(self):\n        \"Return the relation model\"\n        return Pool().get(self.relation_name)\n\n    def get_target(self):\n        'Return the target model'\n        Relation = self.get_relation()\n        if not self.target:\n            return Relation\n        return Relation._fields[self.target].get_target()\n\n    def __set__(self, inst, value):\n        Target = self.get_target()\n        ctx = instantiate_context(self, inst)\n        with Transaction().set_context(ctx):\n            records = instanciate_values(Target, value)\n        super(Many2Many, self).__set__(inst, records)\n\n    def delete(self, inst, records):\n        records = set(records)\n        if inst._deleted is None:\n            inst._deleted = defaultdict(set)\n        inst._deleted[self.name].update(map(int, records))\n        setattr(\n            inst, self.name,\n            [r for r in getattr(inst, self.name) if r not in records])\n\n    def convert_domain_tree(self, domain, tables):\n        Target = self.get_target()\n        table, _ = tables[None]\n        name, operator, ids = domain\n        ids = set(ids)  # Ensure it is a set for concatenation\n\n        def get_child(ids):\n            if not ids:\n                return set()\n            children = Target.search([\n                    (name, 'in', ids),\n                    (name, '!=', None),\n                    ], order=[])\n            child_ids = get_child(set(c.id for c in children))\n            return ids | child_ids\n\n        def get_parent(ids):\n            if not ids:\n                return set()\n            parent_ids = set()\n            for parent in Target.browse(ids):\n                parent_ids.update(p.id for p in getattr(parent, name))\n            return ids | get_parent(parent_ids)\n\n        if operator.endswith('child_of'):\n            ids = list(get_child(ids))\n        else:\n            ids = list(get_parent(ids))\n        if not ids:\n            expression = Literal(False)\n        else:\n            expression = table.id.in_(ids)\n        if operator.startswith('not'):\n            return ~expression\n        return expression\n\n    def convert_domain(self, domain, tables, Model):\n        from ..modelsql import convert_from\n        pool = Pool()\n        Rule = pool.get('ir.rule')\n        Target = self.get_target()\n        Relation = self.get_relation()\n        transaction = Transaction()\n        table, _ = tables[None]\n        name, operator, value = domain[:3]\n        assert operator not in {'where', 'not where'} or '.' not in name\n\n        if Relation._history and transaction.context.get('_datetime'):\n            relation = Relation.__table_history__()\n            history_where = (\n                Coalesce(relation.write_date, relation.create_date)\n                <= transaction.context['_datetime'])\n        else:\n            relation = Relation.__table__()\n            history_where = None\n        origin_field = Relation._fields[self.origin]\n        origin = getattr(Relation, self.origin).sql_column(relation)\n        origin_where = None\n        if origin_field._type == 'reference':\n            origin_where = origin.like(Model.__name__ + ',%')\n            origin = origin_field.sql_id(origin, Relation)\n\n        target = getattr(Relation, self.target).sql_column(relation)\n        if '.' not in name:\n            if operator.endswith('child_of') or operator.endswith('parent_of'):\n                if Target != Model:\n                    if operator.endswith('child_of'):\n                        target_operator = 'child_of'\n                    else:\n                        target_operator = 'parent_of'\n                    target_domain = [\n                        (domain[3], target_operator, value),\n                        ]\n                    if self.filter:\n                        target_domain.append(self.filter)\n                    query = Target.search(target_domain, order=[], query=True)\n                    where = (target.in_(query) & (origin != Null))\n                    if history_where:\n                        where &= history_where\n                    if origin_where:\n                        where &= origin_where\n                    query = relation.select(origin, where=where)\n                    expression = table.id.in_(query)\n                    if operator.startswith('not'):\n                        return ~expression\n                    return expression\n                if isinstance(value, str):\n                    target_domain = [('rec_name', 'ilike', value)]\n                    if self.filter:\n                        target_domain.append(self.filter)\n                    targets = Target.search(target_domain, order=[])\n                    ids = [t.id for t in targets]\n                else:\n                    if not isinstance(value, (list, tuple)):\n                        ids = [value]\n                    else:\n                        ids = value\n                    if self.filter:\n                        targets = Target.search(\n                            [('id', 'in', ids), self.filter], order=[])\n                        ids = [t.id for t in targets]\n                if not ids:\n                    expression = Literal(False)\n                    if operator.startswith('not'):\n                        return ~expression\n                    return expression\n                else:\n                    return self.convert_domain_tree(\n                        (name, operator, ids), tables)\n\n            if value is None:\n                where = origin != value\n                if history_where:\n                    where &= history_where\n                if origin_where:\n                    where &= origin_where\n                if self.filter:\n                    query = Target.search(self.filter, order=[], query=True)\n                    where &= target.in_(query)\n                query = relation.select(origin, where=where)\n                expression = ~table.id.in_(query)\n                if operator == '!=':\n                    return ~expression\n                return expression\n            else:\n                if isinstance(value, str):\n                    target_name = 'rec_name'\n                else:\n                    target_name = 'id'\n        else:\n            _, target_name = name.split('.', 1)\n\n        if operator not in {'where', 'not where'}:\n            relation_domain = [('%s.%s' % (self.target, target_name),)\n                + tuple(domain[1:])]\n            if origin_field._type == 'reference':\n                relation_domain.append(\n                    (self.origin, 'like', Model.__name__ + ',%'))\n        else:\n            relation_domain = [self.target, 'where', value]\n        rule_domain = Rule.domain_get(Relation.__name__, mode='read')\n        if rule_domain:\n            relation_domain = [relation_domain, rule_domain]\n        if self.filter:\n            relation_domain = [\n                relation_domain,\n                (self.target, 'where', self.filter),\n                ]\n        relation_tables = {\n            None: (relation, None),\n            }\n        tables, expression = Relation.search_domain(\n            relation_domain, tables=relation_tables)\n        query_table = convert_from(None, relation_tables)\n        query = query_table.select(origin, where=expression)\n        expression = table.id.in_(query)\n        if operator == 'not where':\n            expression = ~expression\n        elif operator.startswith('!') or operator.startswith('not '):\n            expression |= ~table.id.in_(relation.select(origin))\n        return expression\n\n    def definition(self, model, language):\n        encoder = PYSONEncoder()\n        definition = super().definition(model, language)\n        if self.add_remove is not None:\n            definition['add_remove'] = encoder.encode(self.add_remove)\n        definition['datetime_field'] = self.datetime_field\n        if self.filter:\n            definition['domain'] = encoder.encode(\n                ['AND', self.domain, self.filter])\n        definition['relation'] = self.get_target().__name__\n        definition['search_context'] = encoder.encode(self.search_context)\n        definition['search_order'] = encoder.encode(self.search_order)\n        definition['sortable'] &= hasattr(model, 'order_' + self.name)\n        definition['order'] = (\n            getattr(self.get_target(), '_order', None)\n            if self.order is None else self.order)\n        if self.size is not None:\n            definition['size'] = encoder.encode(self.size)\n        return definition\n"
  },
  {
    "path": "trytond/model/fields/many2one.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom sql import As, Column, Expression, Literal, Query, With\nfrom sql.aggregate import Max\nfrom sql.conditionals import Coalesce\nfrom sql.operators import Or\n\nfrom trytond.pool import Pool\nfrom trytond.pyson import PYSONEncoder\nfrom trytond.tools import cached_property, reduce_ids\nfrom trytond.transaction import Transaction\n\nfrom .field import (\n    Field, context_validate, instantiate_context, search_order_validate,\n    with_inactive_records)\n\n\nclass Many2One(Field):\n    '''\n    Define many2one field (``int``).\n    '''\n    _type = 'many2one'\n    _sql_type = 'INTEGER'\n\n    def __init__(self, model_name, string='', left=None, right=None, path=None,\n            ondelete='SET NULL', datetime_field=None, target_search='join',\n            search_order=None, search_context=None, help='', required=False,\n            readonly=False, domain=None, states=None,\n            on_change=None, on_change_with=None, depends=None, context=None,\n            loading='eager'):\n        '''\n        :param model_name: The name of the target model.\n        :param left: The name of the field to store the left value for\n            Modified Preorder Tree Traversal.\n            See http://en.wikipedia.org/wiki/Tree_traversal\n        :param right: The name of the field to store the right value. See left\n        :param path: The name of the field used to store the path.\n        :param ondelete: Define the behavior of the record when the target\n            record is deleted. (``CASCADE``, ``RESTRICT``, ``SET NULL``)\n            ``SET NULL`` will be changed into ``RESTRICT`` if required is set.\n        :param datetime_field: The name of the field that contains the datetime\n            value to read the target record.\n        :param target_search: The kind of target search 'subquery' or 'join'\n        :param search_order: The order to use when searching for a record\n        :param search_context: The context to use when searching for a record\n        '''\n        self.__required = required\n        if ondelete not in ('CASCADE', 'RESTRICT', 'SET NULL'):\n            raise Exception('Bad arguments')\n        self.ondelete = ondelete\n        super(Many2One, self).__init__(string=string, help=help,\n            required=required, readonly=readonly, domain=domain, states=states,\n            on_change=on_change, on_change_with=on_change_with,\n            depends=depends, context=context, loading=loading)\n        self.model_name = model_name\n        self.left = left\n        self.right = right\n        self.path = path\n        self.datetime_field = datetime_field\n        assert target_search in ['subquery', 'join']\n        self.target_search = target_search\n        self.__search_order = None\n        self.search_order = search_order\n        self.__search_context = None\n        self.search_context = search_context or {}\n    __init__.__doc__ += Field.__init__.__doc__\n\n    def __get_required(self):\n        return self.__required\n\n    def __set_required(self, value):\n        self.__required = value\n        if value and self.ondelete == 'SET NULL':\n            self.ondelete = 'RESTRICT'\n\n    required = property(__get_required, __set_required)\n\n    @property\n    def search_order(self):\n        return self.__search_order\n\n    @search_order.setter\n    def search_order(self, value):\n        search_order_validate(value)\n        self.__search_order = value\n\n    @property\n    def search_context(self):\n        return self.__search_context\n\n    @search_context.setter\n    def search_context(self, value):\n        context_validate(value)\n        self.__search_context = value\n\n    @cached_property\n    def display_depends(self):\n        depends = super().display_depends\n        if self.datetime_field:\n            depends.add(self.datetime_field)\n        return depends\n\n    def get_target(self):\n        'Return the target Model'\n        return Pool().get(self.model_name)\n\n    def __set__(self, inst, value):\n        Target = self.get_target()\n        if isinstance(value, (dict, int)):\n            ctx = instantiate_context(self, inst)\n            with Transaction().set_context(ctx):\n                if isinstance(value, dict):\n                    value = Target(**value)\n                elif isinstance(value, int):\n                    value = Target(value)\n        assert isinstance(value, (Target, type(None)))\n        super(Many2One, self).__set__(inst, value)\n\n    def sql_format(self, value):\n        assert value is not False\n        if value and not isinstance(value, (Query, Expression)):\n            value = int(value)\n        return super().sql_format(value)\n\n    def convert_domain_path(self, domain, tables):\n        cursor = Transaction().connection.cursor()\n        table, _ = tables[None]\n        name, operator, ids = domain\n        red_sql = reduce_ids(table.id, (i for i in ids if i is not None))\n        Target = self.get_target()\n        path_column = getattr(Target, self.path).sql_column(table)\n        cursor.execute(*table.select(path_column, where=red_sql))\n        if operator.endswith('child_of'):\n            where = Or()\n            for path, in cursor:\n                where.append(path_column.like(path + '%'))\n        else:\n            ids = [int(x) for path, in cursor for x in path.split('/')[:-1]]\n            where = reduce_ids(table.id, ids)\n        if not where:\n            where = Literal(False)\n        if operator.startswith('not'):\n            return ~where\n        return where\n\n    def convert_domain_mptt(self, domain, tables):\n        cursor = Transaction().connection.cursor()\n        table, _ = tables[None]\n        name, operator, ids = domain\n        red_sql = reduce_ids(table.id, (i for i in ids if i is not None))\n        Target = self.get_target()\n        left = getattr(Target, self.left).sql_column(table)\n        right = getattr(Target, self.right).sql_column(table)\n        cursor.execute(*table.select(left, right, where=red_sql))\n        where = Or()\n        for l, r in cursor:\n            if operator.endswith('child_of'):\n                where.append((left >= l) & (right <= r))\n            else:\n                where.append((left <= l) & (right >= r))\n        if not where:\n            where = Literal(False)\n        if operator.startswith('not'):\n            return ~where\n        return where\n\n    def convert_domain_tree(self, domain, tables):\n        Target = self.get_target()\n        target = Target.__table__()\n        table, _ = tables[None]\n        name, operator, ids = domain\n        red_sql = reduce_ids(target.id, (i for i in ids if i is not None))\n\n        if operator.endswith('child_of'):\n            tree = With('id', recursive=True)\n            tree.query = target.select(target.id, where=red_sql)\n            tree.query |= (target\n                .join(tree, condition=Column(target, name) == tree.id)\n                .select(target.id))\n        else:\n            tree = With('id', name, recursive=True)\n            tree.query = target.select(\n                target.id, Column(target, name), where=red_sql)\n            tree.query |= (target\n                .join(tree, condition=target.id == Column(tree, name))\n                .select(target.id, Column(target, name)))\n\n        expression = table.id.in_(tree.select(tree.id, with_=[tree]))\n\n        if operator.startswith('not'):\n            return ~expression\n        return expression\n\n    @with_inactive_records\n    def convert_domain(self, domain, tables, Model):\n        pool = Pool()\n        Rule = pool.get('ir.rule')\n        Target = self.get_target()\n\n        table, _ = tables[None]\n        name, operator, value = domain[:3]\n        column = self.sql_column(table)\n        if '.' not in name:\n            if operator.endswith('child_of') or operator.endswith('parent_of'):\n                if Target != Model:\n                    if operator.endswith('child_of'):\n                        target_operator = 'child_of'\n                    else:\n                        target_operator = 'parent_of'\n                    query = Target.search([\n                            (domain[3], target_operator, value),\n                            ], order=[], query=True)\n                    expression = column.in_(query)\n                    if operator.startswith('not'):\n                        return ~expression\n                    return expression\n\n                if isinstance(value, str):\n                    targets = Target.search([('rec_name', 'ilike', value)],\n                        order=[])\n                    ids = [t.id for t in targets]\n                elif not isinstance(value, (list, tuple)):\n                    ids = [value]\n                else:\n                    ids = value\n                if not ids:\n                    expression = Literal(False)\n                    if operator.startswith('not'):\n                        return ~expression\n                    return expression\n                elif self.left and self.right:\n                    return self.convert_domain_mptt(\n                        (name, operator, ids), tables)\n                elif self.path:\n                    return self.convert_domain_path(\n                        (name, operator, ids), tables)\n                else:\n                    return self.convert_domain_tree(\n                        (name, operator, ids), tables)\n\n            # Used for Many2Many where clause\n            if operator.endswith('where'):\n                query = Target.search(value, order=[], query=True)\n                target_id, = query.columns\n                if isinstance(target_id, As):\n                    target_id = target_id.expression\n                query.where &= target_id == column\n                expression = column.in_(query)\n                if operator.startswith('not'):\n                    return ~expression\n                return expression\n\n            if not isinstance(value, str):\n                return super(Many2One, self).convert_domain(domain, tables,\n                    Model)\n            else:\n                target_name = 'rec_name'\n        else:\n            _, target_name = name.split('.', 1)\n        target_domain = [(target_name,) + tuple(domain[1:])]\n        if 'active' in Target._fields:\n            target_domain.append(('active', 'in', [True, False]))\n        if self.target_search == 'subquery':\n            query = Target.search(target_domain, order=[], query=True)\n            return column.in_(query)\n        else:\n            target_tables = self._get_target_tables(tables)\n            target_table, _ = target_tables[None]\n            rule_domain = Rule.domain_get(Target.__name__, mode='read')\n            if rule_domain:\n                target_domain = [target_domain, rule_domain]\n            _, expression = Target.search_domain(\n                target_domain, tables=target_tables)\n            return expression\n\n    def convert_order(self, name, tables, Model):\n        fname, _, oexpr = name.partition('.')\n        if not oexpr and getattr(Model, 'order_%s' % fname, None):\n            return super(Many2One, self).convert_order(fname, tables, Model)\n        assert fname == self.name\n\n        Target = self.get_target()\n\n        if oexpr:\n            oname, _, _ = oexpr.partition('.')\n        else:\n            oname = 'id'\n            if Target._rec_name in Target._fields:\n                oname = Target._rec_name\n            if Target._order_name in Target._fields:\n                oname = Target._order_name\n            oexpr = oname\n\n        table, _ = tables[None]\n        if oname == 'id':\n            return [self.sql_column(table)]\n\n        ofield = Target._fields[oname]\n        target_tables = self._get_target_tables(tables)\n        return ofield.convert_order(oexpr, target_tables, Target)\n\n    def _get_target_tables(self, tables):\n        Target = self.get_target()\n        table, _ = tables[None]\n        target_tables = tables.get(self.name)\n        context = Transaction().context\n        if target_tables is None:\n            if Target._history and context.get('_datetime'):\n                target = Target.__table_history__()\n                target_history = Target.__table_history__()\n                history_condition = Column(target, '__id').in_(\n                    target_history.select(\n                        Max(Column(target_history, '__id')),\n                        where=Coalesce(\n                            target_history.write_date,\n                            target_history.create_date)\n                        <= context['_datetime'],\n                        group_by=target_history.id))\n            else:\n                target = Target.__table__()\n                history_condition = None\n            condition = target.id == self.sql_column(table)\n            if history_condition:\n                condition &= history_condition\n            target_tables = {\n                None: (target, condition),\n                }\n            tables[self.name] = target_tables\n        return target_tables\n\n    def definition(self, model, language):\n        encoder = PYSONEncoder()\n\n        target = self.get_target()\n        relation_fields = [fname for fname, field in target._fields.items()\n            if field._type == 'one2many'\n            and field.model_name == model.__name__\n            and field.field == self.name]\n\n        definition = super().definition(model, language)\n        definition['datetime_field'] = self.datetime_field\n        definition['relation'] = target.__name__\n        if len(relation_fields) == 1:\n            definition['relation_field'], = relation_fields\n        definition['search_context'] = encoder.encode(self.search_context)\n        definition['search_order'] = encoder.encode(self.search_order)\n        return definition\n"
  },
  {
    "path": "trytond/model/fields/multiselection.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the toplevel of this\n# repository contains the full copyright notices and license terms.\nimport json\nfrom functools import partial\n\nfrom sql import Literal, operators\n\nfrom trytond.rpc import RPC\nfrom trytond.transaction import Transaction\n\nfrom .field import Field\nfrom .selection import SelectionMixin\n\n# Use canonical form\ndumps = partial(json.dumps, separators=(',', ':'), sort_keys=True)\n\n\nclass MultiSelection(SelectionMixin, Field):\n    \"Define a multi-selection field.\"\n    _type = 'multiselection'\n    _sql_type = 'VARCHAR'\n    _py_type = tuple\n\n    def __init__(self, selection, string='', sort=True, translate=True,\n            help='', help_selection=None, required=False, readonly=False,\n            domain=None, states=None, on_change=None,\n            on_change_with=None, depends=None, context=None, loading='eager'):\n        \"\"\"\n        :param selection: A list or a function name that returns a list.\n            The list must be a list of tuples. First member is the value\n            to store and the second is the value to display.\n        :param sort: A boolean to sort or not the selections.\n        \"\"\"\n        super().__init__(string=string, help=help,\n            required=required, readonly=readonly, domain=domain, states=states,\n            on_change=on_change, on_change_with=on_change_with,\n            depends=depends, context=context, loading=loading)\n        if hasattr(selection, 'copy'):\n            self.selection = selection.copy()\n        else:\n            self.selection = selection\n        self.selection_change_with = set()\n        self.sort = sort\n        self.translate_selection = translate\n        self.help_selection = help_selection\n    __init__.__doc__ += Field.__init__.__doc__\n\n    def set_rpc(self, model):\n        super().set_rpc(model)\n        if not isinstance(self.selection, (list, tuple)):\n            assert hasattr(model, self.selection), \\\n                'Missing %s on model %s' % (self.selection, model.__name__)\n            instantiate = 0 if self.selection_change_with else None\n            cache = dict(days=1) if instantiate is None else None\n            model.__rpc__.setdefault(\n                self.selection, RPC(instantiate=instantiate, cache=cache))\n\n    def get(self, ids, model, name, values=None):\n        lists = {id: () for id in ids}\n        for value in values or []:\n            data = value[name]\n            if data:\n                # If stored as JSON conversion is done on backend\n                if isinstance(data, str):\n                    data = json.loads(data)\n                lists[value['id']] = tuple(data)\n        return lists\n\n    def sql_format(self, value):\n        value = super().sql_format(value)\n        if isinstance(value, (list, tuple)):\n            value = dumps(sorted(set(value)))\n        return value\n\n    def _domain_column(self, operator, column):\n        database = Transaction().database\n        return database.json_get(super()._domain_column(operator, column))\n\n    def _domain_value(self, operator, value):\n        database = Transaction().database\n        domain_value = super()._domain_value(operator, value)\n        if value is not None:\n            domain_value = database.json_get(domain_value)\n        return domain_value\n\n    def convert_domain(self, domain, tables, Model):\n        name, operator, value = domain[:3]\n        if operator not in {'in', 'not in'}:\n            return super().convert_domain(domain, tables, Model)\n        database = Transaction().database\n        table, _ = tables[None]\n        raw_column = self.sql_column(table)\n        if isinstance(value, str):\n            try:\n                expression = database.json_key_exists(raw_column, value)\n            except NotImplementedError:\n                expression = operators.Like(\n                    raw_column, '%' + dumps(value) + '%')\n        else:\n            try:\n                expression = database.json_any_keys_exist(\n                    raw_column, list(value))\n            except NotImplementedError:\n                expression = Literal(False)\n                for item in value:\n                    expression |= operators.Like(\n                        raw_column, '%' + dumps(item) + '%')\n        if operator == 'not in':\n            expression = operators.Not(expression)\n        return expression\n"
  },
  {
    "path": "trytond/model/fields/numeric.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom decimal import Decimal\n\nfrom sql import As, Cast, CombiningQuery, Literal, Select\n\nfrom trytond import backend\n\nfrom .float import Float\n\n\nclass SQLite_Cast(Cast):\n\n    def as_(self, output_name):\n        # Use PARSE_COLNAMES instead of CAST for final column\n        return As(self.expression, '%s [NUMERIC]' % output_name)\n\n\nclass Numeric(Float):\n    '''\n    Define a numeric field (``decimal``).\n    '''\n    _type = 'numeric'\n    _sql_type = 'NUMERIC'\n    _py_type = Decimal\n\n    def sql_column(self, table):\n        column = super(Numeric, self).sql_column(table)\n        db_type = backend.name\n        if db_type == 'sqlite':\n            # Must be casted as Decimal is stored as bytes\n            column = SQLite_Cast(column, self.sql_type().base)\n        return column\n\n    def _domain_value(self, operator, value):\n        value = super(Numeric, self)._domain_value(operator, value)\n        db_type = backend.name\n        if db_type == 'sqlite':\n            if isinstance(value, (Select, CombiningQuery)):\n                return value\n            # Must be casted as Decimal is adapted to bytes\n            type_ = self.sql_type().base\n            if operator in ('in', 'not in'):\n                return [Cast(Literal(v), type_) for v in value]\n            elif value is not None:\n                return Cast(Literal(value), type_)\n        return value\n"
  },
  {
    "path": "trytond/model/fields/one2many.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom collections import defaultdict\nfrom itertools import chain\n\nfrom sql.conditionals import Coalesce\n\nfrom trytond.pool import Pool\nfrom trytond.pyson import PYSONEncoder\nfrom trytond.tools import cached_property, grouped_slice\nfrom trytond.transaction import Transaction\n\nfrom .field import (\n    Field, context_validate, domain_validate, get_eval_fields,\n    instanciate_values, instantiate_context, search_order_validate,\n    size_validate)\nfrom .function import Function\n\n\nclass One2Many(Field):\n    '''\n    Define one2many field (``list``).\n    '''\n    _type = 'one2many'\n\n    def __init__(self, model_name, field, string='', add_remove=None,\n            order=None, datetime_field=None, size=None, search_order=None,\n            search_context=None, help='', required=False, readonly=False,\n            domain=None, filter=None, states=None, on_change=None,\n            on_change_with=None, depends=None, context=None, loading='lazy'):\n        '''\n        :param model_name: The name of the target model.\n        :param field: The name of the field that handle the reverse many2one or\n            reference.\n        :param add_remove: A list that defines a domain on add/remove.\n            See domain on ModelStorage.search.\n        :param order:  a list of tuples that are constructed like this:\n            ``('field name', 'DESC|ASC')``\n            allowing to specify the order of result.\n        :param datetime_field: The name of the field that contains the datetime\n            value to read the target records.\n        :param search_order: The order to use when searching for records\n        :param search_context: The context to use when searching for a record\n        :param filter: A domain to filter target records.\n        '''\n        super(One2Many, self).__init__(string=string, help=help,\n            required=required, readonly=readonly, domain=domain, states=states,\n            on_change=on_change, on_change_with=on_change_with,\n            depends=depends, context=context, loading=loading)\n        self.model_name = model_name\n        self.field = field\n        self.__add_remove = None\n        self.add_remove = add_remove\n        self.order = order\n        self.datetime_field = datetime_field\n        self.__size = None\n        self.size = size\n        self.__search_order = None\n        self.search_order = search_order\n        self.__search_context = None\n        self.search_context = search_context or {}\n        self.__filter = None\n        self.filter = filter\n\n    __init__.__doc__ += Field.__init__.__doc__\n\n    def _get_add_remove(self):\n        return self.__add_remove\n\n    def _set_add_remove(self, value):\n        if value is not None:\n            domain_validate(value)\n        self.__add_remove = value\n\n    add_remove = property(_get_add_remove, _set_add_remove)\n\n    def _get_size(self):\n        return self.__size\n\n    def _set_size(self, value):\n        size_validate(value)\n        self.__size = value\n\n    size = property(_get_size, _set_size)\n\n    @property\n    def search_order(self):\n        return self.__search_order\n\n    @search_order.setter\n    def search_order(self, value):\n        search_order_validate(value)\n        self.__search_order = value\n\n    @property\n    def search_context(self):\n        return self.__search_context\n\n    @search_context.setter\n    def search_context(self, value):\n        context_validate(value)\n        self.__search_context = value\n\n    @cached_property\n    def display_depends(self):\n        depends = super().display_depends\n        if self.datetime_field:\n            depends.add(self.datetime_field)\n        return depends\n\n    @cached_property\n    def edition_depends(self):\n        depends = super().edition_depends\n        for attribute in ['add_remove', 'size']:\n            depends |= get_eval_fields(getattr(self, attribute))\n        return depends\n\n    @cached_property\n    def validation_depends(self):\n        return super().validation_depends | get_eval_fields(self.size)\n\n    def sql_type(self):\n        return None\n\n    @property\n    def filter(self):\n        return self.__filter\n\n    @filter.setter\n    def filter(self, value):\n        if value is not None:\n            domain_validate(value)\n        self.__filter = value\n\n    def get(self, ids, model, name, values=None):\n        '''\n        Return target records ordered.\n        '''\n        Target = self.get_target()\n        field = Target._fields[self.field]\n        res = {}\n        for i in ids:\n            res[i] = []\n\n        if (not isinstance(field, Function)\n                or hasattr(Target, 'order_' + self.field)):\n            order = [(self.field, None)]\n        else:\n            order = []\n        if self.order:\n            order += self.order\n        elif Target._order:\n            order += Target._order\n        targets = []\n        for sub_ids in grouped_slice(ids):\n            if field._type == 'reference':\n                references = ['%s,%s' % (model.__name__, x) for x in sub_ids]\n                clause = [(self.field, 'in', references)]\n            else:\n                clause = [(self.field, 'in', list(sub_ids))]\n            if self.filter:\n                clause.append(self.filter)\n            targets.append(Target.search(clause, order=order))\n        targets = Target.browse(list(chain(*targets)))\n\n        for target in targets:\n            origin_id = getattr(target, self.field).id\n            res[origin_id].append(target.id)\n        return dict((key, tuple(value)) for key, value in res.items())\n\n    def set(self, Model, name, ids, values, *args):\n        '''\n        Set the values.\n        values: A list of tuples:\n            (``create``, ``[{<field name>: value}, ...]``),\n            (``write``, [``<ids>``, ``{<field name>: value}``, ...]),\n            (``delete``, ``<ids>``),\n            (``add``, ``<ids>``),\n            (``remove``, ``<ids>``),\n            (``copy``, ``<ids>``, ``[{<field name>: value}, ...]``)\n        '''\n        Target = self.get_target()\n        field = Target._fields[self.field]\n        to_create = []\n        to_write = []\n        to_delete = []\n\n        def search_clause(ids):\n            if field._type == 'reference':\n                references = ['%s,%s' % (Model.__name__, x) for x in ids]\n                return (self.field, 'in', references)\n            else:\n                return (self.field, 'in', ids)\n\n        def field_value(record_id):\n            if field._type == 'reference':\n                return '%s,%s' % (Model.__name__, record_id)\n            else:\n                return record_id\n\n        def target_value(record):\n            if record is None:\n                return None\n            if field._type == 'reference':\n                return str(record)\n            else:\n                return record.id\n\n        def create(ids, vlist):\n            for record_id in ids:\n                value = field_value(record_id)\n                for values in vlist:\n                    values = values.copy()\n                    values[self.field] = value\n                    to_create.append(values)\n\n        def write(_, *args):\n            actions = iter(args)\n            to_write.extend(sum(((Target.browse(ids), values)\n                        for ids, values in zip(actions, actions)), ()))\n\n        def delete(_, target_ids):\n            to_delete.extend(Target.browse(target_ids))\n\n        def add(ids, target_ids):\n            target_ids = list(map(int, target_ids))\n            if not target_ids:\n                return\n            targets = Target.browse(target_ids)\n            for record_id in ids:\n                fvalue = field_value(record_id)\n                to_update = [t for t in targets\n                    if target_value(getattr(t, self.field)) != fvalue]\n                if to_update:\n                    to_write.extend((to_update, {\n                                self.field: fvalue,\n                                }))\n\n        def remove(ids, target_ids):\n            target_ids = list(map(int, target_ids))\n            if not target_ids:\n                return\n            for sub_ids in grouped_slice(target_ids):\n                targets = Target.search([\n                        search_clause(ids),\n                        ('id', 'in', list(sub_ids)),\n                        ])\n                to_write.extend((targets, {\n                            self.field: None,\n                            }))\n\n        def copy(ids, copy_ids, default=None):\n            copy_ids = list(map(int, copy_ids))\n\n            if default is None:\n                default = {}\n            default = default.copy()\n            copies = Target.browse(copy_ids)\n            for record_id in ids:\n                default[self.field] = field_value(record_id)\n                Target.copy(copies, default=default)\n\n        actions = {\n            'create': create,\n            'write': write,\n            'delete': delete,\n            'add': add,\n            'remove': remove,\n            'copy': copy,\n            }\n        args = iter((ids, values) + args)\n        for ids, values in zip(args, args):\n            if not values:\n                continue\n            for value in values:\n                action = value[0]\n                args = value[1:]\n                actions[action](ids, *args)\n        # Ordered operations to avoid uniqueness/overlapping constraints\n        if to_delete:\n            Target.delete(to_delete)\n        if to_write:\n            Target.write(*to_write)\n        if to_create:\n            Target.create(to_create)\n\n    def get_target(self):\n        'Return the target Model'\n        return Pool().get(self.model_name)\n\n    def __set__(self, inst, value):\n        Target = self.get_target()\n        ctx = instantiate_context(self, inst)\n        extra = {}\n        if self.field:\n            extra[self.field] = inst\n        with Transaction().set_context(ctx):\n            records = instanciate_values(Target, value, **extra)\n        super(One2Many, self).__set__(inst, records)\n\n    def remove(self, inst, records):\n        records = set(records)\n        if inst._removed is None:\n            inst._removed = defaultdict(set)\n        inst._removed[self.name].update(map(int, records))\n        setattr(\n            inst, self.name,\n            [r for r in getattr(inst, self.name) if r not in records])\n\n    def convert_domain(self, domain, tables, Model):\n        from ..modelsql import convert_from\n        pool = Pool()\n        Rule = pool.get('ir.rule')\n        Target = self.get_target()\n        transaction = Transaction()\n        table, _ = tables[None]\n        name, operator, value = domain[:3]\n        assert operator not in {'where', 'not where'} or '.' not in name\n\n        if Target._history and transaction.context.get('_datetime'):\n            target = Target.__table_history__()\n            history_where = (\n                Coalesce(target.write_date, target.create_date)\n                <= transaction.context['_datetime'])\n        else:\n            target = Target.__table__()\n            history_where = None\n        origin_field = Target._fields[self.field]\n        origin = getattr(Target, self.field).sql_column(target)\n        origin_where = None\n        if origin_field._type == 'reference':\n            origin_where = origin.like(Model.__name__ + ',%')\n            origin = origin_field.sql_id(origin, Target)\n\n        if '.' not in name:\n            if value is None:\n                where = origin != value\n                if history_where:\n                    where &= history_where\n                if origin_where:\n                    where &= origin_where\n                if self.filter:\n                    query = Target.search(self.filter, order=[], query=True)\n                    where &= origin.in_(query)\n                query = target.select(origin, where=where)\n                expression = ~table.id.in_(query)\n                if operator == '!=':\n                    return ~expression\n                return expression\n            else:\n                if isinstance(value, str):\n                    target_name = 'rec_name'\n                else:\n                    target_name = 'id'\n        else:\n            _, target_name = name.split('.', 1)\n        if operator not in {'where', 'not where'}:\n            target_domain = [(target_name,) + tuple(domain[1:])]\n        else:\n            target_domain = value\n        if origin_field._type == 'reference':\n            target_domain.append(\n                (self.field, 'like', Model.__name__ + ',%'))\n        rule_domain = Rule.domain_get(Target.__name__, mode='read')\n        if rule_domain:\n            target_domain = [target_domain, rule_domain]\n        if self.filter:\n            target_domain = [target_domain, self.filter]\n        target_tables = {\n            None: (target, None),\n            }\n        tables, expression = Target.search_domain(\n            target_domain, tables=target_tables)\n        query_table = convert_from(None, target_tables)\n        query = query_table.select(origin, where=expression)\n        expression = table.id.in_(query)\n\n        if operator == 'not where':\n            expression = ~expression\n        elif operator.startswith('!') or operator.startswith('not '):\n            expression |= ~table.id.in_(target.select(origin))\n        return expression\n\n    def definition(self, model, language):\n        encoder = PYSONEncoder()\n        definition = super().definition(model, language)\n        if self.add_remove is not None:\n            definition['add_remove'] = encoder.encode(self.add_remove)\n        definition['datetime_field'] = self.datetime_field\n        if self.filter:\n            definition['domain'] = encoder.encode(\n                ['AND', self.domain, self.filter])\n        definition['relation'] = self.model_name\n        if self.field:\n            definition['relation_field'] = self.field\n        definition['search_context'] = encoder.encode(self.search_context)\n        definition['search_order'] = encoder.encode(self.search_order)\n        if self.size is not None:\n            definition['size'] = encoder.encode(self.size)\n        definition['sortable'] &= hasattr(model, 'order_' + self.name)\n        definition['order'] = (\n            getattr(self.get_target(), '_order', None)\n            if self.order is None else self.order)\n        return definition\n"
  },
  {
    "path": "trytond/model/fields/one2one.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model.fields.field import Field\nfrom trytond.model.fields.many2many import Many2Many\nfrom trytond.pool import Pool\n\n\nclass One2One(Many2Many):\n    '''\n    Define one2one field (``int``).\n    '''\n    _type = 'one2one'\n\n    def get(self, ids, model, name, values=None):\n        '''\n        Return target record.\n\n        :param ids: a list of ids\n        :param model: a string with the name of the model\n        :param name: a string with the name of the field\n        :param values: a dictionary with the read values\n        :return: a dictionary with ids as key and target id as value\n        '''\n        res = super(One2One, self).get(ids, model, name, values=values)\n        for i, vals in res.items():\n            res[i] = vals[0] if vals else None\n        return res\n\n    def set(self, Model, name, ids, value, *args):\n        '''\n        Set the values.\n        '''\n        pool = Pool()\n        Relation = pool.get(self.relation_name)\n        to_delete = []\n        to_create = []\n        args = iter((ids, value) + args)\n        for ids, value in zip(args, args):\n            relations = Relation.search([\n                    (self.origin, 'in', ids),\n                    ])\n            to_delete.extend(relations)\n            if value:\n                for record_id in ids:\n                    to_create.append({\n                            self.origin: record_id,\n                            self.target: value,\n                            })\n        # Ordered operations to avoid uniqueness/overlapping constraints\n        if to_delete:\n            Relation.delete(to_delete)\n        if to_create:\n            Relation.create(to_create)\n\n    def __set__(self, inst, value):\n        Target = self.get_target()\n        if isinstance(value, dict):\n            value = Target(*value)\n        elif isinstance(value, int):\n            value = Target(value)\n        assert isinstance(value, (Target, type(None)))\n        Field.__set__(self, inst, value)\n"
  },
  {
    "path": "trytond/model/fields/reference.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport warnings\n\nfrom sql import Cast, Expression, Literal, Query\nfrom sql.functions import Position, Substring\n\nfrom trytond.pool import Pool\nfrom trytond.pyson import PYSONEncoder\nfrom trytond.rpc import RPC\nfrom trytond.tools import cached_property\nfrom trytond.transaction import Transaction\n\nfrom .field import (\n    Field, context_validate, domain_validate, instantiate_context,\n    search_order_validate, with_inactive_records)\nfrom .selection import SelectionMixin\n\n\nclass Reference(SelectionMixin, Field):\n    '''\n    Define a reference field (``str``).\n    '''\n    _type = 'reference'\n    _sql_type = 'VARCHAR'\n\n    def __init__(self, string='', selection=None, sort=True,\n            selection_change_with=None, translate=True, search_order=None,\n            search_context=None, help='', help_selection=None, required=False,\n            readonly=False, domain=None, states=None,\n            on_change=None, on_change_with=None, depends=None, context=None,\n            loading='lazy', datetime_field=None):\n        '''\n        :param selection: A list or a function name that returns a list.\n            The list must be a list of tuples. First member is an internal name\n            of model and the second is the user name of model.\n        :param sort: A boolean to sort or not the selections.\n        :param datetime_field: The name of the field that contains the datetime\n            value to read the target records.\n        :param search_order: The order to use when searching for a record\n        :param search_context: The context to use when searching for a record\n        '''\n        super(Reference, self).__init__(string=string, help=help,\n            required=required, readonly=readonly, domain=domain, states=states,\n            on_change=on_change, on_change_with=on_change_with,\n            depends=depends, context=context, loading=loading)\n        self.datetime_field = datetime_field\n        self.selection = selection or None\n        self.selection_change_with = set()\n        if selection_change_with:\n            warnings.warn('selection_change_with argument is deprecated, '\n                'use the depends decorator',\n                DeprecationWarning, stacklevel=2)\n            self.selection_change_with.update(selection_change_with)\n        self.sort = sort\n        self.translate_selection = translate\n        self.help_selection = help_selection\n        self.__search_order = None\n        self.search_order = search_order\n        self.__search_context = None\n        self.search_context = search_context or {}\n\n    __init__.__doc__ += Field.__init__.__doc__\n\n    @property\n    def domain(self):\n        return self.__domain\n\n    @domain.setter\n    def domain(self, value):\n        if value is None:\n            value = {}\n        assert isinstance(value, dict)\n        for domain in value.values():\n            domain_validate(domain)\n        self.__domain = value\n\n    @property\n    def search_order(self):\n        return self.__search_order\n\n    @search_order.setter\n    def search_order(self, value):\n        if value is None:\n            value = {}\n        assert isinstance(value, dict)\n        for order in value.values():\n            search_order_validate(order)\n        self.__search_order = value\n\n    @property\n    def search_context(self):\n        return self.__search_context\n\n    @search_context.setter\n    def search_context(self, value):\n        context_validate(value)\n        self.__search_context = value\n\n    @cached_property\n    def display_depends(self):\n        depends = super().display_depends\n        if self.datetime_field:\n            depends.add(self.datetime_field)\n        return depends\n\n    def set_rpc(self, model):\n        super(Reference, self).set_rpc(model)\n        if not isinstance(self.selection, (list, tuple)):\n            assert hasattr(model, self.selection), \\\n                'Missing %s on model %s' % (self.selection, model.__name__)\n            instantiate = 0 if self.selection_change_with else None\n            cache = dict(days=1) if instantiate is None else None\n            model.__rpc__.setdefault(\n                self.selection, RPC(instantiate=instantiate, cache=cache))\n\n    def get(self, ids, model, name, values=None):\n        '''\n        Replace removed reference id by None.\n        '''\n        pool = Pool()\n        if values is None:\n            values = {}\n        res = {}\n        for i in values:\n            res[i['id']] = i[name]\n        ref_to_check = {}\n        for i in ids:\n            if not (i in res):\n                res[i] = None\n                continue\n            if not res[i]:\n                continue\n            ref_model, ref_id = res[i].split(',', 1)\n            if not ref_model:\n                continue\n            try:\n                ref_id = int(ref_id)\n            except ValueError:\n                continue\n            if ref_id < 0:\n                continue\n            res[i] = ref_model + ',' + str(ref_id)\n            ref_to_check.setdefault(ref_model, (set(), []))\n            ref_to_check[ref_model][0].add(ref_id)\n            ref_to_check[ref_model][1].append(i)\n\n        # Check if reference ids still exist\n        with Transaction().set_context(active_test=False), \\\n                Transaction().set_context(_check_access=False):\n            for ref_model, (ref_ids, ids) in ref_to_check.items():\n                try:\n                    pool.get(ref_model)\n                except KeyError:\n                    res.update(dict((i, None) for i in ids))\n                    continue\n                Ref = pool.get(ref_model)\n                refs = Ref.search([\n                    ('id', 'in', list(ref_ids)),\n                    ], order=[])\n                refs = list(map(str, refs))\n                for i in ids:\n                    if res[i] not in refs:\n                        res[i] = None\n        return res\n\n    def __set__(self, inst, value):\n        from ..model import Model\n        if not isinstance(value, (Model, type(None))):\n            if isinstance(value, str):\n                target, value = value.split(',')\n            else:\n                target, value = value\n            Target = Pool().get(target)\n            ctx = instantiate_context(self, inst)\n            with Transaction().set_context(ctx):\n                if isinstance(value, dict):\n                    value = Target(**value)\n                else:\n                    value = Target(value)\n        super(Reference, self).__set__(inst, value)\n\n    def sql_format(self, value):\n        if value and not isinstance(value, (str, Query, Expression)):\n            try:\n                value = '%s,%s' % tuple(value)\n            except TypeError:\n                value = str(value)\n        return super(Reference, self).sql_format(value)\n\n    def sql_id(self, column, Model):\n        \"Return SQL expression for the id part of the field\"\n        return Cast(Substring(\n                column, Position(',', column) + Literal(1)),\n            Model.id.sql_type().base)\n\n    @with_inactive_records\n    def convert_domain(self, domain, tables, Model):\n        if '.' not in domain[0]:\n            return super(Reference, self).convert_domain(domain, tables, Model)\n        pool = Pool()\n        name, operator, value, target = domain[:4]\n        Target = pool.get(target)\n        table, _ = tables[None]\n        name, target_name = name.split('.', 1)\n        assert name == self.name\n        column = self.sql_column(table)\n        target_domain = [(target_name,) + tuple(domain[1:3])\n            + tuple(domain[4:])]\n        if 'active' in Target._fields:\n            target_domain.append(('active', 'in', [True, False]))\n        query = Target.search(target_domain, order=[], query=True)\n        return (\n            self.sql_id(column, Model).in_(query)\n            & column.like(target + ',%'))\n\n    def definition(self, model, language):\n        encoder = PYSONEncoder()\n        definition = super().definition(model, language)\n        definition['datetime_field'] = self.datetime_field\n        definition['search_context'] = encoder.encode(self.search_context)\n        definition['search_order'] = encoder.encode(self.search_order)\n        return definition\n"
  },
  {
    "path": "trytond/model/fields/selection.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport warnings\nfrom itertools import chain\n\nfrom sql.conditionals import Case\n\nfrom trytond.pool import Pool\nfrom trytond.rpc import RPC\nfrom trytond.tools import is_instance_method\nfrom trytond.tools.string_ import LazyString\nfrom trytond.transaction import Transaction\n\nfrom .field import Field\n\n\nclass SelectionMixin(Field):\n    translate_selection = True\n    sort = True\n\n    def translated(self, name=None):\n        \"Return a descriptor for the translated value of the field\"\n        if name is None:\n            name = self.name\n        if name is None:\n            raise ValueError('Missing name argument')\n        return TranslatedSelection(name)\n\n    def definition(self, model, language):\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        definition = super().definition(model, language)\n        if not isinstance(self.selection, str) and self.translate_selection:\n            name = '%s,%s' % (model.__name__, self.name)\n            selection = []\n            for key, source in self.selection:\n                if not isinstance(source, LazyString):\n                    source = Translation.get_source(\n                        name, 'selection', language, source) or source\n                selection.append((key, str(source)))\n        elif hasattr(self.selection, 'copy'):\n            selection = self.selection.copy()\n        else:\n            selection = self.selection\n        if self.help_selection:\n            help_selection = {}\n            for key, source in self.help_selection.items():\n                if not isinstance(source, LazyString):\n                    source = Translation.get_source(\n                        name, 'selection', language, source) or source\n                help_selection[key] = str(source)\n        else:\n            help_selection = None\n        definition['selection'] = selection\n        definition['selection_change_with'] = list(self.selection_change_with)\n        definition['sort'] = self.sort\n        definition['help_selection'] = help_selection\n        return definition\n\n    def definition_translations(self, model, language):\n        name = '%s,%s' % (model.__name__, self.name)\n        selection = []\n        sources = []\n        if not isinstance(self.selection, str) and self.translate_selection:\n            sources.append(self.selection)\n        if self.help_selection:\n            sources.append(self.help_selection.items())\n        for key, source in chain(*sources):\n            if not isinstance(source, LazyString):\n                selection.append(\n                    (name, 'selection', language, source))\n        return super().definition_translations(model, language) + selection\n\n\nclass Selection(SelectionMixin, Field):\n    '''\n    Define a selection field (``str``).\n    '''\n    _type = 'selection'\n    _sql_type = 'VARCHAR'\n    _py_type = str\n\n    def __init__(self, selection, string='', sort=True,\n            selection_change_with=None, translate=True, help='',\n            help_selection=None, required=False, readonly=False, domain=None,\n            states=None, on_change=None, on_change_with=None,\n            depends=None, context=None, loading='eager'):\n        '''\n        :param selection: A list or a function name that returns a list.\n            The list must be a list of tuples. First member is the value\n            to store and the second is the value to display.\n        :param sort: A boolean to sort or not the selections.\n        '''\n        super(Selection, self).__init__(string=string, help=help,\n            required=required, readonly=readonly, domain=domain, states=states,\n            on_change=on_change, on_change_with=on_change_with,\n            depends=depends, context=context, loading=loading)\n        if hasattr(selection, 'copy'):\n            self.selection = selection.copy()\n        else:\n            self.selection = selection\n        self.selection_change_with = set()\n        if selection_change_with:\n            warnings.warn('selection_change_with argument is deprecated, '\n                'use the depends decorator',\n                DeprecationWarning, stacklevel=2)\n            self.selection_change_with.update(selection_change_with)\n        self.sort = sort\n        self.translate_selection = translate\n        self.help_selection = help_selection\n    __init__.__doc__ += Field.__init__.__doc__\n\n    def set_rpc(self, model):\n        super(Selection, self).set_rpc(model)\n        if not isinstance(self.selection, (list, tuple)):\n            assert hasattr(model, self.selection), \\\n                'Missing %s on model %s' % (self.selection, model.__name__)\n            instantiate = 0 if self.selection_change_with else None\n            cache = dict(days=1) if instantiate is None else None\n            model.__rpc__.setdefault(\n                self.selection, RPC(instantiate=instantiate, cache=cache))\n\n    def convert_order(self, name, tables, Model):\n        if getattr(Model, 'order_%s' % name, None):\n            return super(Selection, self).convert_order(name, tables, Model)\n\n        assert name == self.name\n        table, _ = tables[None]\n        selections = Model.fields_get([name])[name]['selection']\n        if not isinstance(selections, (tuple, list)):\n            if not is_instance_method(Model, selections):\n                selections = getattr(Model, selections)()\n            else:\n                selections = []\n        column = self.sql_column(table)\n        if not self.sort:\n            else_ = len(selections) + 1\n            selections = ((k, i) for i, (k, v) in enumerate(selections))\n        else:\n            else_ = column\n        whens = []\n        for key, value in selections:\n            whens.append((column == key, value))\n        if whens:\n            return [Case(*whens, else_=else_)]\n        else:\n            return [column]\n\n\nclass TranslatedSelection(object):\n    'A descriptor for translated value of Selection field'\n\n    def __init__(self, name):\n        self.name = name\n\n    def __get__(self, inst, cls):\n        from ..model import Model\n        if inst is None:\n            return self\n        with Transaction().set_context(getattr(inst, '_context', {})):\n            selection = cls.fields_get([self.name])[self.name]['selection']\n            if not isinstance(selection, (tuple, list)):\n                sel_func = getattr(cls, selection)\n                if not is_instance_method(cls, selection):\n                    selection = sel_func()\n                else:\n                    selection = sel_func(inst)\n            selection = dict(selection)\n        value = getattr(inst, self.name)\n        # None and '' are equivalent\n        if value is None or value == '':\n            if value not in selection:\n                switch_value = {None: '', '': None}[value]\n                if switch_value in selection:\n                    value = switch_value\n        # Use Model __name__ for Reference field\n        elif isinstance(value, Model):\n            value = value.__name__\n        if isinstance(value, (list, tuple)):\n            values = []\n            for item in value:\n                values.append(selection.get(item, item))\n            return values\n        else:\n            return selection.get(value, value)\n"
  },
  {
    "path": "trytond/model/fields/text.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom sql import Expression, Literal, Null, Query\nfrom sql.operators import ILike, In, Not, NotIn\n\nfrom trytond.transaction import Transaction\n\nfrom .char import Char\nfrom .field import SQL_OPERATORS, Field\n\n\nclass Text(Char):\n    '''\n    Define a text field (``unicode``).\n    '''\n    _type = 'text'\n    _sql_type = 'TEXT'\n    forbidden_chars = ''\n    search_full_text = True\n\n    def __init__(self, *args, strip=False, **kwarg):\n        super().__init__(*args, strip=strip, **kwarg)\n\n\nclass FullText(Field):\n    '''\n    Define a full text field.\n    '''\n    _type = 'full_text'\n    _sql_type = 'FULLTEXT'\n    _py_type = str\n\n    def sql_format(self, value):\n        if isinstance(value, (Query, Expression)):\n            return value\n        if not value:\n            return Null\n        if isinstance(value, (int, float)):\n            return value\n        transaction = Transaction()\n        database = transaction.database\n        if isinstance(value, str):\n            value = [value]\n        return database.format_full_text(*value, language=transaction.language)\n\n    def _rank_column(self, column, name, Model):\n        transaction = Transaction()\n        context = transaction.context\n        database = transaction.database\n        key = '%s.%s.order' % (Model.__name__, name)\n        value = context.get(key)\n        if value and database.has_search_full_text():\n            value = database.format_full_text_query(\n                value, language=transaction.language)\n            return database.rank_full_text(column, value, normalize=['rank'])\n\n    def convert_domain(self, domain, tables, Model):\n        transaction = Transaction()\n        database = transaction.database\n        table, _ = tables[None]\n        name, operator, value = domain\n        assert name == self.name\n        column = self.sql_column(table)\n        column = self._domain_column(operator, column)\n        if operator.endswith('like'):\n            if database.has_search_full_text():\n                value = database.format_full_text_query(\n                    value, language=transaction.language)\n                expression = database.search_full_text(column, value)\n            else:\n                expression = Literal(True)\n                for v in value.split():\n                    expression &= ILike(column, '%' + v + '%')\n            if operator.startswith('not'):\n                expression = Not(expression)\n        else:\n            Operator = SQL_OPERATORS[operator]\n            column = self._rank_column(column, name, Model)\n            expression = Operator(column, self._domain_value(operator, value))\n            if isinstance(expression, In) and not expression.right:\n                expression = Literal(False)\n            elif isinstance(expression, NotIn) and not expression.right:\n                expression = Literal(True)\n            expression = self._domain_add_null(\n                column, operator, value, expression)\n        return expression\n\n    def convert_order(self, name, tables, Model):\n        method = getattr(Model, 'order_%s' % name, None)\n        if method:\n            return method(tables)\n        table, _ = tables[None]\n        column = self.sql_column(table)\n        column = self._domain_column('ilike', column)\n        column = self._rank_column(column, name, Model)\n        if column:\n            return [column]\n        return []\n"
  },
  {
    "path": "trytond/model/match.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the toplevel of this\n# repository contains the full copyright notices and license terms.\n\n\nclass MatchMixin(object):\n    __slots__ = ()\n\n    def match(self, pattern, match_none=False):\n        '''Match on pattern\n        pattern is a dictionary with model field as key\n        and matching value as value'''\n        for field, pattern_value in pattern.items():\n            value = getattr(self, field)\n            if not match_none and value is None:\n                continue\n            if self._fields[field]._type == 'many2one':\n                value = value.id if value else value\n            if value != pattern_value:\n                return False\n        return True\n"
  },
  {
    "path": "trytond/model/model.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport collections.abc\nimport copy\nimport sys\nfrom collections import defaultdict\nfrom functools import total_ordering\nfrom itertools import chain\n\nfrom trytond.i18n import lazy_gettext\nfrom trytond.model import fields\nfrom trytond.pool import Pool, PoolBase, PoolMeta\nfrom trytond.pyson import PYSONDecoder, PYSONEncoder\nfrom trytond.rpc import RPC\nfrom trytond.transaction import Transaction\nfrom trytond.url import URLMixin\n\n__all__ = ['Model']\n\n\nclass ModelMeta(PoolMeta):\n    @property\n    def __queue__(self):\n        pool = Pool()\n        Queue = pool.get('ir.queue')\n        return Queue.caller(self)\n\n\n@total_ordering\nclass Model(URLMixin, PoolBase, metaclass=ModelMeta):\n    \"\"\"\n    Define a model in Tryton.\n    \"\"\"\n    __slots__ = ('_id', '_values', '_init_values', '_removed', '_deleted')\n    _rec_name = 'name'\n\n    id = fields.Integer(lazy_gettext('ir.msg_ID'), readonly=True)\n\n    @classmethod\n    def __setup__(cls):\n        super(Model, cls).__setup__()\n        cls.__rpc__ = {\n            'default_get': RPC(cache=dict(seconds=5 * 60)),\n            'fields_get': RPC(cache=dict(days=1)),\n            'pre_validate': RPC(instantiate=0),\n            }\n        cls.__access__ = set()\n\n        # Copy fields and update depends\n        for attr in dir(cls):\n            if attr.startswith('_'):\n                continue\n            if not isinstance(getattr(cls, attr), fields.Field):\n                continue\n            field_name = attr\n            field = getattr(cls, field_name)\n            # Copy the original field definition to prevent side-effect with\n            # the mutable attributes\n            for parent_cls in cls.__mro__:\n                parent_field = getattr(parent_cls, field_name, None)\n                if isinstance(parent_field, fields.Field):\n                    field = parent_field\n            field = copy.deepcopy(field)\n            setattr(cls, field_name, field)\n\n    @classmethod\n    def __post_setup__(cls):\n        super(Model, cls).__post_setup__()\n\n        # Set _fields\n        cls._fields = {}\n        for attr in dir(cls):\n            if attr.startswith('_'):\n                continue\n            if isinstance(getattr(cls, attr), fields.Field):\n                cls._fields[attr] = getattr(cls, attr)\n        cls._record = record(cls.__name__ + '._record', cls._fields.keys())\n\n        # Set _defaults\n        cls._defaults = {}\n        fields_names = list(cls._fields.keys())\n        for field_name in fields_names:\n            default_method = getattr(cls, 'default_%s' % field_name, False)\n            if callable(default_method):\n                cls._defaults[field_name] = default_method\n\n        for k in cls._defaults:\n            assert k in cls._fields, \\\n                'Default function defined in %s but field %s does not exist!' \\\n                % (cls.__name__, k,)\n\n        # Set name to fields\n        for name, field in cls._fields.items():\n            if field.name is None:\n                field.name = name\n            else:\n                assert field.name == name, (\n                    'Duplicate fields on %s: %s, %s'\n                    % (cls, field.name, name))\n\n    @classmethod\n    def _get_name(cls):\n        '''\n        Returns the first non-empty line of the model docstring.\n        '''\n        assert cls.__doc__, '%s has no docstring' % cls\n        lines = cls.__doc__.splitlines()\n        for line in lines:\n            line = line.strip()\n            if line:\n                return line\n\n    @classmethod\n    def __register__(cls, module_name):\n        \"\"\"\n        Add model in ir.model and ir.model.field.\n        \"\"\"\n        super(Model, cls).__register__(module_name)\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        Model_ = pool.get('ir.model')\n        ModelField = pool.get('ir.model.field')\n\n        model_id = Model_.register(cls, module_name)\n        ModelField.register(cls, module_name, model_id)\n\n        Translation.register_model(cls, module_name)\n        Translation.register_fields(cls, module_name)\n\n    @classmethod\n    def default_get(cls, fields_names, with_rec_name=True):\n        '''\n        Return a dict with the default values for each field in fields_names.\n        If with_rec_name is True, rec_name will be added.\n        '''\n        pool = Pool()\n        value = {}\n\n        default_rec_name = Transaction().context.get('default_rec_name')\n        if (default_rec_name\n                and cls._rec_name in cls._fields\n                and cls._rec_name in fields_names):\n            value[cls._rec_name] = default_rec_name\n\n        # get the default values defined in the object\n        for field_name in fields_names:\n            if field_name in cls._defaults:\n                value[field_name] = cls._defaults[field_name]()\n            field = cls._fields[field_name]\n            if (field._type == 'boolean'\n                    and field_name not in value):\n                value[field_name] = False\n            if (with_rec_name\n                    and field._type in ('many2one',)\n                    and value.get(field_name)):\n                Target = pool.get(field.model_name)\n                if 'rec_name' in Target._fields:\n                    value.setdefault(\n                        field_name + '.', {})['rec_name'] = Target(\n                            value[field_name]).rec_name\n        return value\n\n    @classmethod\n    def fields_get(cls, fields_names=None, level=0):\n        \"\"\"\n        Return the definition of each field on the model.\n        \"\"\"\n        definition = {}\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        FieldAccess = pool.get('ir.model.field.access')\n        ModelAccess = pool.get('ir.model.access')\n\n        # Add translation to cache\n        language = Transaction().language\n        trans_args = []\n        for fname, field in cls._fields.items():\n            if fields_names and fname not in fields_names:\n                continue\n            trans_args.extend(field.definition_translations(cls, language))\n        Translation.get_sources(trans_args)\n\n        encoder = PYSONEncoder()\n        decoder = PYSONDecoder(noeval=True)\n\n        accesses = FieldAccess.get_access([cls.__name__])[cls.__name__]\n        for fname, field in cls._fields.items():\n            if fields_names and fname not in fields_names:\n                continue\n            definition[fname] = field.definition(cls, language)\n            if not accesses.get(fname, {}).get('write', True):\n                definition[fname]['readonly'] = True\n                states = decoder.decode(definition[fname]['states'])\n                states.pop('readonly', None)\n                definition[fname]['states'] = encoder.encode(states)\n            for right in ['create', 'delete']:\n                definition[fname][right] = accesses.get(\n                    fname, {}).get(right, True)\n            if level > 0:\n                relation = definition[fname].get('relation')\n                if relation:\n                    Relation = pool.get(relation)\n                    relation_fields = Relation.fields_get(level=level - 1)\n                    definition[fname]['relation_fields'] = relation_fields\n                    for name, props in relation_fields.items():\n                        # Convert selection into list\n                        if isinstance(props.get('selection'), str):\n                            change_with = props.get('selection_change_with')\n                            if change_with:\n                                selection = getattr(\n                                    Relation(), props['selection'])()\n                            else:\n                                selection = getattr(\n                                    Relation, props['selection'])()\n                            props['selection'] = selection\n                schema = definition[fname].get('schema_model')\n                if schema:\n                    Schema = pool.get(schema)\n                    definition[fname]['relation_fields'] = (\n                        Schema.get_relation_fields())\n\n        for fname in list(definition.keys()):\n            # filter out fields which aren't in the fields_names list\n            if fields_names:\n                if fname not in fields_names:\n                    del definition[fname]\n            elif not ModelAccess.check_relation(\n                    cls.__name__, fname, mode='read'):\n                del definition[fname]\n        return definition\n\n    def pre_validate(self):\n        pass\n\n    @classmethod\n    def __names__(cls, field=None, record=None):\n        pool = Pool()\n        IrModel = pool.get('ir.model')\n        IrModelField = pool.get('ir.model.field')\n\n        names = {\n            'model': IrModel.get_name(cls.__name__),\n            }\n        if field:\n            names['field'] = IrModelField.get_name(cls.__name__, field)\n\n        if record:\n            try:\n                names['record'] = record.rec_name\n            except Exception:\n                names['record'] = record.id\n            if field:\n                value = getattr(record, field, None)\n                if isinstance(value, Model):\n                    try:\n                        value = value.rec_name\n                    except Exception:\n                        value = value.id\n                names['value'] = value\n        return names\n\n    def __init__(self, id=None, **kwargs):\n        super(Model, self).__init__()\n        if id is not None:\n            id = int(id)\n        self._id = id\n        self._deleted = self._removed = None\n        if kwargs:\n            self._values = self._record()\n            parent_values = defaultdict(dict)\n            has_context = {}\n            for name, value in kwargs.items():\n                if not name.startswith('_parent_'):\n                    setattr(self, name, value)\n                else:\n                    name, field = name.split('.', 1)\n                    name = name[len('_parent_'):]\n                    parent_values[name][field] = value\n                    value = parent_values[name]\n                if getattr(self.__class__, name).context:\n                    has_context[name] = value\n\n            for name, value in parent_values.items():\n                setattr(self, name, value)\n            # Set field with context a second times\n            # to ensure it was evaluated with all the fields\n            for name, value in has_context.items():\n                setattr(self, name, value)\n            self._init_values = self._values._copy()\n        else:\n            self._values = None\n            self._init_values = None\n\n    def __copy__(self):\n        copied = self.__class__(self.id)\n        copied._values = copy.copy(self._values)\n        copied._init_values = copy.copy(self._init_values)\n        return copied\n\n    def __getattr__(self, name):\n        if name.startswith('__') and name.endswith('__'):\n            raise AttributeError\n        try:\n            return self._values[name]\n        except (KeyError, TypeError):\n            raise AttributeError(\"'%s' Model has no attribute '%s': %s\"\n                % (self.__name__, name, self._values))\n\n    def __contains__(self, name):\n        return name in self._fields\n\n    def __int__(self):\n        return int(self.id)\n\n    def __str__(self):\n        return '%s,%s' % (self.__name__, self.id)\n\n    def __repr__(self):\n        if self.id is None or self.id < 0:\n            return \"Pool().get('%s')(**%s)\" % (self.__name__,\n                repr(self._default_values))\n        else:\n            return \"Pool().get('%s')(%s)\" % (self.__name__, self.id)\n\n    def __eq__(self, other):\n        if not isinstance(other, Model):\n            return NotImplemented\n        elif self.id is None or other.id is None:\n            return id(self) == id(other)\n        return (self.__name__, self.id) == (other.__name__, other.id)\n\n    def __lt__(self, other):\n        if not isinstance(other, Model) or self.__name__ != other.__name__:\n            return NotImplemented\n        return self.id < other.id\n\n    def __ne__(self, other):\n        return not self == other\n\n    def __hash__(self):\n        return hash((self.__name__, id(self) if self.id is None else self.id))\n\n    def __bool__(self):\n        return True\n\n    @property\n    def _default_values(self):\n        \"\"\"Return the values not stored.\n        By default, the value of a field is its internal representation except:\n            - for Many2One and One2One field: the id\n            - for Reference field: the string model,id\n            - for Many2Many: the list of ids\n            - for One2Many: the list of `_default_values`\n        \"\"\"\n        values = {}\n        if self._values:\n            for fname, value in self._values._items():\n                field = self._fields[fname]\n                if field._type in ('many2one', 'one2one', 'reference'):\n                    if value:\n                        if field._type == 'reference':\n                            value = str(value)\n                        else:\n                            value = value.id\n                elif field._type in ('one2many', 'many2many'):\n                    if field._type == 'one2many':\n                        value = [r._default_values for r in value]\n                    else:\n                        value = [r.id for r in value]\n                values[fname] = value\n        return values\n\n\ndef record(name, field_names):\n    def __init__(self, **kwargs):\n        for key, value in kwargs.items():\n            setattr(self, key, value)\n\n    def _getitem(self, field):\n        try:\n            return getattr(self, field)\n        except AttributeError:\n            raise KeyError(field)\n\n    def _setitem(self, field, value):\n        try:\n            return setattr(self, field, value)\n        except AttributeError:\n            raise KeyError(field)\n\n    def _contains(self, field):\n        try:\n            getattr(self, field)\n            return True\n        except AttributeError:\n            return False\n\n    def _clear(self):\n        for fname in self.__slots__:\n            try:\n                delattr(self, fname)\n            except AttributeError:\n                pass\n\n    def _copy(self):\n        return copy.copy(self)\n\n    def _get(self, field, default=None):\n        if field not in self.__slots__:\n            raise KeyError(field)\n        return getattr(self, field, default)\n\n    def _keys(self):\n        for fname in self.__slots__:\n            if hasattr(self, fname):\n                yield fname\n\n    def _items(self):\n        for fname in self.__slots__:\n            try:\n                yield fname, getattr(self, fname)\n            except AttributeError:\n                pass\n\n    _undefined = object()\n\n    def _pop(self, field, value=_undefined):\n        if field not in self.__slots__:\n            raise KeyError(field)\n        if value != _undefined:\n            value = getattr(self, field, value)\n        else:\n            try:\n                value = getattr(self, field)\n            except AttributeError:\n                raise KeyError(field)\n        try:\n            delattr(self, field)\n        except AttributeError:\n            pass\n        return value\n\n    def _popitem(self, field, value=_undefined):\n        return (field, self._pop(field, value=value))\n\n    def _setdefault(self, field, default=None):\n        try:\n            return getattr(self, field)\n        except AttributeError:\n            setattr(self, field, default)\n            return default\n\n    def _update(self, _other=None, **kwargs):\n        if isinstance(_other, collections.abc.Mapping):\n            _other = _other.items()\n        elif _other is None:\n            _other = []\n        chained = chain(_other, kwargs.items())\n        for key, value in chained:\n            setattr(self, key, value)\n\n    def _values(self):\n        for fname in self.__slots__:\n            try:\n                yield getattr(self, fname)\n            except AttributeError:\n                pass\n\n    field_names = set(field_names)\n    for fname in field_names:\n        if fname.startswith('_'):\n            raise ValueError(\n                \"Field names cannot start with an underscore: %r\" % name)\n    field_names = tuple(map(sys.intern, field_names))\n    type_dict = {\n        '__slots__': field_names,\n        '__init__': __init__,\n        '__getitem__': _getitem,\n        '__setitem__': _setitem,\n        '__contains__': _contains,\n        '_clear': _clear,\n        '_copy': _copy,\n        '_get': _get,\n        '_keys': _keys,\n        '_items': _items,\n        '_pop': _pop,\n        '_popitem': _popitem,\n        '_setdefault': _setdefault,\n        '_update': _update,\n        '_values': _values,\n        }\n    return type(name, (), type_dict)\n"
  },
  {
    "path": "trytond/model/modelsingleton.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.transaction import Transaction\n\nfrom .modelstorage import ModelStorage\n\n\nclass ModelSingleton(ModelStorage):\n    \"\"\"\n    Define a singleton model in Tryton.\n    \"\"\"\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        # Cache disable because it is used as a read by the client\n        cls.__rpc__['default_get'].cache = None\n\n    @classmethod\n    def get_singleton(cls):\n        '''\n        Return the instance of the unique record if there is one.\n        '''\n        singletons = super(ModelSingleton, cls).search([], limit=1)\n        if singletons:\n            return singletons[0]\n\n    @classmethod\n    def create(cls, vlist):\n        assert len(vlist) == 1\n        singleton = cls.get_singleton()\n        if not singleton:\n            return super(ModelSingleton, cls).create(vlist)\n        cls.write([singleton], vlist[0])\n        return [singleton]\n\n    @classmethod\n    def read(cls, ids, fields_names):\n        singleton = cls.get_singleton()\n        if not singleton:\n            fname_no_rec_name = [\n                f for f in fields_names\n                if '.' not in f and not f.startswith('_')]\n            res = cls.default_get(fname_no_rec_name,\n                with_rec_name=len(fname_no_rec_name) != len(fields_names))\n            for field_name in fields_names:\n                if field_name not in res:\n                    res[field_name] = None\n            res['id'] = ids[0]\n            res['_write'] = True\n            res['_delete'] = True\n            return [res]\n        res = super(ModelSingleton, cls).read([singleton.id], fields_names)\n        res[0]['id'] = ids[0]\n        return res\n\n    @classmethod\n    def write(cls, records, values, *args):\n        singleton = cls.get_singleton()\n        if not singleton:\n            with Transaction().set_context(_check_access=False):\n                singleton, = cls.create([values])\n        actions = (records, values) + args\n        args = []\n        for values in actions[1:None:2]:\n            args.extend(([singleton], values))\n        super(ModelSingleton, cls).write(*args)\n        # Clean local cache of original records\n        for record in sum(actions[0:None:2], []):\n            record._local_cache.pop(record.id, None)\n        # Clean transaction cache of all ids\n        for cache in Transaction().cache.values():\n            if cls.__name__ in cache:\n                cache[cls.__name__].clear()\n\n    @classmethod\n    def delete(cls, records):\n        singleton = cls.get_singleton()\n        if singleton:\n            super(ModelSingleton, cls).delete([singleton])\n        # Clean transaction cache of all ids\n        for cache in Transaction().cache.values():\n            if cls.__name__ in cache:\n                cache[cls.__name__].clear()\n\n    @classmethod\n    def copy(cls, records, default=None):\n        if default:\n            cls.write(records, default)\n        return records\n\n    @classmethod\n    def search(cls, domain, offset=0, limit=None, order=None, count=False):\n        res = super(ModelSingleton, cls).search(domain, offset=offset,\n                limit=limit, order=order, count=count)\n        if not res and not domain:\n            if count:\n                return 1\n            return [cls(1)]\n        return res\n\n    @classmethod\n    def default_get(cls, fields_names, with_rec_name=True):\n        if '_timestamp' in fields_names:\n            fields_names = list(fields_names)\n            fields_names.remove('_timestamp')\n        default = super(ModelSingleton, cls).default_get(fields_names,\n                with_rec_name=with_rec_name)\n        singleton = cls.get_singleton()\n        if singleton:\n            if with_rec_name:\n                fields_names = fields_names[:]\n                for field in fields_names[:]:\n                    if cls._fields[field]._type in ('many2one',):\n                        fields_names.append(field + '.rec_name')\n            default, = cls.read([singleton.id], fields_names=fields_names)\n            del default['id']\n        return default\n"
  },
  {
    "path": "trytond/model/modelsql.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nfrom collections import OrderedDict, defaultdict\nfrom functools import wraps\nfrom itertools import chain, groupby, islice, product, repeat\n\nfrom sql import (\n    Asc, Column, Desc, Expression, For, Literal, Null, NullsFirst, NullsLast,\n    Table, Union, With)\nfrom sql.aggregate import Count, Max\nfrom sql.conditionals import Coalesce\nfrom sql.functions import CurrentTimestamp, Extract, Substring\nfrom sql.operators import And, Concat, Equal, Operator, Or\n\nfrom trytond import backend\nfrom trytond.cache import freeze\nfrom trytond.config import config\nfrom trytond.exceptions import ConcurrencyException\nfrom trytond.i18n import gettext\nfrom trytond.pool import Pool\nfrom trytond.pyson import PYSONDecoder, PYSONEncoder\nfrom trytond.rpc import RPC\nfrom trytond.tools import cursor_dict, grouped_slice, reduce_ids\nfrom trytond.transaction import Transaction, record_cache_size\n\nfrom . import fields\nfrom .descriptors import dualmethod\nfrom .modelstorage import (\n    AccessError, ModelStorage, RequiredValidationError, SizeValidationError,\n    ValidationError, is_leaf)\nfrom .modelview import ModelView\n\n\nclass ForeignKeyError(ValidationError):\n    pass\n\n\nclass SQLConstraintError(ValidationError):\n    pass\n\n\nclass Constraint(object):\n    __slots__ = ('_table',)\n\n    def __init__(self, table):\n        assert isinstance(table, Table)\n        self._table = table\n\n    @property\n    def table(self):\n        return self._table\n\n    def __str__(self):\n        raise NotImplementedError\n\n    @property\n    def params(self):\n        raise NotImplementedError\n\n\nclass Check(Constraint):\n    __slots__ = ('_expression',)\n\n    def __init__(self, table, expression):\n        super(Check, self).__init__(table)\n        assert isinstance(expression, Expression)\n        self._expression = expression\n\n    @property\n    def expression(self):\n        return self._expression\n\n    def __str__(self):\n        return 'CHECK(%s)' % self.expression\n\n    @property\n    def params(self):\n        return self.expression.params\n\n\nclass Unique(Constraint):\n    __slots__ = ('_columns',)\n\n    def __init__(self, table, *columns):\n        super(Unique, self).__init__(table)\n        assert all(isinstance(col, Column) for col in columns)\n        self._columns = tuple(columns)\n\n    @property\n    def columns(self):\n        return self._columns\n\n    @property\n    def operators(self):\n        return tuple(Equal for c in self._columns)\n\n    def __str__(self):\n        return 'UNIQUE(%s)' % (', '.join(map(str, self.columns)))\n\n    @property\n    def params(self):\n        p = []\n        for column in self.columns:\n            p.extend(column.params)\n        return tuple(p)\n\n\nclass Exclude(Constraint):\n    __slots__ = ('_excludes', '_where')\n\n    def __init__(self, table, *excludes, **kwargs):\n        super(Exclude, self).__init__(table)\n        assert all(isinstance(c, Expression) and issubclass(o, Operator)\n            for c, o in excludes), excludes\n        self._excludes = tuple(excludes)\n        where = kwargs.get('where')\n        if where is not None:\n            assert isinstance(where, Expression)\n        self._where = where\n\n    @property\n    def excludes(self):\n        return self._excludes\n\n    @property\n    def columns(self):\n        return tuple(c for c, _ in self._excludes)\n\n    @property\n    def operators(self):\n        return tuple(o for _, o in self._excludes)\n\n    @property\n    def where(self):\n        return self._where\n\n    def __str__(self):\n        exclude = ', '.join('%s WITH %s' % (column, operator._operator)\n            for column, operator in self.excludes)\n        where = ''\n        if self.where:\n            where = ' WHERE ' + str(self.where)\n        return 'EXCLUDE (%s)' % exclude + where\n\n    @property\n    def params(self):\n        p = []\n        for column, operator in self._excludes:\n            p.extend(column.params)\n        if self.where:\n            p.extend(self.where.params)\n        return tuple(p)\n\n\nclass Index:\n    __slots__ = ('table', 'expressions', 'options')\n\n    def __init__(self, table, *expressions, **options):\n        self.table = table\n        assert all(\n            isinstance(e, Expression) and isinstance(u, self.Usage)\n            for e, u in expressions)\n        self.expressions = expressions\n        self.options = options\n\n    def __hash__(self):\n        table_def = (\n            self.table._name, self.table._schema, self.table._database)\n        expressions = (\n            (str(e), e.params, hash(u)) for e, u in self.expressions)\n        return hash((table_def, *expressions))\n\n    def __eq__(self, other):\n        return (\n            str(self.table) == str(other.table)\n            and len(self.expressions) == len(other.expressions)\n            and all((str(c), u) == (str(oc), ou)\n                for (c, u), (oc, ou) in zip(\n                    self.expressions, other.expressions))\n            and self.options == other.options)\n\n    class Unaccent(Expression):\n        \"Unaccent function if database support for index\"\n        __slots__ = ('_expression',)\n\n        def __init__(self, expression):\n            self._expression = expression\n\n        @property\n        def expression(self):\n            expression = self._expression\n            database = Transaction().database\n            if database.has_unaccent_indexable():\n                expression = database.unaccent(expression)\n            return expression\n\n        def __str__(self):\n            return str(self.expression)\n\n        @property\n        def params(self):\n            return self.expression.params\n\n    class Usage:\n        __slots__ = ('options',)\n\n        def __init__(self, **options):\n            self.options = options\n\n        def __hash__(self):\n            return hash((self.__class__.__name__, *self.options.items()))\n\n        def __eq__(self, other):\n            return (self.__class__ == other.__class__\n                and self.options == other.options)\n\n    class Equality(Usage):\n        __slots__ = ()\n\n    class Range(Usage):\n        __slots__ = ()\n\n    class Similarity(Usage):\n        __slots__ = ()\n\n\ndef no_table_query(func):\n    @wraps(func)\n    def wrapper(cls, *args, **kwargs):\n        if callable(cls.table_query):\n            raise NotImplementedError(\"On table_query\")\n        return func(cls, *args, **kwargs)\n    return wrapper\n\n\nclass ModelSQL(ModelStorage):\n    \"\"\"\n    Define a model with storage in database.\n    \"\"\"\n    __slots__ = ()\n    _table = None  # The name of the table in database\n    _order = None\n    _order_name = None  # Use to force order field when sorting on Many2One\n    _history = False\n    table_query = None\n\n    @classmethod\n    def __setup__(cls):\n        cls._table = config.get('table', cls.__name__, default=cls._table)\n        if not cls._table:\n            cls._table = cls.__name__.replace('.', '_')\n\n        assert cls._table[-9:] != '__history', \\\n            'Model _table %s cannot end with \"__history\"' % cls._table\n\n        super(ModelSQL, cls).__setup__()\n\n        cls._sql_constraints = []\n        cls._sql_indexes = set()\n        if not callable(cls.table_query):\n            table = cls.__table__()\n            cls._sql_constraints.append(\n                ('id_positive', Check(table, table.id >= 0),\n                    'ir.msg_id_positive'))\n            rec_name_field = getattr(cls, cls._rec_name, None)\n            if (isinstance(rec_name_field, fields.Field)\n                    and not hasattr(rec_name_field, 'set')):\n                column = Column(table, cls._rec_name)\n                if getattr(rec_name_field, 'search_unaccented', False):\n                    column = Index.Unaccent(column)\n                cls._sql_indexes.add(\n                    Index(table, (column, Index.Similarity())))\n        cls._order = [('id', None)]\n        if issubclass(cls, ModelView):\n            cls.__rpc__.update({\n                    'history_revisions': RPC(),\n                    })\n        if cls._history:\n            history_table = cls.__table_history__()\n            cls._sql_indexes.add(\n                Index(\n                    history_table,\n                    (history_table.id, Index.Equality())))\n\n    @classmethod\n    def __post_setup__(cls):\n        super().__post_setup__()\n\n        # Define Range index to optimise with reduce_ids\n        for field in cls._fields.values():\n            field_names = set()\n            if isinstance(field, fields.One2Many):\n                Target = field.get_target()\n                if field.field:\n                    field_names.add(field.field)\n            elif isinstance(field, fields.Many2Many):\n                Target = field.get_relation()\n                if field.origin:\n                    field_names.add(field.origin)\n                if field.target:\n                    field_names.add(field.target)\n            else:\n                continue\n            field_names.discard('id')\n            for field_name in field_names:\n                target_field = getattr(Target, field_name)\n                if (issubclass(Target, ModelSQL)\n                        and not callable(Target.table_query)\n                        and not hasattr(target_field, 'set')):\n                    target = Target.__table__()\n                    column = Column(target, field_name)\n                    if not target_field.required and Target != cls:\n                        where = column != Null\n                    else:\n                        where = None\n                    if target_field._type == 'reference':\n                        Target._sql_indexes.update({\n                                Index(\n                                    target,\n                                    (column, Index.Equality()),\n                                    where=where),\n                                Index(\n                                    target,\n                                    (column, Index.Similarity(begin=True)),\n                                    (target_field.sql_id(column, Target),\n                                        Index.Range()),\n                                    where=where),\n                                })\n                    else:\n                        Target._sql_indexes.add(\n                            Index(\n                                target,\n                                (column, Index.Range()),\n                                where=where))\n\n    @classmethod\n    def __table__(cls):\n        if callable(cls.table_query):\n            return cls.table_query()\n        else:\n            return Table(cls._table)\n\n    @classmethod\n    def __table_history__(cls):\n        if not cls._history:\n            raise ValueError('No history table')\n        return Table(cls._table + '__history')\n\n    @classmethod\n    def __table_handler__(cls, module_name=None, history=False):\n        return backend.TableHandler(cls, history=history)\n\n    @classmethod\n    def __register__(cls, module_name):\n        cursor = Transaction().connection.cursor()\n        super(ModelSQL, cls).__register__(module_name)\n\n        if callable(cls.table_query):\n            return\n\n        pool = Pool()\n        # Initiate after the callable test to prevent calling table_query which\n        # may rely on other model being registered\n        sql_table = cls.__table__()\n\n        # create/update table in the database\n        table = cls.__table_handler__(module_name)\n        if cls._history:\n            history_table = cls.__table_handler__(module_name, history=True)\n\n        for field_name, field in cls._fields.items():\n            if field_name == 'id':\n                continue\n            sql_type = field.sql_type()\n            if not sql_type:\n                continue\n\n            default = None\n            if field_name in cls._defaults:\n                def default():\n                    default_ = cls._clean_defaults({\n                            field_name: cls._defaults[field_name](),\n                            })[field_name]\n                    return field.sql_format(default_)\n\n            table.add_column(field_name, field._sql_type, default=default)\n            if cls._history:\n                history_table.add_column(field_name, field._sql_type)\n\n            if isinstance(field, (fields.Integer, fields.Float)):\n                # migration from tryton 2.2\n                table.db_default(field_name, None)\n\n            if isinstance(field, (fields.Boolean)):\n                table.db_default(field_name, False)\n\n            if isinstance(field, fields.Many2One):\n                if field.model_name in ('res.user', 'res.group'):\n                    # XXX need to merge ir and res\n                    ref = field.model_name.replace('.', '_')\n                else:\n                    ref_model = pool.get(field.model_name)\n                    if (issubclass(ref_model, ModelSQL)\n                            and not callable(ref_model.table_query)):\n                        ref = ref_model._table\n                        # Create foreign key table if missing\n                        if not backend.TableHandler.table_exist(ref):\n                            backend.TableHandler(ref_model)\n                    else:\n                        ref = None\n                if field_name in ['create_uid', 'write_uid']:\n                    # migration from 3.6\n                    table.drop_fk(field_name)\n                elif ref:\n                    table.add_fk(field_name, ref, field.ondelete)\n\n            required = field.required\n            # Do not set 'NOT NULL' for Binary field as the database column\n            # will be left empty if stored in the filestore or filled later by\n            # the set method.\n            if isinstance(field, fields.Binary):\n                required = False\n            table.not_null_action(\n                field_name, action=required and 'add' or 'remove')\n\n        for field_name, field in cls._fields.items():\n            if (isinstance(field, fields.Many2One)\n                    and field.model_name == cls.__name__):\n                if field.path:\n                    default_path = cls._defaults.get(\n                        field.path, lambda: None)()\n                    cursor.execute(*sql_table.select(sql_table.id,\n                            where=(\n                                Column(sql_table, field.path) == default_path)\n                            | (Column(sql_table, field.path) == Null),\n                            limit=1))\n                    if cursor.fetchone():\n                        cls._rebuild_path(field_name)\n                if field.left and field.right:\n                    left_default = cls._defaults.get(\n                        field.left, lambda: None)()\n                    right_default = cls._defaults.get(\n                        field.right, lambda: None)()\n                    cursor.execute(*sql_table.select(sql_table.id,\n                            where=(\n                                Column(sql_table, field.left) == left_default)\n                            | (Column(sql_table, field.left) == Null)\n                            | (Column(sql_table, field.right) == right_default)\n                            | (Column(sql_table, field.right) == Null),\n                            limit=1))\n                    if cursor.fetchone():\n                        cls._rebuild_tree(field_name, None, 0)\n\n        for ident, constraint, _ in cls._sql_constraints:\n            assert (\n                not ident.startswith('idx_') and not ident.endswith('_index'))\n            table.add_constraint(ident, constraint)\n\n        if cls._history:\n            cls._update_history_table()\n            history_table = cls.__table_history__()\n            cursor.execute(*sql_table.select(sql_table.id, limit=1))\n            if cursor.fetchone():\n                cursor.execute(\n                    *history_table.select(history_table.id, limit=1))\n                if not cursor.fetchone():\n                    columns = [n for n, f in cls._fields.items()\n                        if f.sql_type()]\n                    cursor.execute(*history_table.insert(\n                            [Column(history_table, c) for c in columns],\n                            sql_table.select(*(Column(sql_table, c)\n                                    for c in columns))))\n                    cursor.execute(*history_table.update(\n                            [history_table.write_date], [None]))\n\n    @classmethod\n    def _update_sql_indexes(cls):\n        if not callable(cls.table_query):\n            table_h = cls.__table_handler__()\n            # TODO: remove overlapping indexes\n            table_h.set_indexes(cls._sql_indexes)\n\n    @classmethod\n    def _update_history_table(cls):\n        if cls._history:\n            history_table = cls.__table_handler__(history=True)\n            for field_name, field in cls._fields.items():\n                if not field.sql_type():\n                    continue\n                history_table.add_column(field_name, field._sql_type)\n\n    @classmethod\n    def __raise_integrity_error(\n            cls, exception, values, field_names=None, transaction=None):\n        pool = Pool()\n        if field_names is None:\n            field_names = list(cls._fields.keys())\n        if transaction is None:\n            transaction = Transaction()\n        for field_name in field_names:\n            if field_name not in cls._fields:\n                continue\n            field = cls._fields[field_name]\n            # Check required fields\n            if (field.required\n                    and field.sql_type()\n                    and field_name not in ('create_uid', 'create_date')):\n                if values.get(field_name) is None:\n                    raise RequiredValidationError(\n                        gettext('ir.msg_required_validation',\n                            **cls.__names__(field_name)))\n        for name, _, error in cls._sql_constraints:\n            if backend.TableHandler.convert_name(name) in str(exception):\n                raise SQLConstraintError(gettext(error))\n        # Check foreign key in last because this can raise false positive\n        # if the target is created during the same transaction.\n        for field_name in field_names:\n            if field_name not in cls._fields:\n                continue\n            field = cls._fields[field_name]\n            if isinstance(field, fields.Many2One) and values.get(field_name):\n                Model = pool.get(field.model_name)\n                create_records = transaction.create_records[field.model_name]\n                delete_records = transaction.delete_records[field.model_name]\n                target_records = Model.search([\n                        ('id', '=', field.sql_format(values[field_name])),\n                        ], order=[])\n                if not ((\n                            target_records\n                            or (values[field_name] in create_records))\n                        and (values[field_name] not in delete_records)):\n                    error_args = cls.__names__(field_name)\n                    error_args['value'] = values[field_name]\n                    raise ForeignKeyError(\n                            gettext('ir.msg_foreign_model_missing',\n                                **error_args))\n\n    @classmethod\n    def __raise_data_error(\n            cls, exception, values, field_names=None, transaction=None):\n        if field_names is None:\n            field_names = list(cls._fields.keys())\n        if transaction is None:\n            transaction = Transaction()\n        for field_name in field_names:\n            if field_name not in cls._fields:\n                continue\n            field = cls._fields[field_name]\n            # Check field size\n            if (hasattr(field, 'size')\n                    and isinstance(field.size, int)\n                    and field.sql_type()):\n                value = values.get(field_name) or ''\n                size = len(value)\n                if size > field.size:\n                    error_args = cls.__names__(field_name)\n                    error_args['value'] = value\n                    error_args['size'] = size\n                    error_args['max_size'] = field.size\n                    raise SizeValidationError(\n                        gettext('ir.msg_size_validation', **error_args))\n\n    @classmethod\n    def history_revisions(cls, ids):\n        pool = Pool()\n        ModelAccess = pool.get('ir.model.access')\n        User = pool.get('res.user')\n        cursor = Transaction().connection.cursor()\n\n        ModelAccess.check(cls.__name__, 'read')\n\n        table = cls.__table_history__()\n        user = User.__table__()\n        revisions = []\n        for sub_ids in grouped_slice(ids):\n            where = reduce_ids(table.id, sub_ids)\n            cursor.execute(*table.join(user, 'LEFT',\n                    Coalesce(table.write_uid, table.create_uid) == user.id)\n                .select(\n                    Coalesce(table.write_date, table.create_date),\n                    table.id,\n                    user.name,\n                    where=where))\n            revisions.append(cursor.fetchall())\n        revisions = list(chain(*revisions))\n        revisions.sort(reverse=True)\n        # SQLite uses char for COALESCE\n        if revisions and isinstance(revisions[0][0], str):\n            strptime = datetime.datetime.strptime\n            format_ = '%Y-%m-%d %H:%M:%S.%f'\n            revisions = [(strptime(timestamp, format_), id_, name)\n                for timestamp, id_, name in revisions]\n        return revisions\n\n    @classmethod\n    def _insert_history(cls, ids, deleted=False):\n        transaction = Transaction()\n        cursor = transaction.connection.cursor()\n        if not cls._history:\n            return\n        user = transaction.user\n        table = cls.__table__()\n        history = cls.__table_history__()\n        columns = []\n        hcolumns = []\n        if not deleted:\n            fields = cls._fields\n        else:\n            fields = {\n                'id': cls.id,\n                'write_uid': cls.write_uid,\n                'write_date': cls.write_date,\n                }\n        for fname, field in sorted(fields.items()):\n            if not field.sql_type():\n                continue\n            columns.append(Column(table, fname))\n            hcolumns.append(Column(history, fname))\n        for sub_ids in grouped_slice(ids):\n            if not deleted:\n                where = reduce_ids(table.id, sub_ids)\n                cursor.execute(*history.insert(hcolumns,\n                        table.select(*columns, where=where)))\n            else:\n                if transaction.database.has_multirow_insert():\n                    cursor.execute(*history.insert(hcolumns,\n                            [[id_, CurrentTimestamp(), user]\n                                for id_ in sub_ids]))\n                else:\n                    for id_ in sub_ids:\n                        cursor.execute(*history.insert(hcolumns,\n                                [[id_, CurrentTimestamp(), user]]))\n\n    @classmethod\n    def _restore_history(cls, ids, datetime, _before=False):\n        if not cls._history:\n            return\n        transaction = Transaction()\n        cursor = transaction.connection.cursor()\n        table = cls.__table__()\n        history = cls.__table_history__()\n        columns = []\n        hcolumns = []\n        fnames = sorted(n for n, f in cls._fields.items()\n            if f.sql_type())\n        for fname in fnames:\n            columns.append(Column(table, fname))\n            if fname == 'write_uid':\n                hcolumns.append(Literal(transaction.user))\n            elif fname == 'write_date':\n                hcolumns.append(CurrentTimestamp())\n            else:\n                hcolumns.append(Column(history, fname))\n\n        def is_deleted(values):\n            return all(not v for n, v in zip(fnames, values)\n                if n not in ['id', 'write_uid', 'write_date'])\n\n        to_delete = []\n        to_update = []\n        for id_ in ids:\n            column_datetime = Coalesce(history.write_date, history.create_date)\n            if not _before:\n                hwhere = (column_datetime <= datetime)\n            else:\n                hwhere = (column_datetime < datetime)\n            hwhere &= (history.id == id_)\n            horder = (column_datetime.desc, Column(history, '__id').desc)\n            cursor.execute(*history.select(*hcolumns,\n                    where=hwhere, order_by=horder, limit=1))\n            values = cursor.fetchone()\n            if not values or is_deleted(values):\n                to_delete.append(id_)\n            else:\n                to_update.append(id_)\n                values = list(values)\n                cursor.execute(*table.update(columns, values,\n                        where=table.id == id_))\n                rowcount = cursor.rowcount\n                if rowcount == -1 or rowcount is None:\n                    cursor.execute(*table.select(table.id,\n                            where=table.id == id_))\n                    rowcount = len(cursor.fetchall())\n                if rowcount < 1:\n                    cursor.execute(*table.insert(columns, [values]))\n\n        if to_delete:\n            for sub_ids in grouped_slice(to_delete):\n                where = reduce_ids(table.id, sub_ids)\n                cursor.execute(*table.delete(where=where))\n            cls._insert_history(to_delete, True)\n        if to_update:\n            cls._insert_history(to_update)\n\n    @classmethod\n    def restore_history(cls, ids, datetime):\n        'Restore record ids from history at the date time'\n        cls._restore_history(ids, datetime)\n\n    @classmethod\n    def restore_history_before(cls, ids, datetime):\n        'Restore record ids from history before the date time'\n        cls._restore_history(ids, datetime, _before=True)\n\n    @classmethod\n    def __check_timestamp(cls, ids):\n        transaction = Transaction()\n        cursor = transaction.connection.cursor()\n        table = cls.__table__()\n        if not transaction.timestamp:\n            return\n        for sub_ids in grouped_slice(ids):\n            where = Or()\n            for id_ in sub_ids:\n                try:\n                    timestamp = transaction.timestamp.pop(\n                        '%s,%s' % (cls.__name__, id_))\n                except KeyError:\n                    continue\n                if timestamp is None:\n                    continue\n                sql_type = fields.Char('timestamp').sql_type().base\n                where.append((table.id == id_)\n                    & (Extract('EPOCH',\n                            Coalesce(table.write_date, table.create_date)\n                            ).cast(sql_type) != timestamp))\n            if where:\n                cursor.execute(*table.select(table.id, where=where, limit=1))\n                if cursor.fetchone():\n                    raise ConcurrencyException(\n                        'Records were modified in the meanwhile')\n\n    @classmethod\n    @no_table_query\n    def create(cls, vlist):\n        transaction = Transaction()\n        cursor = transaction.connection.cursor()\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n\n        super(ModelSQL, cls).create(vlist)\n\n        table = cls.__table__()\n        modified_fields = set()\n        defaults_cache = {}  # Store already computed default values\n        missing_defaults = {}  # Store missing default values by schema\n        new_ids = []\n        vlist = [v.copy() for v in vlist]\n        for values in vlist:\n            # Clean values\n            for key in ('create_uid', 'create_date',\n                    'write_uid', 'write_date', 'id'):\n                if key in values:\n                    del values[key]\n            modified_fields |= values.keys()\n\n            # Get default values\n            values_schema = tuple(sorted(values))\n            if values_schema not in missing_defaults:\n                default = []\n                missing_defaults[values_schema] = default_values = {}\n                for fname, field in cls._fields.items():\n                    if fname in values:\n                        continue\n                    if fname in [\n                            'create_uid', 'create_date',\n                            'write_uid', 'write_date', 'id']:\n                        continue\n                    if isinstance(field, fields.Function) and not field.setter:\n                        continue\n                    if fname in defaults_cache:\n                        default_values[fname] = defaults_cache[fname]\n                    else:\n                        default.append(fname)\n\n                if default:\n                    defaults = cls.default_get(default, with_rec_name=False)\n                    default_values.update(cls._clean_defaults(defaults))\n                    defaults_cache.update(default_values)\n            values.update(missing_defaults[values_schema])\n\n            insert_columns = [table.create_uid, table.create_date]\n            insert_values = [transaction.user, CurrentTimestamp()]\n\n            # Insert record\n            for fname, value in values.items():\n                field = cls._fields[fname]\n                if not hasattr(field, 'set'):\n                    insert_columns.append(Column(table, fname))\n                    insert_values.append(field.sql_format(value))\n\n            try:\n                if transaction.database.has_returning():\n                    cursor.execute(*table.insert(insert_columns,\n                            [insert_values], [table.id]))\n                    id_new, = cursor.fetchone()\n                else:\n                    id_new = transaction.database.nextid(\n                        transaction.connection, cls._table)\n                    if id_new:\n                        insert_columns.append(table.id)\n                        insert_values.append(id_new)\n                        cursor.execute(*table.insert(insert_columns,\n                                [insert_values]))\n                    else:\n                        cursor.execute(*table.insert(insert_columns,\n                                [insert_values]))\n                        id_new = transaction.database.lastid(cursor)\n                new_ids.append(id_new)\n            except (\n                    backend.DatabaseIntegrityError,\n                    backend.DatabaseDataError) as exception:\n                transaction = Transaction()\n                with Transaction().new_transaction(), \\\n                        Transaction().set_context(_check_access=False):\n                    if isinstance(exception, backend.DatabaseIntegrityError):\n                        cls.__raise_integrity_error(\n                            exception, values, transaction=transaction)\n                    elif isinstance(exception, backend.DatabaseDataError):\n                        cls.__raise_data_error(\n                            exception, values, transaction=transaction)\n                raise\n\n        transaction.create_records[cls.__name__].update(new_ids)\n\n        # Update path before fields_to_set which could create children\n        if cls._path_fields:\n            field_names = list(sorted(cls._path_fields))\n            cls._set_path(field_names, repeat(new_ids, len(field_names)))\n        # Update mptt before fields_to_set which could create children\n        if cls._mptt_fields:\n            field_names = list(sorted(cls._mptt_fields))\n            cls._update_mptt(field_names, repeat(new_ids, len(field_names)))\n\n        translation_values = {}\n        fields_to_set = {}\n        for values, new_id in zip(vlist, new_ids):\n            for fname, value in values.items():\n                field = cls._fields[fname]\n                if (getattr(field, 'translate', False)\n                        and not hasattr(field, 'set')):\n                    translation_values.setdefault(\n                        '%s,%s' % (cls.__name__, fname), {})[new_id] = (\n                            field.sql_format(value))\n                if hasattr(field, 'set'):\n                    args = fields_to_set.setdefault(fname, [])\n                    actions = iter(args)\n                    for ids, val in zip(actions, actions):\n                        if val == value:\n                            ids.append(new_id)\n                            break\n                    else:\n                        args.extend(([new_id], value))\n\n        if translation_values:\n            for name, translations in translation_values.items():\n                Translation.set_ids(name, 'model', Transaction().language,\n                    list(translations.keys()), list(translations.values()))\n\n        for fname in sorted(fields_to_set, key=cls.index_set_field):\n            fargs = fields_to_set[fname]\n            field = cls._fields[fname]\n            field.set(cls, fname, *fargs)\n\n        cls._insert_history(new_ids)\n\n        cls.__check_domain_rule(new_ids, 'create')\n        records = cls.browse(new_ids)\n        for sub_records in grouped_slice(\n                records, record_cache_size(transaction)):\n            cls._validate(sub_records)\n\n        cls.trigger_create(records)\n        return records\n\n    @classmethod\n    def read(cls, ids, fields_names):\n        pool = Pool()\n        Rule = pool.get('ir.rule')\n        Translation = pool.get('ir.translation')\n        super(ModelSQL, cls).read(ids, fields_names=fields_names)\n        transaction = Transaction()\n        cursor = Transaction().connection.cursor()\n\n        if not ids:\n            return []\n\n        # construct a clause for the rules :\n        domain = Rule.domain_get(cls.__name__, mode='read')\n\n        fields_related = defaultdict(set)\n        extra_fields = set()\n        if 'write_date' not in fields_names:\n            extra_fields.add('write_date')\n        for field_name in fields_names:\n            if field_name in {'_timestamp', '_write', '_delete'}:\n                continue\n            if '.' in field_name:\n                field_name, field_related = field_name.split('.', 1)\n                fields_related[field_name].add(field_related)\n            field = cls._fields[field_name]\n            if hasattr(field, 'datetime_field') and field.datetime_field:\n                extra_fields.add(field.datetime_field)\n            if field.context:\n                extra_fields.update(fields.get_eval_fields(field.context))\n        extra_fields.discard('id')\n        all_fields = (\n            set(fields_names) | fields_related.keys() | extra_fields)\n\n        result = []\n        table = cls.__table__()\n\n        in_max = transaction.database.IN_MAX\n        history_order = None\n        history_clause = None\n        history_limit = None\n        if (cls._history\n                and transaction.context.get('_datetime')\n                and not callable(cls.table_query)):\n            in_max = 1\n            table = cls.__table_history__()\n            column = Coalesce(table.write_date, table.create_date)\n            history_clause = (column <= Transaction().context['_datetime'])\n            history_order = (column.desc, Column(table, '__id').desc)\n            history_limit = 1\n\n        columns = {}\n        for f in all_fields:\n            field = cls._fields.get(f)\n            if field and field.sql_type():\n                columns[f] = field.sql_column(table).as_(f)\n                if backend.name == 'sqlite':\n                    columns[f].output_name += ' [%s]' % field.sql_type().base\n            elif f in {'_write', '_delete'}:\n                if not callable(cls.table_query):\n                    rule_domain = Rule.domain_get(\n                        cls.__name__, mode=f.lstrip('_'))\n                    # No need to compute rule domain if it is the same as the\n                    # read rule domain because it is already applied as where\n                    # clause.\n                    if rule_domain and rule_domain != domain:\n                        rule_tables = {None: (table, None)}\n                        rule_tables, rule_expression = cls.search_domain(\n                            rule_domain, active_test=False, tables=rule_tables)\n                        if len(rule_tables) > 1:\n                            # The expression uses another table\n                            rule_tables, rule_expression = cls.search_domain(\n                                rule_domain, active_test=False)\n                            rule_from = convert_from(None, rule_tables)\n                            rule_table, _ = rule_tables[None]\n                            rule_where = rule_table.id == table.id\n                            rule_expression = rule_from.select(\n                                        rule_expression, where=rule_where)\n                        columns[f] = rule_expression.as_(f)\n                    else:\n                        columns[f] = Literal(True).as_(f)\n            elif f == '_timestamp' and not callable(cls.table_query):\n                sql_type = fields.Char('timestamp').sql_type().base\n                columns[f] = Extract(\n                    'EPOCH', Coalesce(table.write_date, table.create_date)\n                    ).cast(sql_type).as_('_timestamp')\n\n        if ('write_date' not in fields_names\n                and columns.keys() == {'write_date'}):\n            columns.pop('write_date')\n            extra_fields.discard('write_date')\n        if columns:\n            if 'id' not in fields_names:\n                columns['id'] = table.id.as_('id')\n\n            tables = {None: (table, None)}\n            if domain:\n                tables, dom_exp = cls.search_domain(\n                    domain, active_test=False, tables=tables)\n            from_ = convert_from(None, tables)\n            for sub_ids in grouped_slice(ids, in_max):\n                sub_ids = list(sub_ids)\n                red_sql = reduce_ids(table.id, sub_ids)\n                where = red_sql\n                if history_clause:\n                    where &= history_clause\n                if domain:\n                    where &= dom_exp\n                cursor.execute(*from_.select(*columns.values(), where=where,\n                        order_by=history_order, limit=history_limit))\n                fetchall = list(cursor_dict(cursor))\n                if not len(fetchall) == len({}.fromkeys(sub_ids)):\n                    cls.__check_domain_rule(\n                        ids, 'read', nodomain='ir.msg_read_error')\n                    cls.__check_domain_rule(ids, 'read')\n                    raise RuntimeError(\"Undetected access error\")\n                result.extend(fetchall)\n        else:\n            result = [{'id': x} for x in ids]\n\n        cachable_fields = []\n        max_write_date = max(\n            (r['write_date'] for r in result if r.get('write_date')),\n            default=None)\n        for fname, column in columns.items():\n            if fname.startswith('_'):\n                continue\n            field = cls._fields[fname]\n            if not hasattr(field, 'get'):\n                if getattr(field, 'translate', False):\n                    translations = Translation.get_ids(\n                        cls.__name__ + ',' + fname, 'model',\n                        Transaction().language, ids,\n                        cached_after=max_write_date)\n                    for row in result:\n                        row[fname] = translations.get(row['id']) or row[fname]\n                if fname != 'id':\n                    cachable_fields.append(fname)\n\n        # all fields for which there is a get attribute\n        getter_fields = [f for f in all_fields\n            if f in cls._fields and hasattr(cls._fields[f], 'get')]\n        getter_fields = sorted(getter_fields, key=cls.index_get_field)\n\n        cache = transaction.get_cache()[cls.__name__]\n        if getter_fields and cachable_fields:\n            for row in result:\n                for fname in cachable_fields:\n                    cache[row['id']][fname] = row[fname]\n\n        func_fields = {}\n        for fname in getter_fields:\n            field = cls._fields[fname]\n            if isinstance(field, fields.Function):\n                key = (\n                    field.getter, field.getter_with_context,\n                    getattr(field, 'datetime_field', None))\n                func_fields.setdefault(key, [])\n                func_fields[key].append(fname)\n            elif getattr(field, 'datetime_field', None):\n                for row in result:\n                    with Transaction().set_context(\n                            _datetime=row[field.datetime_field]):\n                        date_result = field.get([row['id']], cls, fname,\n                            values=[row])\n                    row[fname] = date_result[row['id']]\n            else:\n                # get the value of that field for all records/ids\n                getter_result = field.get(ids, cls, fname, values=result)\n                for row in result:\n                    row[fname] = getter_result[row['id']]\n\n        for key in func_fields:\n            field_list = func_fields[key]\n            fname = field_list[0]\n            field = cls._fields[fname]\n            _, getter_with_context, datetime_field = key\n            if datetime_field:\n                for row in result:\n                    with Transaction().set_context(\n                            _datetime=row[datetime_field]):\n                        date_results = field.get([row['id']], cls, field_list,\n                            values=[row])\n                    for fname in field_list:\n                        date_result = date_results[fname]\n                        row[fname] = date_result[row['id']]\n            else:\n                for sub_results in grouped_slice(\n                        result, record_cache_size(transaction)):\n                    sub_results = list(sub_results)\n                    sub_ids = []\n                    sub_values = []\n                    for row in sub_results:\n                        if (row['id'] not in cache\n                                or any(f not in cache[row['id']]\n                                    for f in field_list)):\n                            sub_ids.append(row['id'])\n                            sub_values.append(row)\n                        else:\n                            for fname in field_list:\n                                row[fname] = cache[row['id']][fname]\n                    getter_results = field.get(\n                        sub_ids, cls, field_list, values=sub_values)\n                    for fname in field_list:\n                        getter_result = getter_results[fname]\n                        for row in sub_values:\n                            row[fname] = getter_result[row['id']]\n                            if (transaction.readonly\n                                    and not getter_with_context):\n                                cache[row['id']][fname] = row[fname]\n\n        def read_related(field, Target, rows, fields):\n            name = field.name\n            target_ids = []\n            if field._type.endswith('2many'):\n                add = target_ids.extend\n            elif field._type == 'reference':\n                def add(value):\n                    try:\n                        id_ = int(value.split(',', 1)[1])\n                    except ValueError:\n                        pass\n                    else:\n                        if id_ >= 0:\n                            target_ids.append(id_)\n            else:\n                add = target_ids.append\n            for row in rows:\n                value = row[name]\n                if value is not None:\n                    add(value)\n            return Target.read(target_ids, fields)\n\n        def add_related(field, rows, targets):\n            name = field.name\n            key = name + '.'\n            if field._type.endswith('2many'):\n                for row in rows:\n                    row[key] = values = list()\n                    for target in row[name]:\n                        if target is not None:\n                            values.append(targets[target])\n            else:\n                for row in rows:\n                    value = row[name]\n                    if isinstance(value, str):\n                        try:\n                            value = int(value.split(',', 1)[1])\n                        except ValueError:\n                            value = None\n                    if value is not None and value >= 0:\n                        row[key] = targets[value]\n                    else:\n                        row[key] = None\n\n        to_del = set()\n        for fname in fields_related.keys() | extra_fields:\n            if fname not in fields_names:\n                to_del.add(fname)\n            if fname not in cls._fields:\n                continue\n            if fname not in fields_related:\n                continue\n            field = cls._fields[fname]\n            datetime_field = getattr(field, 'datetime_field', None)\n\n            def groupfunc(row):\n                ctx = {}\n                if field.context:\n                    pyson_context = PYSONEncoder().encode(field.context)\n                    ctx.update(PYSONDecoder(row).decode(pyson_context))\n                if datetime_field:\n                    ctx['_datetime'] = row.get(datetime_field)\n                if field._type == 'reference':\n                    value = row[fname]\n                    if not value:\n                        Target = None\n                    else:\n                        model, _ = value.split(',', 1)\n                        Target = pool.get(model)\n                else:\n                    Target = field.get_target()\n                return Target, ctx\n\n            def orderfunc(row):\n                Target, ctx = groupfunc(row)\n                return (Target.__name__ if Target else '', freeze(ctx))\n\n            for (Target, ctx), rows in groupby(\n                    sorted(result, key=orderfunc), key=groupfunc):\n                rows = list(rows)\n                with Transaction().set_context(ctx):\n                    if Target:\n                        targets = read_related(\n                            field, Target, rows, list(fields_related[fname]))\n                        targets = {t['id']: t for t in targets}\n                    else:\n                        targets = {}\n                    add_related(field, rows, targets)\n\n        for row, field in product(result, to_del):\n            del row[field]\n\n        return result\n\n    @classmethod\n    @no_table_query\n    def write(cls, records, values, *args):\n        transaction = Transaction()\n        cursor = transaction.connection.cursor()\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        Config = pool.get('ir.configuration')\n\n        assert not len(args) % 2\n        # Remove possible duplicates from all records\n        all_records = list(OrderedDict.fromkeys(\n                sum(((records, values) + args)[0:None:2], [])))\n        all_ids = [r.id for r in all_records]\n        all_field_names = set()\n\n        # Call before cursor cache cleaning\n        trigger_eligibles = cls.trigger_write_get_eligibles(all_records)\n\n        super(ModelSQL, cls).write(records, values, *args)\n\n        table = cls.__table__()\n\n        cls.__check_timestamp(all_ids)\n        cls.__check_domain_rule(\n            all_ids, 'write', nodomain='ir.msg_write_error')\n\n        fields_to_set = {}\n        actions = iter((records, values) + args)\n        for records, values in zip(actions, actions):\n            ids = [r.id for r in records]\n            values = values.copy()\n\n            # Clean values\n            for key in ('create_uid', 'create_date',\n                    'write_uid', 'write_date', 'id'):\n                if key in values:\n                    del values[key]\n\n            columns = [table.write_uid, table.write_date]\n            update_values = [transaction.user, CurrentTimestamp()]\n            store_translation = Transaction().language == Config.get_language()\n            for fname, value in values.items():\n                field = cls._fields[fname]\n                if not hasattr(field, 'set'):\n                    if (not getattr(field, 'translate', False)\n                            or store_translation):\n                        columns.append(Column(table, fname))\n                        update_values.append(field.sql_format(value))\n\n            for sub_ids in grouped_slice(ids):\n                red_sql = reduce_ids(table.id, sub_ids)\n                try:\n                    cursor.execute(*table.update(columns, update_values,\n                            where=red_sql))\n                except (\n                        backend.DatabaseIntegrityError,\n                        backend.DatabaseDataError) as exception:\n                    transaction = Transaction()\n                    with Transaction().new_transaction(), \\\n                            Transaction().set_context(_check_access=False):\n                        if isinstance(\n                                exception, backend.DatabaseIntegrityError):\n                            cls.__raise_integrity_error(\n                                exception, values, list(values.keys()),\n                                transaction=transaction)\n                        elif isinstance(exception, backend.DatabaseDataError):\n                            cls.__raise_data_error(\n                                exception, values, list(values.keys()),\n                                transaction=transaction)\n                    raise\n\n            for fname, value in values.items():\n                field = cls._fields[fname]\n                if (getattr(field, 'translate', False)\n                        and not hasattr(field, 'set')):\n                    Translation.set_ids(\n                        '%s,%s' % (cls.__name__, fname), 'model',\n                        transaction.language, ids,\n                        [field.sql_format(value)] * len(ids))\n                if hasattr(field, 'set'):\n                    fields_to_set.setdefault(fname, []).extend((ids, value))\n\n            path_fields = cls._path_fields & values.keys()\n            if path_fields:\n                cls._update_path(\n                    list(sorted(path_fields)), repeat(ids, len(path_fields)))\n\n            mptt_fields = cls._mptt_fields & values.keys()\n            if mptt_fields:\n                cls._update_mptt(\n                    list(sorted(mptt_fields)), repeat(ids, len(mptt_fields)),\n                    values)\n            all_field_names |= values.keys()\n\n        for fname in sorted(fields_to_set, key=cls.index_set_field):\n            fargs = fields_to_set[fname]\n            field = cls._fields[fname]\n            field.set(cls, fname, *fargs)\n\n        cls._insert_history(all_ids)\n\n        cls.__check_domain_rule(all_ids, 'write')\n        for sub_records in grouped_slice(\n                all_records, record_cache_size(transaction)):\n            cls._validate(sub_records, field_names=all_field_names)\n\n        cls.trigger_write(trigger_eligibles)\n\n    @classmethod\n    @no_table_query\n    def delete(cls, records):\n        transaction = Transaction()\n        cursor = transaction.connection.cursor()\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        ids = list(map(int, records))\n\n        if not ids:\n            return\n\n        table = cls.__table__()\n\n        if cls.__name__ in transaction.delete_records:\n            ids = ids[:]\n            for del_id in transaction.delete_records[cls.__name__]:\n                while ids:\n                    try:\n                        ids.remove(del_id)\n                    except ValueError:\n                        break\n\n        cls.__check_timestamp(ids)\n        cls.__check_domain_rule(ids, 'delete')\n\n        tree_ids = {}\n        for fname in cls._mptt_fields:\n            field = cls._fields[fname]\n            tree_ids[fname] = []\n            for sub_ids in grouped_slice(ids):\n                where = reduce_ids(field.sql_column(table), sub_ids)\n                cursor.execute(*table.select(table.id, where=where))\n                tree_ids[fname] += [x[0] for x in cursor]\n\n        has_translation = any(\n            getattr(f, 'translate', False) and not hasattr(f, 'set')\n            for f in cls._fields.values())\n\n        foreign_keys_tocheck = []\n        foreign_keys_toupdate = []\n        foreign_keys_todelete = []\n        for _, model in pool.iterobject():\n            if callable(getattr(model, 'table_query', None)):\n                continue\n            if not issubclass(model, ModelStorage):\n                continue\n            for field_name, field in model._fields.items():\n                if (isinstance(field, fields.Many2One)\n                        and field.model_name == cls.__name__):\n                    if field.ondelete == 'CASCADE':\n                        foreign_keys_todelete.append((model, field_name))\n                    elif field.ondelete == 'SET NULL':\n                        if field.required:\n                            foreign_keys_tocheck.append((model, field_name))\n                        else:\n                            foreign_keys_toupdate.append((model, field_name))\n                    else:\n                        foreign_keys_tocheck.append((model, field_name))\n\n        transaction.delete_records[cls.__name__].update(ids)\n        cls.trigger_delete(records)\n\n        def get_related_records(Model, field_name, sub_ids):\n            if issubclass(Model, ModelSQL):\n                foreign_table = Model.__table__()\n                foreign_red_sql = reduce_ids(\n                    Column(foreign_table, field_name), sub_ids)\n                cursor.execute(*foreign_table.select(foreign_table.id,\n                        where=foreign_red_sql))\n                records = Model.browse([x[0] for x in cursor])\n            else:\n                with transaction.set_context(active_test=False):\n                    records = Model.search([(field_name, 'in', sub_ids)])\n            return records\n\n        for sub_ids, sub_records in zip(\n                grouped_slice(ids), grouped_slice(records)):\n            sub_ids = list(sub_ids)\n            red_sql = reduce_ids(table.id, sub_ids)\n\n            for Model, field_name in foreign_keys_toupdate:\n                if (not hasattr(Model, 'search')\n                        or not hasattr(Model, 'write')):\n                    continue\n                records = get_related_records(Model, field_name, sub_ids)\n                if records:\n                    Model.write(records, {\n                            field_name: None,\n                            })\n\n            for Model, field_name in foreign_keys_todelete:\n                if (not hasattr(Model, 'search')\n                        or not hasattr(Model, 'delete')):\n                    continue\n                records = get_related_records(Model, field_name, sub_ids)\n                if records:\n                    Model.delete(records)\n\n            for Model, field_name in foreign_keys_tocheck:\n                with Transaction().set_context(\n                        _check_access=False, active_test=False):\n                    if Model.search([\n                                (field_name, 'in', sub_ids),\n                                ], order=[]):\n                        error_args = Model.__names__(field_name)\n                        raise ForeignKeyError(\n                            gettext('ir.msg_foreign_model_exist',\n                                **error_args))\n\n            super(ModelSQL, cls).delete(list(sub_records))\n\n            try:\n                cursor.execute(*table.delete(where=red_sql))\n            except backend.DatabaseIntegrityError as exception:\n                transaction = Transaction()\n                with Transaction().new_transaction():\n                    cls.__raise_integrity_error(\n                        exception, {}, transaction=transaction)\n                raise\n\n        if has_translation:\n            Translation.delete_ids(cls.__name__, 'model', ids)\n\n        cls._insert_history(ids, deleted=True)\n\n        cls._update_mptt(list(tree_ids.keys()), list(tree_ids.values()))\n\n    @classmethod\n    def __check_domain_rule(cls, ids, mode, nodomain=None):\n        pool = Pool()\n        Rule = pool.get('ir.rule')\n        Model = pool.get('ir.model')\n        table = cls.__table__()\n        transaction = Transaction()\n        in_max = transaction.database.IN_MAX\n        history_clause = None\n        limit = None\n        if (mode == 'read'\n                and cls._history\n                and transaction.context.get('_datetime')\n                and not callable(cls.table_query)):\n            in_max = 1\n            table = cls.__table_history__()\n            column = Coalesce(table.write_date, table.create_date)\n            history_clause = (column <= Transaction().context['_datetime'])\n            limit = 1\n        cursor = transaction.connection.cursor()\n        assert mode in Rule.modes\n\n        def test_domain(ids, domain):\n            result = []\n            tables = {None: (table, None)}\n            if domain:\n                tables, dom_exp = cls.search_domain(\n                    domain, active_test=False, tables=tables)\n            from_ = convert_from(None, tables)\n            for sub_ids in grouped_slice(ids, in_max):\n                sub_ids = set(sub_ids)\n                where = reduce_ids(table.id, sub_ids)\n                if history_clause:\n                    where &= history_clause\n                if domain:\n                    where &= dom_exp\n                cursor.execute(\n                    *from_.select(table.id, where=where, limit=limit))\n                rowcount = cursor.rowcount\n                if rowcount == -1 or rowcount is None:\n                    rowcount = len(cursor.fetchall())\n                if rowcount != len(sub_ids):\n                    cursor.execute(\n                        *from_.select(table.id, where=where, limit=limit))\n                    result.extend(\n                        sub_ids.difference([x for x, in cursor]))\n            return result\n\n        domain = Rule.domain_get(cls.__name__, mode=mode)\n        if not domain and not nodomain:\n            return\n        wrong_ids = test_domain(ids, domain)\n        if wrong_ids:\n            model = cls.__name__\n            if Model:\n                model = Model.get_name(cls.__name__)\n            ids = ', '.join(map(str, ids[:5]))\n            if len(wrong_ids) > 5:\n                ids += '...'\n            if domain:\n                rules = []\n                clause, clause_global = Rule.get(cls.__name__, mode=mode)\n                if clause:\n                    dom = list(clause.values())\n                    dom.insert(0, 'OR')\n                    if test_domain(wrong_ids, dom):\n                        rules.extend(clause.keys())\n\n                for rule, dom in clause_global.items():\n                    if test_domain(wrong_ids, dom):\n                        rules.append(rule)\n\n                msg = gettext(\n                    'ir.msg_%s_rule_error' % mode, ids=ids, model=model,\n                    rules='\\n'.join(r.name for r in rules))\n            else:\n                msg = gettext(nodomain, ids=ids, model=model)\n            raise AccessError(msg)\n\n    @classmethod\n    def __search_query(cls, domain, count, query, order):\n        pool = Pool()\n        Rule = pool.get('ir.rule')\n\n        rule_domain = Rule.domain_get(cls.__name__, mode='read')\n        joined_domains = None\n        if domain and domain[0] == 'OR':\n            local_domains, subquery_domains = split_subquery_domain(domain)\n            if subquery_domains:\n                joined_domains = subquery_domains\n                if local_domains:\n                    local_domains.insert(0, 'OR')\n                    joined_domains.append(local_domains)\n\n        def get_local_columns(order_exprs):\n            local_columns = []\n            for order_expr in order_exprs:\n                if (isinstance(order_expr, Column)\n                        and isinstance(order_expr._from, Table)\n                        and order_expr._from._name == cls._table):\n                    local_columns.append(order_expr._name)\n                else:\n                    raise NotImplementedError\n            return local_columns\n\n        # The UNION optimization needs the columns used to order the query\n        extra_columns = set()\n        if order and joined_domains:\n            tables = {\n                None: (cls.__table__(), None),\n                }\n            for oexpr, otype in order:\n                fname = oexpr.partition('.')[0]\n                field = cls._fields[fname]\n                field_orders = field.convert_order(oexpr, tables, cls)\n                try:\n                    order_columns = get_local_columns(field_orders)\n                    extra_columns.update(order_columns)\n                except NotImplementedError:\n                    joined_domains = None\n                    break\n\n        # In case the search uses subqueries it's more efficient to use a UNION\n        # of queries than using clauses with some JOIN because databases can\n        # used indexes\n        if joined_domains is not None:\n            union_tables = []\n            for sub_domain in joined_domains:\n                tables, expression = cls.search_domain(sub_domain)\n                if rule_domain:\n                    tables, domain_exp = cls.search_domain(\n                        rule_domain, active_test=False, tables=tables)\n                    expression &= domain_exp\n                main_table, _ = tables[None]\n                table = convert_from(None, tables)\n                columns = cls.__searched_columns(main_table,\n                    eager=not count and not query,\n                    extra_columns=extra_columns)\n                union_tables.append(table.select(\n                        *columns, where=expression))\n            expression = None\n            tables = {\n                None: (Union(*union_tables, all_=False), None),\n                }\n        else:\n            tables, expression = cls.search_domain(domain)\n            if rule_domain:\n                tables, domain_exp = cls.search_domain(\n                    rule_domain, active_test=False, tables=tables)\n                expression &= domain_exp\n\n        return tables, expression\n\n    @classmethod\n    def __searched_columns(\n            cls, table, *, eager=False, history=False, extra_columns=None):\n        if extra_columns is None:\n            extra_columns = []\n        else:\n            extra_columns = sorted(extra_columns - {'id', '__id', '_datetime'})\n        columns = [table.id.as_('id')]\n        if (cls._history and Transaction().context.get('_datetime')\n                and (eager or history)):\n            columns.append(\n                Coalesce(table.write_date, table.create_date).as_('_datetime'))\n            columns.append(Column(table, '__id').as_('__id'))\n        for column_name in extra_columns:\n            field = cls._fields[column_name]\n            sql_column = field.sql_column(table).as_(column_name)\n            columns.append(sql_column)\n        if eager:\n            columns += [f.sql_column(table).as_(n)\n                for n, f in sorted(cls._fields.items())\n                if not hasattr(f, 'get')\n                    and n not in extra_columns\n                    and n != 'id'\n                    and not getattr(f, 'translate', False)\n                    and f.loading == 'eager']\n            if not callable(cls.table_query):\n                sql_type = fields.Char('timestamp').sql_type().base\n                columns += [Extract('EPOCH',\n                        Coalesce(table.write_date, table.create_date)\n                        ).cast(sql_type).as_('_timestamp')]\n        return columns\n\n    @classmethod\n    def __search_order(cls, order, tables):\n        order_by = []\n        order_types = {\n            'DESC': Desc,\n            'ASC': Asc,\n            }\n        null_ordering_types = {\n            'NULLS FIRST': NullsFirst,\n            'NULLS LAST': NullsLast,\n            None: lambda _: _\n            }\n        for oexpr, otype in order:\n            fname, _, extra_expr = oexpr.partition('.')\n            field = cls._fields[fname]\n            if not otype:\n                otype, null_ordering = 'ASC', None\n            else:\n                otype = otype.upper()\n                try:\n                    otype, null_ordering = otype.split(' ', 1)\n                except ValueError:\n                    null_ordering = None\n            Order = order_types[otype]\n            NullOrdering = null_ordering_types[null_ordering]\n            forder = field.convert_order(oexpr, tables, cls)\n            order_by.extend((NullOrdering(Order(o)) for o in forder))\n\n        return order_by\n\n    @classmethod\n    def search(cls, domain, offset=0, limit=None, order=None, count=False,\n            query=False):\n        transaction = Transaction()\n        cursor = transaction.connection.cursor()\n\n        super(ModelSQL, cls).search(\n            domain, offset=offset, limit=limit, order=order, count=count)\n\n        if order is None or order is False:\n            order = cls._order\n        tables, expression = cls.__search_query(domain, count, query, order)\n\n        main_table, _ = tables[None]\n        if count:\n            table = convert_from(None, tables)\n            if (limit is not None and limit < cls.count()) or offset:\n                select = table.select(\n                    Literal(1), where=expression, limit=limit, offset=offset\n                    ).select(Count(Literal('*')))\n            else:\n                select = table.select(Count(Literal('*')), where=expression)\n            if query:\n                return select\n            else:\n                cursor.execute(*select)\n                return cursor.fetchone()[0]\n\n        order_by = cls.__search_order(order, tables)\n        # compute it here because __search_order might modify tables\n        table = convert_from(None, tables)\n        columns = cls.__searched_columns(main_table, eager=not query)\n        select = table.select(\n            *columns, where=expression, limit=limit, offset=offset,\n            order_by=order_by)\n\n        if query:\n            return select\n        cursor.execute(*select)\n\n        rows = list(cursor_dict(cursor, transaction.database.IN_MAX))\n        cache = transaction.get_cache()\n        delete_records = transaction.delete_records[cls.__name__]\n\n        def filter_history(rows):\n            if not (cls._history and transaction.context.get('_datetime')):\n                return rows\n\n            def history_key(row):\n                return row['_datetime'], row['__id']\n\n            ids_history = {}\n            for row in rows:\n                key = history_key(row)\n                if row['id'] in ids_history:\n                    if key < ids_history[row['id']]:\n                        continue\n                ids_history[row['id']] = key\n\n            to_delete = set()\n            history = cls.__table_history__()\n            for sub_ids in grouped_slice([r['id'] for r in rows]):\n                where = reduce_ids(history.id, sub_ids)\n                cursor.execute(*history.select(\n                        history.id.as_('id'),\n                        history.write_date.as_('write_date'),\n                        where=where\n                        & (history.write_date != Null)\n                        & (history.create_date == Null)\n                        & (history.write_date\n                            <= transaction.context['_datetime'])))\n                for deleted_id, delete_date in cursor:\n                    history_date, _ = ids_history[deleted_id]\n                    if isinstance(history_date, str):\n                        strptime = datetime.datetime.strptime\n                        format_ = '%Y-%m-%d %H:%M:%S.%f'\n                        history_date = strptime(history_date, format_)\n                    if history_date <= delete_date:\n                        to_delete.add(deleted_id)\n\n            return filter(lambda r: history_key(r) == ids_history[r['id']]\n                and r['id'] not in to_delete, rows)\n\n        # Can not cache the history value if we are not sure to have fetch all\n        # the rows for each records\n        if (not (cls._history and transaction.context.get('_datetime'))\n                or len(rows) < transaction.database.IN_MAX):\n            rows = list(filter_history(rows))\n            keys = None\n            for data in islice(rows, 0, cache.size_limit):\n                if data['id'] in delete_records:\n                    continue\n                if keys is None:\n                    keys = list(data.keys())\n                    for k in keys[:]:\n                        if k in ('_timestamp', '_datetime', '__id'):\n                            continue\n                        field = cls._fields[k]\n                        if not getattr(field, 'datetime_field', None):\n                            keys.remove(k)\n                            continue\n                for k in keys:\n                    del data[k]\n                cache[cls.__name__][data['id']]._update(data)\n\n        if len(rows) >= transaction.database.IN_MAX:\n            columns = cls.__searched_columns(main_table, history=True)\n            cursor.execute(*table.select(*columns,\n                    where=expression, order_by=order_by,\n                    limit=limit, offset=offset))\n            rows = filter_history(list(cursor_dict(cursor)))\n\n        return cls.browse([x['id'] for x in rows])\n\n    @classmethod\n    def search_domain(cls, domain, active_test=True, tables=None):\n        '''\n        Return SQL tables and expression\n        Set active_test to add it.\n        '''\n        transaction = Transaction()\n        domain = cls._search_domain_active(domain, active_test=active_test)\n\n        if tables is None:\n            tables = {}\n        if None not in tables:\n            if cls._history and transaction.context.get('_datetime'):\n                tables[None] = (cls.__table_history__(), None)\n            else:\n                tables[None] = (cls.__table__(), None)\n\n        def convert(domain):\n            if is_leaf(domain):\n                fname = domain[0].split('.', 1)[0]\n                field = cls._fields[fname]\n                expression = field.convert_domain(domain, tables, cls)\n                if not isinstance(expression, (Operator, Expression)):\n                    return convert(expression)\n                return expression\n            elif not domain or list(domain) in (['OR'], ['AND']):\n                return Literal(True)\n            elif domain[0] == 'OR':\n                return Or((convert(d) for d in domain[1:]))\n            else:\n                return And((convert(d) for d in (\n                            domain[1:] if domain[0] == 'AND' else domain)))\n\n        with Transaction().set_context(_check_access=False):\n            expression = convert(domain)\n\n        if cls._history and transaction.context.get('_datetime'):\n            table, _ = tables[None]\n            expression &= (Coalesce(table.write_date, table.create_date)\n                <= transaction.context['_datetime'])\n        return tables, expression\n\n    @classmethod\n    def _rebuild_path(cls, field_name):\n        \"Rebuild path for the tree.\"\n        cursor = Transaction().connection.cursor()\n        field = cls._fields[field_name]\n        table = cls.__table__()\n        tree = With('id', 'path', recursive=True)\n        tree.query = table.select(\n            table.id, Concat(table.id, '/'),\n            where=Column(table, field_name) == Null)\n        tree.query |= (table\n            .join(tree,\n                condition=Column(table, field_name) == tree.id)\n            .select(table.id, Concat(Concat(tree.path, table.id), '/')))\n        query = table.update(\n            [Column(table, field.path)],\n            [tree.path],\n            from_=[tree], where=table.id == tree.id,\n            with_=[tree])\n        cursor.execute(*query)\n\n    @classmethod\n    def _set_path(cls, field_names, list_ids):\n        cursor = Transaction().connection.cursor()\n        table = cls.__table__()\n        parent = cls.__table__()\n        for field_name, ids in zip(field_names, list_ids):\n            field = cls._fields[field_name]\n            parent_column = Column(table, field_name)\n            path_column = Column(table, field.path)\n            query = table.update(\n                [path_column],\n                [Concat(Concat(Coalesce(\n                                parent.select(parent.path,\n                                    where=parent.id == parent_column),\n                                ''), table.id), '/')])\n            for sub_ids in grouped_slice(ids):\n                query.where = reduce_ids(table.id, sub_ids)\n                cursor.execute(*query)\n\n    @classmethod\n    def _update_path(cls, field_names, list_ids):\n        transaction = Transaction()\n        cursor = transaction.connection.cursor()\n        update = transaction.connection.cursor()\n        table = cls.__table__()\n        parent = cls.__table__()\n\n        def update_path(query, column, sub_ids):\n            updated = set()\n            query.where = reduce_ids(table.id, sub_ids)\n            cursor.execute(*query)\n            for old_path, new_path in cursor:\n                if old_path == new_path:\n                    continue\n                if any(old_path.startswith(p) for p in updated):\n                    return False\n                update.execute(*table.update(\n                        [column],\n                        [Concat(new_path,\n                                Substring(table.path, len(old_path) + 1))],\n                        where=table.path.like(old_path + '%')))\n                updated.add(old_path)\n            return True\n\n        for field_name, ids in zip(field_names, list_ids):\n            field = cls._fields[field_name]\n            parent_column = Column(table, field_name)\n            parent_path_column = Column(parent, field.path)\n            path_column = Column(table, field.path)\n            query = (table\n                .join(parent, 'LEFT',\n                    condition=parent_column == parent.id)\n                .select(path_column,\n                    Concat(Concat(\n                            Coalesce(parent_path_column, ''), table.id), '/')))\n            for sub_ids in grouped_slice(ids):\n                sub_ids = list(sub_ids)\n                while not update_path(query, path_column, sub_ids):\n                    pass\n\n    @classmethod\n    def _update_mptt(cls, field_names, list_ids, values=None):\n        for field_name, ids in zip(field_names, list_ids):\n            field = cls._fields[field_name]\n            if (values is not None\n                    and (field.left in values or field.right in values)):\n                raise Exception('ValidateError',\n                    'You can not update fields: \"%s\", \"%s\"' %\n                    (field.left, field.right))\n\n            if len(ids) < max(cls.count() / 4, 4):\n                for id_ in ids:\n                    cls._update_tree(id_, field_name,\n                        field.left, field.right)\n            else:\n                cls._rebuild_tree(field_name, None, 0)\n\n    @classmethod\n    def _rebuild_tree(cls, parent, parent_id, left):\n        '''\n        Rebuild left, right value for the tree.\n        '''\n        cursor = Transaction().connection.cursor()\n        table = cls.__table__()\n        right = left + 1\n\n        cursor.execute(*table.select(table.id,\n                where=Column(table, parent) == parent_id))\n        for child_id, in cursor:\n            right = cls._rebuild_tree(parent, child_id, right)\n\n        field = cls._fields[parent]\n\n        if parent_id:\n            cursor.execute(*table.update(\n                    [Column(table, field.left), Column(table, field.right)],\n                    [left, right],\n                    where=table.id == parent_id))\n        return right + 1\n\n    @classmethod\n    def _update_tree(cls, record_id, field_name, left, right):\n        '''\n        Update left, right values for the tree.\n        Remarks:\n            - the value (right - left - 1) / 2 will not give\n                the number of children node\n        '''\n        cursor = Transaction().connection.cursor()\n        table = cls.__table__()\n        left = Column(table, left)\n        right = Column(table, right)\n        field = Column(table, field_name)\n        cursor.execute(*table.select(left, right, field,\n                where=table.id == record_id))\n        fetchone = cursor.fetchone()\n        if not fetchone:\n            return\n        old_left, old_right, parent_id = fetchone\n        if old_left == old_right == 0:\n            cursor.execute(*table.select(Max(right),\n                    where=field == Null))\n            old_left, = cursor.fetchone()\n            old_left += 1\n            old_right = old_left + 1\n            cursor.execute(*table.update([left, right],\n                    [old_left, old_right],\n                    where=table.id == record_id))\n        size = old_right - old_left + 1\n\n        parent_right = 1\n\n        if parent_id:\n            cursor.execute(*table.select(right, where=table.id == parent_id))\n            parent_right = cursor.fetchone()[0]\n        else:\n            cursor.execute(*table.select(Max(right), where=field == Null))\n            fetchone = cursor.fetchone()\n            if fetchone:\n                parent_right = fetchone[0] + 1\n\n        cursor.execute(*table.update([left], [left + size],\n                where=left >= parent_right))\n        cursor.execute(*table.update([right], [right + size],\n                where=right >= parent_right))\n        if old_left < parent_right:\n            left_delta = parent_right - old_left\n            right_delta = parent_right - old_left\n            left_cond = old_left\n            right_cond = old_right\n        else:\n            left_delta = parent_right - old_left - size\n            right_delta = parent_right - old_left - size\n            left_cond = old_left + size\n            right_cond = old_right + size\n        cursor.execute(*table.update([left, right],\n                [left + left_delta, right + right_delta],\n                where=(left >= left_cond) & (right <= right_cond)))\n\n    @classmethod\n    def validate(cls, records):\n        super(ModelSQL, cls).validate(records)\n        transaction = Transaction()\n        database = transaction.database\n        connection = transaction.connection\n        has_constraint = database.has_constraint\n        lock = database.lock\n        cursor = transaction.connection.cursor()\n        # Works only for a single transaction\n        ids = list(map(int, records))\n        for _, sql, error in cls._sql_constraints:\n            if has_constraint(sql):\n                continue\n            table = sql.table\n            if isinstance(sql, (Unique, Exclude)):\n                lock(connection, cls._table)\n                columns = list(sql.columns)\n                columns.insert(0, table.id)\n                in_max = transaction.database.IN_MAX // (len(columns) + 1)\n                for sub_ids in grouped_slice(ids, in_max):\n                    where = reduce_ids(table.id, sub_ids)\n                    if isinstance(sql, Exclude) and sql.where:\n                        where &= sql.where\n\n                    cursor.execute(*table.select(*columns, where=where))\n\n                    where = Literal(False)\n                    for row in cursor:\n                        clause = table.id != row[0]\n                        for column, operator, value in zip(\n                                sql.columns, sql.operators, row[1:]):\n                            if value is None:\n                                # NULL is always unique\n                                clause &= Literal(False)\n                            clause &= operator(column, value)\n                        where |= clause\n                    if isinstance(sql, Exclude) and sql.where:\n                        where &= sql.where\n                    cursor.execute(\n                        *table.select(table.id, where=where, limit=1))\n                    if cursor.fetchone():\n                        raise SQLConstraintError(gettext(error))\n            elif isinstance(sql, Check):\n                for sub_ids in grouped_slice(ids):\n                    red_sql = reduce_ids(table.id, sub_ids)\n                    cursor.execute(*table.select(table.id,\n                            where=~sql.expression & red_sql,\n                            limit=1))\n                    if cursor.fetchone():\n                        raise SQLConstraintError(gettext(error))\n\n    @dualmethod\n    def lock(cls, records=None):\n        transaction = Transaction()\n        database = transaction.database\n        connection = transaction.connection\n        table = cls.__table__()\n\n        if records is not None and database.has_select_for():\n            for sub_records in grouped_slice(records):\n                where = reduce_ids(table.id, sub_records)\n                query = table.select(\n                    Literal(1), where=where, for_=For('UPDATE', nowait=True))\n                with connection.cursor() as cursor:\n                    cursor.execute(*query)\n        else:\n            database.lock(connection, cls._table)\n\n\ndef convert_from(table, tables):\n    # Don't nested joins as SQLite doesn't support\n    right, condition = tables[None]\n    if table:\n        table = table.join(right, 'LEFT', condition)\n    else:\n        table = right\n    for k, sub_tables in tables.items():\n        if k is None:\n            continue\n        table = convert_from(table, sub_tables)\n    return table\n\n\ndef split_subquery_domain(domain):\n    \"\"\"\n    Split a domain in two parts:\n        - the first one contains all the sub-domains with only local fields\n        - the second one contains all the sub-domains using a related field\n    The main operator of the domain will be stripped from the results.\n    \"\"\"\n    local_domains, subquery_domains = [], []\n    for sub_domain in domain:\n        if is_leaf(sub_domain):\n            if '.' in sub_domain[0]:\n                subquery_domains.append(sub_domain)\n            else:\n                local_domains.append(sub_domain)\n        elif (not sub_domain or list(sub_domain) in [['OR'], ['AND']]\n                or sub_domain in ['OR', 'AND']):\n            continue\n        else:\n            sub_ldomains, sub_sqdomains = split_subquery_domain(sub_domain)\n            if sub_sqdomains:\n                subquery_domains.append(sub_domain)\n            else:\n                local_domains.append(sub_domain)\n\n    return local_domains, subquery_domains\n"
  },
  {
    "path": "trytond/model/modelstorage.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport base64\nimport csv\nimport datetime\nimport decimal\nimport random\nimport time\nfrom collections import defaultdict\nfrom decimal import Decimal\nfrom functools import lru_cache, wraps\nfrom itertools import chain, groupby, islice\nfrom operator import itemgetter\n\nfrom trytond.cache import Cache, LRUDictTransaction, freeze, unfreeze\nfrom trytond.config import config\nfrom trytond.const import OPERATORS\nfrom trytond.exceptions import UserError\nfrom trytond.i18n import gettext, lazy_gettext\nfrom trytond.pool import Pool\nfrom trytond.pyson import PYSON, PYSONDecoder, PYSONEncoder\nfrom trytond.rpc import RPC\nfrom trytond.tools import grouped_slice, is_instance_method, reduce_domain\nfrom trytond.tools.domain_inversion import domain_inversion, eval_domain\nfrom trytond.tools.domain_inversion import parse as domain_parse\nfrom trytond.transaction import Transaction, record_cache_size\n\nfrom . import fields\nfrom .descriptors import dualmethod\nfrom .model import Model\n\n__all__ = ['ModelStorage', 'EvalEnvironment']\n_cache_field = config.getint('cache', 'field')\n_cache_count_timeout = config.getint(\n    'cache', 'count_timeout', default=60 * 60 * 24)\n_cache_count_clear = config.getint(\n    'cache', 'count_clear', default=1000)\n\n\ndef local_cache(Model, transaction=None):\n    if transaction is None:\n        transaction = Transaction()\n    return LRUDictTransaction(record_cache_size(transaction), Model._record)\n\n\nclass AccessError(UserError):\n    pass\n\n\nclass ImportDataError(UserError):\n    pass\n\n\nclass ValidationError(UserError):\n    pass\n\n\nclass DomainValidationError(ValidationError):\n    pass\n\n\nclass RequiredValidationError(ValidationError):\n    pass\n\n\nclass SizeValidationError(ValidationError):\n    pass\n\n\nclass DigitsValidationError(ValidationError):\n    pass\n\n\nclass ForbiddenCharValidationError(ValidationError):\n    pass\n\n\nclass SelectionValidationError(ValidationError):\n    pass\n\n\nclass TimeFormatValidationError(ValidationError):\n    pass\n\n\ndef without_check_access(func):\n    @wraps(func)\n    def wrapper(*args, **kwargs):\n        with Transaction().set_context(_check_access=False):\n            return func(*args, **kwargs)\n    return wrapper\n\n\ndef is_leaf(expression):\n    return (isinstance(expression, (list, tuple))\n        and len(expression) > 2\n        and isinstance(expression[1], str)\n        and expression[1] in OPERATORS)  # TODO remove OPERATORS test\n\n\nclass ModelStorage(Model):\n    \"\"\"\n    Define a model with storage capability in Tryton.\n    \"\"\"\n    __slots__ = ('_transaction', '_user', '_context', '_ids',\n        '_transaction_cache', '_local_cache')\n\n    create_uid = fields.Many2One(\n        'res.user', lazy_gettext('ir.msg_created_by'), readonly=True)\n    create_date = fields.Timestamp(\n        lazy_gettext('ir.msg_created_at'), readonly=True)\n    write_uid = fields.Many2One(\n        'res.user', lazy_gettext('ir.msg_edited_by'), readonly=True)\n    write_date = fields.Timestamp(\n        lazy_gettext('ir.msg_edited_at'), readonly=True)\n    rec_name = fields.Function(\n        fields.Char(lazy_gettext('ir.msg_record_name')), 'get_rec_name',\n        searcher='search_rec_name')\n    _count_cache = Cache(\n        'modelstorage.count', duration=_cache_count_timeout, context=False)\n\n    @classmethod\n    def __setup__(cls):\n        from .modelview import ModelView\n        super(ModelStorage, cls).__setup__()\n        if issubclass(cls, ModelView):\n            cls.__rpc__.update({\n                    'create': RPC(readonly=False,\n                        result=lambda r: list(map(int, r))),\n                    'read': RPC(),\n                    'write': RPC(readonly=False,\n                        instantiate=slice(0, None, 2)),\n                    'delete': RPC(readonly=False, instantiate=0),\n                    'copy': RPC(readonly=False, instantiate=0, unique=False,\n                        result=lambda r: list(map(int, r))),\n                    'search': RPC(result=lambda r: list(map(int, r))),\n                    'search_count': RPC(),\n                    'search_read': RPC(),\n                    'resources': RPC(instantiate=0, unique=False),\n                    'export_data_domain': RPC(),\n                    'export_data': RPC(instantiate=0, unique=False),\n                    'import_data': RPC(readonly=False),\n                    })\n\n    @classmethod\n    def __post_setup__(cls):\n        super().__post_setup__()\n\n        cls._mptt_fields = set()\n        cls._path_fields = set()\n        for name, field in cls._fields.items():\n            if (isinstance(field, fields.Many2One)\n                    and field.model_name == cls.__name__):\n                if field.path:\n                    cls._path_fields.add(name)\n                if field.left and field.right:\n                    cls._mptt_fields.add(name)\n\n    @staticmethod\n    def default_create_uid():\n        \"Default value for uid field.\"\n        return int(Transaction().user)\n\n    @staticmethod\n    def default_create_date():\n        \"Default value for create_date field.\"\n        return datetime.datetime.today()\n\n    @classmethod\n    def create(cls, vlist):\n        '''\n        Returns the list of created records.\n        '''\n        pool = Pool()\n        ModelAccess = pool.get('ir.model.access')\n        ModelFieldAccess = pool.get('ir.model.field.access')\n\n        ModelAccess.check(cls.__name__, 'create')\n\n        all_fields = list(set().union(*vlist))\n        ModelFieldAccess.check(cls.__name__, all_fields, 'write')\n\n        # Increase transaction counter\n        Transaction().counter += 1\n\n        count = cls._count_cache.get(cls.__name__)\n        if count is not None:\n            if random.random() < 1 / _cache_count_clear:\n                cls._count_cache.set(cls.__name__, None)\n            else:\n                cls._count_cache.set(cls.__name__, count + len(vlist))\n\n    @classmethod\n    @without_check_access\n    def trigger_create(cls, records):\n        '''\n        Trigger create actions\n        '''\n        Trigger = Pool().get('ir.trigger')\n        triggers = Trigger.get_triggers(cls.__name__, 'create')\n        if not triggers:\n            return\n        for trigger in triggers:\n            trigger.queue_trigger_action(records)\n\n    @classmethod\n    def read(cls, ids, fields_names):\n        '''\n        Read fields_names of record ids.\n        The order is not guaranteed.\n        '''\n        pool = Pool()\n        ModelAccess = pool.get('ir.model.access')\n        ModelFieldAccess = pool.get('ir.model.field.access')\n        ModelAccess.check(cls.__name__, 'read')\n        ModelFieldAccess.check(cls.__name__, fields_names, 'read')\n        return []\n\n    @classmethod\n    def index_get_field(cls, name):\n        \"Returns the index sort order of the field get calls.\"\n        return 0\n\n    @classmethod\n    def write(cls, records, values, *args):\n        '''\n        Write values on records.\n        '''\n        pool = Pool()\n        ModelAccess = pool.get('ir.model.access')\n        ModelFieldAccess = pool.get('ir.model.field.access')\n\n        assert not len(args) % 2\n        actions = iter((records, values) + args)\n        all_records = []\n        all_fields = set()\n        for records, values in zip(actions, actions):\n            if not cls.check_xml_record(records, values):\n                raise AccessError(\n                    gettext('ir.msg_write_xml_record'),\n                    gettext('ir.msg_base_config_record'))\n            all_records += records\n            all_fields.update(values.keys())\n\n        ModelAccess.check(cls.__name__, 'write')\n        ModelFieldAccess.check(cls.__name__, all_fields, 'write')\n\n        # Increase transaction counter\n        Transaction().counter += 1\n\n        # Clean local cache\n        for record in all_records:\n            record._local_cache.pop(record.id, None)\n\n        # Clean transaction cache\n        for cache in Transaction().cache.values():\n            if cls.__name__ in cache:\n                cache_cls = cache[cls.__name__]\n                for record in all_records:\n                    cache_cls.pop(record.id, None)\n\n    @classmethod\n    @without_check_access\n    def trigger_write_get_eligibles(cls, records):\n        '''\n        Return eligible records for write actions by triggers\n        '''\n        Trigger = Pool().get('ir.trigger')\n        triggers = Trigger.get_triggers(cls.__name__, 'write')\n        if not triggers:\n            return {}\n        eligibles = {}\n        for trigger in triggers:\n            eligibles[trigger] = []\n            for record in records:\n                if not Trigger.eval(trigger, record):\n                    eligibles[trigger].append(record)\n        return eligibles\n\n    @classmethod\n    @without_check_access\n    def trigger_write(cls, eligibles):\n        '''\n        Trigger write actions.\n        eligibles is a dictionary of the lists of eligible records by triggers\n        '''\n        for trigger, records in eligibles.items():\n            trigger.queue_trigger_action(records)\n\n    @classmethod\n    def index_set_field(cls, name):\n        \"Returns the index sort order of the field set calls.\"\n        return 0\n\n    @classmethod\n    def delete(cls, records):\n        '''\n        Delete records.\n        '''\n        pool = Pool()\n        ModelAccess = pool.get('ir.model.access')\n        ModelData = pool.get('ir.model.data')\n\n        ModelAccess.check(cls.__name__, 'delete')\n        if not cls.check_xml_record(records, None):\n            raise AccessError(\n                gettext('ir.msg_delete_xml_record'),\n                gettext('ir.msg_base_config_record'))\n        if ModelData.has_model(cls.__name__):\n            with Transaction().set_context(_check_access=False):\n                data = []\n                for sub_records in grouped_slice(records):\n                    ids = [r.id for r in sub_records]\n                    data += ModelData.search([\n                            ('model', '=', cls.__name__),\n                            ('db_id', 'in', ids),\n                            ('noupdate', '=', True),\n                            ])\n                ModelData.write(data, {'db_id': None})\n\n        # Increase transaction counter\n        Transaction().counter += 1\n\n        # Clean local cache\n        for record in records:\n            record._local_cache.pop(record.id, None)\n\n        # Clean transaction cache\n        for cache in Transaction().cache.values():\n            if cls.__name__ in cache:\n                cache_cls = cache[cls.__name__]\n                for record in records:\n                    cache_cls.pop(record.id, None)\n\n        count = cls._count_cache.get(cls.__name__)\n        if count is not None:\n            if random.random() < 1 / _cache_count_clear:\n                cls._count_cache.set(cls.__name__, None)\n            else:\n                cls._count_cache.set(cls.__name__, count - len(records))\n\n    @classmethod\n    @without_check_access\n    def trigger_delete(cls, records):\n        '''\n        Trigger delete actions\n        '''\n        Trigger = Pool().get('ir.trigger')\n        triggers = Trigger.get_triggers(cls.__name__, 'delete')\n        if not triggers:\n            return\n        for trigger in triggers:\n            # Do not queue because records will be deleted\n            trigger.trigger_action(records)\n\n    @classmethod\n    def copy(cls, records, default=None):\n        '''\n        Duplicate the records and return a list of new records.\n        '''\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        if default is None:\n            default = {}\n        else:\n            default = default.copy()\n\n        def is_readonly(Model):\n            return (not issubclass(Model, ModelStorage)\n                or callable(getattr(Model, 'table_query', None)))\n\n        def get_default(name):\n            prefix = name + '.'\n            return {name[len(prefix):]: value\n                for name, value in default.items()\n                if name.startswith(prefix)}\n\n        def convert_data(field_defs, origin, default_values):\n            data = origin.copy()\n            for field_name in field_defs:\n                ftype = field_defs[field_name]['type']\n                field = cls._fields[field_name]\n\n                if field_name in (\n                        'create_date',\n                        'create_uid',\n                        'write_date',\n                        'write_uid',\n                        ):\n                    del data[field_name]\n                    continue\n\n                if field_name in default:\n                    if callable(default[field_name]):\n                        data[field_name] = default[field_name](origin)\n                    else:\n                        data[field_name] = default[field_name]\n                if data[field_name] == default_values.get(field_name):\n                    del data[field_name]\n                elif (isinstance(field, fields.Function)\n                        and not isinstance(field, fields.MultiValue)):\n                    del data[field_name]\n                elif ftype in ('many2one', 'one2one'):\n                    try:\n                        data[field_name] = data[field_name] and \\\n                            data[field_name][0]\n                    except Exception:\n                        pass\n                elif ftype in ('one2many',):\n                    if is_readonly(field.get_target()):\n                        del data[field_name]\n                    elif data[field_name]:\n                        data[field_name] = [(\n                                'copy', data[field_name],\n                                get_default(field_name))]\n                elif ftype == 'many2many':\n                    if is_readonly(pool.get(field.relation_name)):\n                        del data[field_name]\n                    elif data[field_name]:\n                        data[field_name] = [('add', data[field_name])]\n                elif ftype == 'binary':\n                    # Copy only file_id\n                    if field.file_id and origin.get(field.file_id):\n                        del data[field_name]\n            if 'id' in data:\n                del data['id']\n            return data\n\n        # Reset MPTT field to the default value\n        mptt = set()\n        for field in cls._fields.values():\n            if (isinstance(field, fields.Many2One)\n                    and field.model_name == cls.__name__\n                    and field.left and field.right):\n                mptt.add(field.left)\n                mptt.add(field.right)\n        fields_names = [n for n, f in cls._fields.items()\n            if (not isinstance(f, fields.Function)\n                or isinstance(f, fields.MultiValue))\n            and n not in mptt]\n        ids = list(map(int, records))\n        values = {d['id']: d for d in cls.read(ids, fields_names=fields_names)}\n        field_defs = cls.fields_get(fields_names=fields_names)\n        default_values = cls.default_get(fields_names, with_rec_name=False)\n        to_create = []\n        for id_ in ids:\n            data = convert_data(field_defs, values[id_], default_values)\n            to_create.append(data)\n        new_records = cls.create(to_create)\n\n        fields_translate = {}\n        for field_name, field in field_defs.items():\n            if (field_name in cls._fields\n                    and getattr(cls._fields[field_name], 'translate', False)):\n                fields_translate[field_name] = field\n\n        if fields_translate:\n            langs = Lang.search([\n                ('translatable', '=', True),\n                ])\n            if langs:\n                id2new_records = defaultdict(list)\n                for id_, new_record in zip(ids, new_records):\n                    id2new_records[id_].append(new_record)\n                fields_names = list(fields_translate.keys()) + ['id']\n                for lang in langs:\n                    # Prevent fuzzing translations when copying as the terms\n                    # should be the same.\n                    with Transaction().set_context(language=lang.code,\n                            fuzzy_translation=False):\n                        default_values = cls.default_get(\n                            fields_names, with_rec_name=False)\n                        values = cls.read(ids, fields_names=fields_names)\n                        to_write = []\n                        for data in values:\n                            to_write.append(id2new_records[data['id']])\n                            to_write.append(\n                                convert_data(\n                                    fields_translate, data, default_values))\n                        cls.write(*to_write)\n        return new_records\n\n    @classmethod\n    def search(cls, domain, offset=0, limit=None, order=None, count=False):\n        '''\n        Return a list of records that match the domain.\n        '''\n        pool = Pool()\n        transaction = Transaction()\n        ModelAccess = pool.get('ir.model.access')\n        ModelFieldAccess = pool.get('ir.model.field.access')\n\n        ModelAccess.check(cls.__name__, 'read')\n\n        def check_domain(domain, cls, to_check):\n            if is_leaf(domain):\n                local, relate = (domain[0].split('.', 1) + [None])[:2]\n                to_check[cls.__name__].add(local)\n                field = cls._fields[local]\n                target = None\n                if hasattr(field, 'get_target'):\n                    target = cls._fields[local].get_target()\n                    if (not relate\n                            and (domain[1].endswith('child_of')\n                                or domain[1].endswith('parent_of'))\n                            and len(domain) >= 4):\n                        relate = domain[3]\n                        domain = domain[:3] + domain[4:]\n                if field._type == 'reference' and len(domain) >= 4:\n                    target = pool.get(domain[3])\n                    domain = domain[:3] + domain[4:]\n                if relate and target:\n                    target_domain = [(relate,) + tuple(domain[1:])]\n                    check_domain(target_domain, target, to_check)\n            elif not domain:\n                return\n            else:\n                i = 1 if domain[0] in ['OR', 'AND'] else 0\n                for d in domain[i:]:\n                    check_domain(d, cls, to_check)\n\n        def check_order(order, cls, to_check):\n            if not order:\n                return\n            for oexpr, otype in order:\n                local, _, relate = oexpr.partition('.')\n                to_check[cls.__name__].add(local)\n                field = cls._fields[local]\n                if relate and hasattr(field, 'get_target'):\n                    target = field.get_target()\n                    target_order = [(relate, otype)]\n                    check_order(target_order, target, to_check)\n\n        if transaction.user and transaction.context.get('_check_access'):\n            to_check = defaultdict(set)\n            check_domain(domain, cls, to_check)\n            check_order(order, cls, to_check)\n            for name, fields_names in to_check.items():\n                ModelAccess.check(name, 'read')\n                ModelFieldAccess.check(name, fields_names, 'read')\n        if count:\n            return 0\n        return []\n\n    @classmethod\n    def search_count(cls, domain, offset=0, limit=None):\n        '''\n        Return the number of records that match the domain.\n        '''\n        res = cls.search(\n            domain, order=[], count=True, offset=offset, limit=limit)\n        if isinstance(res, list):\n            return len(res)\n        return res\n\n    @classmethod\n    def search_read(cls, domain, offset=0, limit=None, order=None,\n            fields_names=None):\n        '''\n        Call search and read functions at once.\n        Useful for the client to reduce the number of calls.\n        '''\n        records = cls.search(domain, offset=offset, limit=limit, order=order)\n\n        if fields_names is None:\n            fields_names = ['id']\n        if 'id' not in fields_names:\n            fields_names.append('id')\n        rows = cls.read(list(map(int, records)), fields_names)\n        index = {r.id: i for i, r in enumerate(records)}\n        rows.sort(key=lambda r: index[r['id']])\n        return rows\n\n    @classmethod\n    def _search_domain_active(cls, domain, active_test=True):\n        # reduce_domain return a new instance so we can safety modify domain\n        domain = reduce_domain(domain)\n        # if the object has a field named 'active', filter out all inactive\n        # records unless they were explicitely asked for\n        if not ('active' in cls._fields\n                and active_test\n                and Transaction().context.get('active_test', True)):\n            return domain\n\n        def process(domain):\n            i = 0\n            active_found = False\n            while i < len(domain):\n                arg = domain[i]\n                # add test for xmlrpc that doesn't handle tuple\n                if is_leaf(arg):\n                    if arg[0] == 'active':\n                        active_found = True\n                elif isinstance(arg, list):\n                    domain[i] = process(domain[i])\n                i += 1\n            if not active_found:\n                if (domain and ((isinstance(domain[0], str)\n                                and domain[0] == 'AND')\n                            or (not isinstance(domain[0], str)))):\n                    domain.append(('active', '=', True))\n                else:\n                    domain = ['AND', domain, ('active', '=', True)]\n            return domain\n        return process(domain)\n\n    @classmethod\n    def count(cls):\n        \"Returns the estimation of the number of records.\"\n        count = cls._count_cache.get(cls.__name__)\n        if count is None:\n            count = cls.search([], count=True)\n            cls._count_cache.set(cls.__name__, count)\n        return count\n\n    def resources(self):\n        pool = Pool()\n        Attachment = pool.get('ir.attachment')\n        Note = pool.get('ir.note')\n\n        return {\n            'attachment_count': Attachment.search_count([\n                    ('resource', '=', str(self)),\n                    ]),\n            'note_count': Note.search_count([\n                    ('resource', '=', str(self)),\n                    ]),\n            'note_unread': Note.search_count([\n                    ('resource', '=', str(self)),\n                    ('unread', '=', True),\n                    ]),\n            }\n\n    def get_rec_name(self, name):\n        '''\n        Return the rec_name of the instance.\n        It is used by the Function field rec_name.\n        '''\n        rec_name = self._rec_name\n        if rec_name not in self._fields:\n            rec_name = 'id'\n        return str(getattr(self, rec_name))\n\n    @classmethod\n    def search_rec_name(cls, name, clause):\n        '''\n        Return a list of arguments for search on rec_name.\n        '''\n        rec_name = cls._rec_name\n        if rec_name not in cls._fields:\n            return []\n        return [(rec_name,) + tuple(clause[1:])]\n\n    @classmethod\n    def search_global(cls, text):\n        '''\n        Yield tuples (record, name, icon) for text\n        '''\n        # TODO improve search clause\n        for record in cls.search([\n                    ('rec_name', 'ilike', '%%%s%%' % text),\n                    ]):\n            yield record, record.rec_name, None\n\n    @classmethod\n    def browse(cls, ids):\n        '''\n        Return a list of instance for the ids\n        '''\n        transaction = Transaction()\n        ids = list(map(int, ids))\n        _local_cache = local_cache(cls, transaction)\n        transaction_cache = transaction.get_cache()\n        return [cls(x, _ids=ids,\n                _local_cache=_local_cache,\n                _transaction_cache=transaction_cache,\n                _transaction=transaction) for x in ids]\n\n    @staticmethod\n    def __export_row(record, fields_names):\n        pool = Pool()\n        lines = []\n        data = ['' for x in range(len(fields_names))]\n        done = []\n        for fpos in range(len(fields_names)):\n            fields_tree = fields_names[fpos]\n            if not fields_tree:\n                continue\n            value = record\n            i = 0\n            while i < len(fields_tree):\n                if not isinstance(value, ModelStorage):\n                    break\n                field_name = fields_tree[i]\n                descriptor = None\n                if '.' in field_name:\n                    field_name, descriptor = field_name.split('.')\n                eModel = pool.get(value.__name__)\n                field = eModel._fields[field_name]\n                if field.states and 'invisible' in field.states:\n                    invisible = _record_eval_pyson(\n                        value, field.states['invisible'])\n                    if invisible:\n                        value = ''\n                        break\n                if descriptor:\n                    value = getattr(field, descriptor)().__get__(value, eModel)\n                else:\n                    value = getattr(value, field_name)\n                if isinstance(value, (list, tuple)):\n                    first = True\n                    child_fields_names = [(x[:i + 1] == fields_tree[:i + 1]\n                            and x[i + 1:]) or [] for x in fields_names]\n                    if child_fields_names in done:\n                        break\n                    done.append(child_fields_names)\n                    for child_record in value:\n                        child_lines = ModelStorage.__export_row(child_record,\n                                child_fields_names)\n                        if first:\n                            for child_fpos in range(len(fields_names)):\n                                if child_lines and child_lines[0][child_fpos]:\n                                    data[child_fpos] = \\\n                                        child_lines[0][child_fpos]\n                            lines += child_lines[1:]\n                            first = False\n                        else:\n                            lines += child_lines\n                    break\n                i += 1\n            if i == len(fields_tree):\n                if value is None:\n                    value = ''\n                elif isinstance(value, Model):\n                    value = str(value)\n                data[fpos] = value\n        return [data] + lines\n\n    @classmethod\n    def _convert_field_names(cls, fields_names):\n        pool = Pool()\n        ModelField = pool.get('ir.model.field')\n        result = []\n        for names in fields_names:\n            descriptions = []\n            class_ = cls\n            for i, name in enumerate(names):\n                translated = name.endswith('.translated')\n                if translated:\n                    name = name[:-len('.translated')]\n                field = class_._fields[name]\n                field_name = ModelField.get_name(class_.__name__, name)\n                if translated:\n                    if isinstance(field, fields.Selection):\n                        field_name = gettext(\n                            'ir.msg_field_string', field=field_name)\n                    elif isinstance(field, fields.Reference):\n                        field_name = gettext(\n                            'ir.msg_field_model_name', field=field_name)\n                descriptions.append(field_name)\n                if hasattr(field, 'get_target'):\n                    class_ = field.get_target()\n            result.append('/'.join(descriptions))\n        return result\n\n    @classmethod\n    def export_data(cls, records, fields_names, header=False):\n        fields_names = [x.split('/') for x in fields_names]\n        data = []\n        if header:\n            data.append(cls._convert_field_names(fields_names))\n        for record in records:\n            data += cls.__export_row(record, fields_names)\n        return data\n\n    @classmethod\n    def export_data_domain(\n            cls, domain, fields_names, offset=0, limit=None, order=None,\n            header=False):\n        records = cls.search(domain, limit=limit, offset=offset, order=order)\n        return cls.export_data(records, fields_names, header=header)\n\n    @classmethod\n    def import_data(cls, fields_names, data):\n        '''\n        Create records for all values in data.\n        The field names of values must be defined in fields_names.\n        '''\n        pool = Pool()\n\n        @lru_cache(maxsize=1000)\n        def get_many2one(relation, value, column):\n            if not value:\n                return None\n            Relation = pool.get(relation)\n            res = Relation.search([\n                ('rec_name', '=', value),\n                ], limit=2)\n            if len(res) < 1:\n                raise ImportDataError(gettext(\n                        'ir.msg_relation_not_found',\n                        value=value,\n                        column=column,\n                        **Relation.__names__()))\n            elif len(res) > 1:\n                raise ImportDataError(\n                    gettext('ir.msg_too_many_relations_found',\n                        value=value,\n                        column=column,\n                        **Relation.__names__()))\n            else:\n                res = res[0].id\n            return res\n\n        @lru_cache(maxsize=1000)\n        def get_many2many(relation, value, column):\n            if not value:\n                return None\n            res = []\n            Relation = pool.get(relation)\n            for word in next(csv.reader(value.splitlines(), delimiter=',',\n                    quoting=csv.QUOTE_NONE, escapechar='\\\\')):\n                res2 = Relation.search([\n                    ('rec_name', '=', word),\n                    ], limit=2)\n                if len(res2) < 1:\n                    raise ImportDataError(\n                        gettext('ir.msg_relation_not_found',\n                            value=word,\n                            column=column,\n                            **Relation.__names__()))\n                elif len(res2) > 1:\n                    raise ImportDataError(\n                        gettext('ir.msg_too_many_relations_found',\n                            value=word,\n                            column=column,\n                            **Relation.__names__()))\n                else:\n                    res.extend(res2)\n            if len(res):\n                res = [('add', [x.id for x in res])]\n            return res\n\n        def get_one2one(relation, value, column):\n            return ('add', get_many2one(relation, value, column))\n\n        @lru_cache(maxsize=1000)\n        def get_reference(value, field, klass, column):\n            if not value:\n                return None\n            try:\n                relation, value = value.split(',', 1)\n                Relation = pool.get(relation)\n            except (ValueError, KeyError) as e:\n                raise ImportDataError(\n                    gettext('ir.msg_reference_syntax_error',\n                        value=value,\n                        column=column,\n                        **klass.__names__(field))) from e\n            res = Relation.search([\n                ('rec_name', '=', value),\n                ], limit=2)\n            if len(res) < 1:\n                raise ImportDataError(gettext(\n                        'ir.msg_relation_not_found',\n                        value=value,\n                        column=column,\n                        **Relation.__names__()))\n            elif len(res) > 1:\n                raise ImportDataError(\n                    gettext('ir.msg_too_many_relations_found',\n                        value=value,\n                        column=column,\n                        **Relation.__names__()))\n            else:\n                res = '%s,%s' % (relation, res[0].id)\n            return res\n\n        @lru_cache(maxsize=1000)\n        def get_by_id(value, ftype, field, klass, column):\n            if not value:\n                return None\n            relation = None\n            if ftype == 'many2many':\n                value = next(csv.reader(value.splitlines(), delimiter=',',\n                        quoting=csv.QUOTE_NONE, escapechar='\\\\'))\n            elif ftype == 'reference':\n                try:\n                    relation, value = value.split(',', 1)\n                except ValueError as e:\n                    raise ImportDataError(\n                        gettext('ir.msg_reference_syntax_error',\n                            value=value,\n                            column=column,\n                            **klass.__names__(field))) from e\n                value = [value]\n            else:\n                value = [value]\n            res_ids = []\n            for word in value:\n                try:\n                    module, xml_id = word.rsplit('.', 1)\n                    db_id = ModelData.get_id(module, xml_id)\n                except (ValueError, KeyError) as e:\n                    raise ImportDataError(\n                        gettext('ir.msg_xml_id_syntax_error',\n                            value=word,\n                            column=column,\n                            **klass.__names__(field))) from e\n                res_ids.append(db_id)\n            if ftype == 'many2many' and res_ids:\n                return [('add', res_ids)]\n            elif ftype == 'reference' and res_ids:\n                return '%s,%s' % (relation, str(res_ids[0]))\n            return res_ids and res_ids[0] or False\n\n        def dispatch(create, write, row, Relation=cls):\n            id_ = row.pop('id', None)\n            if id_:\n                write.append([Relation(id_)])\n                write.append(row)\n            else:\n                create.append(row)\n            return id_\n\n        def convert(value, ftype, field, klass, column):\n            def convert_boolean(value):\n                if value.lower() == 'true':\n                    return True\n                elif value.lower() == 'false':\n                    return False\n                elif not value:\n                    return False\n                else:\n                    return bool(int(value))\n\n            def convert_integer(value):\n                if isinstance(value, int):\n                    return value\n                elif value:\n                    return int(value)\n\n            def convert_float(value):\n                if isinstance(value, float):\n                    return value\n                elif value:\n                    return float(value)\n\n            def convert_numeric(value):\n                if isinstance(value, Decimal):\n                    return value\n                elif value:\n                    return Decimal(value)\n\n            def convert_date(value):\n                if isinstance(value, datetime.date):\n                    return value\n                elif value:\n                    return datetime.datetime.strptime(value, '%Y-%m-%d').date()\n\n            def convert_datetime(value):\n                if isinstance(value, datetime.datetime):\n                    return value\n                elif value:\n                    return datetime.datetime.strptime(\n                        value, '%Y-%m-%d %H:%M:%S')\n\n            def convert_timedelta(value):\n                if isinstance(value, datetime.timedelta):\n                    return value\n                elif value:\n                    try:\n                        return float(value)\n                    except ValueError:\n                        hours, minutes, seconds = (\n                            value.split(':') + ['00'])[:3]\n                        return datetime.timedelta(\n                            hours=int(hours), minutes=int(minutes),\n                            seconds=float(seconds))\n\n            def convert_binary(value):\n                if not isinstance(value, bytes):\n                    return base64.b64decode(value)\n                elif value:\n                    return value\n\n            try:\n                return locals()['convert_%s' % ftype](value)\n            except KeyError:\n                return value\n            except (ValueError, TypeError, decimal.InvalidOperation) as e:\n                raise ImportDataError(\n                    gettext('ir.msg_value_syntax_error',\n                        value=value,\n                        column=column,\n                        **klass.__names__(field))) from e\n\n        def process_lines(data, prefix, fields_def, position=0, klass=cls):\n            line = data[position]\n            row = {}\n            translate = {}\n            todo = set()\n            prefix_len = len(prefix)\n            # Import normal fields_names\n            for i, field in enumerate(fields_names):\n                if i >= len(line):\n                    raise Exception('ImportError',\n                        'Please check that all your lines have %d cols.'\n                        % len(fields_names))\n                is_prefix_len = (len(field) == (prefix_len + 1))\n                value = line[i]\n                column = '/'.join(field)\n                if is_prefix_len and field[-1].endswith(':id'):\n                    field_name = field[-1][:-3]\n                    ftype = fields_def[field_name]['type']\n                    row[field[0][:-3]] = get_by_id(\n                        value, ftype, field_name, klass, column)\n                elif is_prefix_len and ':lang=' in field[-1]:\n                    field_name, lang = field[-1].split(':lang=')\n                    translate.setdefault(lang, {})[field_name] = value or False\n                elif is_prefix_len and prefix == field[:-1]:\n                    field_name = field[-1]\n                    this_field_def = fields_def[field_name]\n                    field_type = this_field_def['type']\n                    res = None\n                    if field_name == 'id':\n                        try:\n                            res = int(value)\n                        except ValueError:\n                            res = get_many2one(klass.__name__, value, column)\n                    elif field_type == 'many2one':\n                        res = get_many2one(\n                            this_field_def['relation'], value, column)\n                    elif field_type == 'many2many':\n                        res = get_many2many(\n                            this_field_def['relation'], value, column)\n                    elif field_type == 'one2one':\n                        res = get_one2one(\n                            this_field_def['relation'], value, column)\n                    elif field_type == 'reference':\n                        res = get_reference(value, field_name, klass, column)\n                    else:\n                        res = convert(\n                            value, field_type, field_name, klass, column)\n                    row[field[-1]] = res\n                elif prefix == field[0:prefix_len]:\n                    todo.add(field[prefix_len])\n            # Import one2many fields\n            nbrmax = 1\n            for field in todo:\n                Relation = pool.get(fields_def[field]['relation'])\n                newfd = Relation.fields_get()\n                newrow, max2, _ = process_lines(\n                    data, prefix + [field], newfd, position, klass=Relation)\n                nbrmax = max(nbrmax, max2)\n                create, write = [], []\n                dispatch(create, write, newrow, Relation)\n                i = max2\n                while (position + i) < len(data):\n                    test = True\n                    for j, field2 in enumerate(fields_names):\n                        if (len(field2) <= (prefix_len + 1)\n                                and data[position + i][j]):\n                            test = False\n                            break\n                    if not test:\n                        break\n                    newrow, max2, _ = process_lines(\n                        data, prefix + [field], newfd, position + i,\n                        klass=Relation)\n                    dispatch(create, write, newrow, Relation)\n                    i += max2\n                    nbrmax = max(nbrmax, i)\n                row[field] = []\n                create = [v for v in create if any(v.values())]\n                if create:\n                    row[field].append(('create', create))\n                if write:\n                    row[field].append(('write',) + tuple(write))\n            if prefix_len == 0:\n                for i in range(max(nbrmax, 1)):\n                    data.pop(0)\n            return (row, nbrmax, translate)\n\n        ModelData = pool.get('ir.model.data')\n\n        len_fields_names = len(fields_names)\n        assert all(len(x) == len_fields_names for x in data)\n        fields_names = [x.split('/') for x in fields_names]\n        fields_def = cls.fields_get()\n\n        to_create, to_create_translations = [], []\n        to_write, to_write_translations = [], []\n        languages = set()\n        while len(data):\n            (row, _, translate) = \\\n                process_lines(data, [], fields_def)\n            if dispatch(to_create, to_write, row):\n                to_write_translations.append(translate)\n            else:\n                to_create_translations.append(translate)\n            languages.update(translate)\n\n        def translate(records, translations):\n            for language in languages:\n                translated = [t.get(language, {}) for t in translations]\n                with Transaction().set_context(language=language):\n                    cls.write(*chain(*filter(itemgetter(1),\n                                zip(([r] for r in records), translated))))\n        count = 0\n        if to_create:\n            records = cls.create(to_create)\n            translate(records, to_create_translations)\n            count += len(records)\n        if to_write:\n            cls.write(*to_write)\n            records = sum(to_write[0:None:2], [])\n            translate(records, to_write_translations)\n            count += len(records)\n        return count\n\n    @classmethod\n    def check_xml_record(cls, records, values):\n        \"\"\"\n        Check if a list of records and their corresponding fields are\n        originating from xml data. This is used by write and delete\n        functions: if the return value is True the records can be\n        written/deleted, False otherwise. The default behaviour is to\n        forbid any modification on records/fields originating from\n        xml. Values is the dictionary of written values. If values is\n        equal to None, no field by field check is performed, False is\n        returned as soon as one of the record comes from the xml.\n        \"\"\"\n        ModelData = Pool().get('ir.model.data')\n        # Allow root user to update/delete\n        if (Transaction().user == 0\n                or not ModelData.has_model(cls.__name__)):\n            return True\n        with Transaction().set_context(_check_access=False):\n            models_data = ModelData.search([\n                ('model', '=', cls.__name__),\n                ('db_id', 'in', list(map(int, records))),\n                ])\n            if not models_data:\n                return True\n            for model_data in models_data:\n                if values is None:\n                    if not model_data.noupdate:\n                        return False\n                else:\n                    if not model_data.values or model_data.noupdate:\n                        continue\n                    xml_values = ModelData.load_values(model_data.values)\n                    for key, val in values.items():\n                        if key in xml_values and val != xml_values[key]:\n                            return False\n        return True\n\n    @classmethod\n    def validate(cls, records):\n        pass\n\n    @classmethod\n    def validate_fields(cls, records, field_names):\n        pass\n\n    @classmethod\n    @without_check_access\n    def _validate(cls, records, field_names=None):\n        pool = Pool()\n        # Ensure only records to validate are read,\n        # also convert iterator to list\n        records = cls.browse(records)\n\n        def is_pyson(test):\n            if isinstance(test, PYSON):\n                return True\n            if isinstance(test, (list, tuple)):\n                for i in test:\n                    if isinstance(i, PYSON):\n                        return True\n                    if isinstance(i, (list, tuple)):\n                        if is_pyson(i):\n                            return True\n            if isinstance(test, dict):\n                for key, value in list(test.items()):\n                    if isinstance(value, PYSON):\n                        return True\n                    if isinstance(value, (list, tuple, dict)):\n                        if is_pyson(value):\n                            return True\n            return False\n\n        def validate_domain(field):\n            if not field.domain:\n                return\n            if field._type == 'dict':\n                return\n\n            def get_relation(record):\n                if field._type in ('many2one', 'one2many'):\n                    Relation = pool.get(field.model_name)\n                elif field._type in ('many2many', 'one2one'):\n                    Relation = field.get_target()\n                elif field._type == 'reference':\n                    value = getattr(record, field.name)\n                    Relation = value.__class__ if value else None\n                else:\n                    Relation = cls\n                return Relation\n\n            domains = defaultdict(lambda: defaultdict(list))\n            if is_pyson(field.domain) or is_pyson(field.context):\n                encoder = PYSONEncoder()\n                pyson_domain = encoder.encode(field.domain)\n                pyson_context = encoder.encode(field.context)\n                dict_domain = False\n                for record in records:\n                    domain = _record_eval_pyson(\n                        record, pyson_domain, encoded=True)\n                    if isinstance(domain, dict):\n                        dict_domain = True\n                        relation = get_relation(record)\n                        if relation:\n                            domain = domain.get(relation.__name__, [])\n                        else:\n                            domain = []\n                    domain = freeze(domain)\n                    context = freeze(_record_eval_pyson(\n                            record, pyson_context, encoded=True))\n                    domains[context][domain].append(record)\n                # Select strategy depending if it is closer to one domain per\n                # record or one domain for all records\n                # Do not use IN_MAX to let spaces for the pyson domain\n                in_max = Transaction().database.IN_MAX\n                count = in_max // 10\n                for context, ctx_domains in domains.items():\n                    if (not dict_domain\n                            and len(ctx_domains) > len(records) * 0.5):\n                        new_domains = {}\n                        for sub_domains in grouped_slice(\n                                list(ctx_domains.keys()), count):\n                            grouped_domain = ['OR']\n                            grouped_records = []\n                            for d in sub_domains:\n                                sub_records = ctx_domains[d]\n                                grouped_records.extend(sub_records)\n                                relations = relation_domain(field, sub_records)\n                                if len(relations) > in_max:\n                                    break\n                                grouped_domain.append(\n                                    [('id', 'in',\n                                            [r.id for r in relations]), d])\n                            else:\n                                new_domains[freeze(grouped_domain)] = \\\n                                    grouped_records\n                                continue\n                            break\n                        else:\n                            domains[context] = new_domains\n            else:\n                domains[freeze(field.context)][freeze(field.domain)].extend(\n                    records)\n\n            for context, ctx_domains in domains.items():\n                for domain, ctx_records in ctx_domains.items():\n                    domain = unfreeze(domain)\n                    for Relation, sub_records in groupby(\n                            ctx_records, key=get_relation):\n                        if not Relation:\n                            continue\n                        if isinstance(domain, dict):\n                            sub_domain = domain.get(Relation.__name__)\n                            if not sub_domain:\n                                continue\n                        else:\n                            sub_domain = domain\n                        with Transaction().set_context(unfreeze(context)):\n                            validate_relation_domain(\n                                field, list(sub_records), Relation, sub_domain)\n\n        def relation_domain(field, records):\n            relations = set()\n            if field._type in {'many2one', 'one2one', 'reference'}:\n                relations.update(getattr(r, field.name) for r in records)\n            elif field._type in {'one2many', 'many2many'}:\n                relations.update(*(getattr(r, field.name) for r in records))\n            else:\n                # Cache alignment is not a problem\n                relations = set(records)\n            relations.discard(None)\n            return relations\n\n        def validate_relation_domain(field, records, Relation, domain):\n            relations = relation_domain(field, records)\n            if relations:\n                for sub_relations in grouped_slice(relations):\n                    sub_relations = set(sub_relations)\n                    # Use root user to skip access rules\n                    with Transaction().set_user(0):\n                        finds = Relation.search(['AND',\n                                [('id', 'in', [r.id for r in sub_relations])],\n                                domain,\n                                ])\n                    invalid_records = sub_relations - set(finds)\n                    if invalid_records:\n                        invalid_record = invalid_records.pop()\n                        domain = field.domain\n                        if is_pyson(domain):\n                            domain = _record_eval_pyson(records[0], domain)\n                        if isinstance(domain, dict):\n                            domain = domain.get(Relation.__class__, [])\n                        msg = gettext(\n                            'ir.msg_domain_validation_record',\n                            **cls.__names__(field.name, invalid_record))\n                        fields = set()\n                        level = 0\n                        if field not in Relation._fields.values():\n                            expression = domain_parse(domain)\n                            for variable in expression.variables:\n                                parts = variable.split('.')\n                                fields.add(parts[0])\n                                level = max(level, len(parts))\n                        else:\n                            fields.add(field.name)\n                        for field_name in sorted(fields):\n                            env = EvalEnvironment(invalid_record, Relation)\n                            invalid_domain = domain_inversion(\n                                domain, field_name, env)\n                            if isinstance(invalid_domain, bool):\n                                continue\n                            if (len(fields) > 1  # no need to evaluate\n                                    and eval_domain(invalid_domain, env)):\n                                continue\n                            field_def = Relation.fields_get(\n                                [field_name], level=level)\n                            raise DomainValidationError(\n                                msg, domain=(invalid_domain, field_def))\n                        field_def = Relation.fields_get(fields, level=level)\n                        raise DomainValidationError(\n                            msg, domain=(domain, field_def))\n\n        if field_names is None:\n            field_names = cls._fields.keys()\n        elif not isinstance(field_names, set):\n            field_names = set(field_names)\n        function_fields = {name for name, field in cls._fields.items()\n            if isinstance(field, fields.Function)}\n        with Transaction().set_context(active_test=False):\n            for field_name, field in cls._fields.items():\n                if (field_name not in field_names\n                        and not (field.validation_depends & field_names)\n                        and not (field.validation_depends & function_fields)):\n                    continue\n                if isinstance(field, fields.Function):\n                    continue\n\n                validate_domain(field)\n\n                def required_test(record, field):\n                    value = getattr(record, field.name)\n                    if ((\n                                isinstance(value,\n                                    (type(None), bool, list, tuple, str, dict))\n                                and not value)\n                            or (field._type == 'reference'\n                                and not isinstance(value, ModelStorage))):\n                        raise RequiredValidationError(\n                            gettext('ir.msg_required_validation_record',\n                                **cls.__names__(field_name, record)))\n                # validate states required\n                if field.states and 'required' in field.states:\n                    if is_pyson(field.states['required']):\n                        pyson_required = PYSONEncoder().encode(\n                                field.states['required'])\n                        for record in records:\n                            required = _record_eval_pyson(\n                                record, pyson_required, encoded=True)\n                            if required:\n                                required_test(record, field)\n                    else:\n                        if field.states['required']:\n                            for record in records:\n                                required_test(record, field)\n                # validate required\n                if field.required:\n                    for record in records:\n                        required_test(record, field)\n                # validate size\n                if hasattr(field, 'size') and field.size is not None:\n                    for record in records:\n                        if isinstance(field.size, PYSON):\n                            field_size = _record_eval_pyson(record, field.size)\n                        else:\n                            field_size = field.size\n                        size = len(getattr(record, field_name) or '')\n                        if field_size is not None and (size > field_size >= 0):\n                            error_args = cls.__names__(field_name, record)\n                            error_args['size'] = size\n                            error_args['max_size'] = field_size\n                            raise SizeValidationError(\n                                gettext('ir.msg_size_validation_record',\n                                    **error_args))\n\n                def digits_test(record, digits, field_name):\n                    def raise_error(value):\n                        error_args = cls.__names__(field_name, record)\n                        error_args['digits'] = digits[1]\n                        raise DigitsValidationError(\n                            gettext('ir.msg_digits_validation_record',\n                                **error_args))\n\n                    value = getattr(record, field_name)\n                    if isinstance(digits, str):\n                        digit_record = getattr(record, digits)\n                        if digit_record:\n                            digits = digit_record.get_digits()\n                        else:\n                            digits = None\n                    if (value is None\n                            or not digits\n                            or any(d is None for d in digits)):\n                        return\n                    if isinstance(value, Decimal):\n                        exp = Decimal('.'.join(['0', '0' * digits[1]]))\n                        if value.quantize(exp) != value:\n                            raise_error(value)\n                    else:\n                        if not (round(value, digits[1]) == float(value)):\n                            raise_error(value)\n                # validate digits\n                if getattr(field, 'digits', None):\n                    if is_pyson(field.digits):\n                        pyson_digits = PYSONEncoder().encode(field.digits)\n                        for record in records:\n                            digits = _record_eval_pyson(\n                                record, pyson_digits, encoded=True)\n                            digits_test(record, digits, field_name)\n                    else:\n                        for record in records:\n                            digits_test(record, field.digits, field_name)\n\n                if hasattr(field, 'forbidden_chars'):\n                    for record in records:\n                        value = getattr(record, field_name)\n                        if value and any(\n                                c in value for c in field.forbidden_chars):\n                            error_args = cls.__names__(field_name, record)\n                            error_args['chars'] = ','.join(\n                                repr(c) for c in field.forbidden_chars\n                                if c in value)\n                            raise ForbiddenCharValidationError(gettext(\n                                    'ir.msg_forbidden_char_validation_record',\n                                    **error_args))\n\n                # validate selection\n                if hasattr(field, 'selection') and field.selection:\n                    if isinstance(field.selection, (tuple, list)):\n                        test = set(dict(field.selection).keys())\n                        instance_sel_func = False\n                    else:\n                        sel_func = getattr(cls, field.selection)\n                        instance_sel_func = is_instance_method(\n                            cls, field.selection)\n                        if not instance_sel_func:\n                            test = set(dict(sel_func()))\n\n                    for record in records:\n                        value = getattr(record, field_name)\n                        if field._type == 'reference':\n                            if isinstance(value, ModelStorage):\n                                value = value.__class__.__name__\n                            elif value:\n                                value, _ = value.split(',')\n                        if instance_sel_func:\n                            test = set(dict(sel_func(record)))\n                        # None and '' are equivalent\n                        if '' in test or None in test:\n                            test.add('')\n                            test.add(None)\n                        if field._type != 'multiselection':\n                            values = [value]\n                        else:\n                            values = value or []\n                        for value in values:\n                            if value not in test:\n                                error_args = cls.__names__(field_name, record)\n                                error_args['value'] = value\n                                raise SelectionValidationError(gettext(\n                                        'ir.msg_selection_validation_record',\n                                        **error_args))\n\n                def format_test(record, format, field_name):\n                    value = getattr(record, field_name)\n                    if not value:\n                        return\n                    if not isinstance(value, datetime.time):\n                        value = value.time()\n                    if value != datetime.datetime.strptime(\n                            value.strftime(format), format).time():\n                        error_args = cls.__names__(field_name, record)\n                        raise TimeFormatValidationError(\n                            gettext('ir.msg_time_format_validation_record',\n                                **error_args))\n\n                # validate time format\n                if (field._type in ('datetime', 'time')\n                        and field_name not in ('create_date', 'write_date')):\n                    if is_pyson(field.format):\n                        pyson_format = PYSONDecoder().encode(field.format)\n                        for record in records:\n                            env = EvalEnvironment(record, cls)\n                            env.update(Transaction().context)\n                            env['current_date'] = datetime.datetime.today()\n                            env['time'] = time\n                            env['context'] = Transaction().context\n                            env['active_id'] = record.id\n                            format = PYSONDecoder(env).decode(pyson_format)\n                            format_test(record, format, field_name)\n                    else:\n                        for record in records:\n                            format_test(record, field.format, field_name)\n\n        for record in records:\n            record.pre_validate()\n\n        cls.validate(records)\n        cls.validate_fields(records, field_names)\n\n    @classmethod\n    def _clean_defaults(cls, defaults):\n        pool = Pool()\n        vals = {}\n        for field in defaults.keys():\n            if '.' in field:  # skip all related fields\n                continue\n            fld_def = cls._fields[field]\n            if fld_def._type in ('many2one', 'one2one'):\n                if isinstance(defaults[field], (list, tuple)):\n                    vals[field] = defaults[field][0]\n                else:\n                    vals[field] = defaults[field]\n            elif fld_def._type in ('one2many',):\n                obj = pool.get(fld_def.model_name)\n                vals[field] = []\n                for defaults2 in defaults[field]:\n                    vals2 = obj._clean_defaults(defaults2)\n                    vals[field].append(('create', [vals2]))\n            elif fld_def._type in ('many2many',):\n                vals[field] = [('add', defaults[field])]\n            elif fld_def._type in ('boolean',):\n                vals[field] = bool(defaults[field])\n            else:\n                vals[field] = defaults[field]\n        return vals\n\n    def __init__(self, id=None, **kwargs):\n        _ids = kwargs.pop('_ids', None)\n        _local_cache = kwargs.pop('_local_cache', None)\n        _transaction_cache = kwargs.pop('_transaction_cache', None)\n        transaction = kwargs.pop('_transaction', None)\n        if transaction is None:\n            transaction = Transaction()\n        self._transaction = transaction\n        self._user = transaction.user\n        self._context = transaction.context\n        if id is not None:\n            id = int(id)\n        if _ids is not None:\n            self._ids = _ids\n            assert id in _ids\n        else:\n            self._ids = [id]\n\n        if _transaction_cache is not None:\n            self._transaction_cache = _transaction_cache\n        else:\n            self._transaction_cache = transaction.get_cache()\n\n        if _local_cache is not None:\n            assert isinstance(_local_cache, LRUDictTransaction)\n            self._local_cache = _local_cache\n        else:\n            self._local_cache = local_cache(self.__class__, transaction)\n\n        super(ModelStorage, self).__init__(id, **kwargs)\n\n    @property\n    def _cache(self):\n        return self._transaction_cache[self.__name__]\n\n    def __getattr__(self, name):\n        try:\n            return super(ModelStorage, self).__getattr__(name)\n        except AttributeError:\n            if name.startswith('_') or self.id is None or self.id < 0:\n                raise\n\n        self._local_cache.refresh()\n\n        try:\n            return self._local_cache[self.id][name]\n        except KeyError:\n            pass\n\n        # fetch the definition of the field\n        try:\n            field = self._fields[name]\n        except KeyError:\n            raise AttributeError('\"%s\" has no attribute \"%s\"' % (self, name))\n\n        try:\n            if field._type not in (\n                    'many2one', 'reference',\n                    'one2many', 'many2many', 'one2one',\n                    ):\n                # fill local cache for quicker access later\n                value \\\n                        = self._local_cache[self.id][name] \\\n                        = self._cache[self.id][name]\n                return value\n            else:\n                skip_eager = (\n                    name in self._cache[self.id]\n                    and not field.context\n                    and (not getattr(field, 'datetime_field', None)\n                        or field.datetime_field in self._cache[self.id]))\n        except KeyError:\n            skip_eager = False\n\n        # build the list of fields we will fetch\n        ffields = {\n            name: field,\n            }\n        load_eager = field.loading == 'eager' and not skip_eager\n        multiple_getter = None\n        if (field.loading == 'lazy'\n                and isinstance(field, fields.Function)\n                and field.getter_multiple(\n                    getattr(self.__class__, field.getter))):\n            multiple_getter = field.getter\n\n        if load_eager or multiple_getter:\n            FieldAccess = Pool().get('ir.model.field.access')\n            fread_accesses = {}\n            fread_accesses.update(FieldAccess.check(self.__name__,\n                list(self._fields.keys()), 'read', access=True))\n            to_remove = set(x for x, y in fread_accesses.items()\n                    if not y and x != name)\n\n            def not_cached(item):\n                fname, field = item\n                return ((self.id not in self._cache\n                        or fname not in self._cache[self.id])\n                    and (self.id not in self._local_cache\n                        or fname not in self._local_cache[self.id]))\n\n            def to_load(item):\n                fname, field = item\n                if fname in to_remove:\n                    return False\n                if multiple_getter:\n                    return getattr(field, 'getter', None) == multiple_getter\n                return field.loading == 'eager'\n\n            ifields = filter(to_load,\n                filter(not_cached,\n                    iter(self._fields.items())))\n            ifields = islice(ifields, 0, _cache_field)\n            ffields.update(ifields)\n\n        # add datetime_field\n        for field in list(ffields.values()):\n            if hasattr(field, 'datetime_field') and field.datetime_field:\n                if field.datetime_field not in ffields:\n                    datetime_field = self._fields[field.datetime_field]\n                    ffields[field.datetime_field] = datetime_field\n\n        # add depends of field with context\n        for field in list(ffields.values()):\n            if field.context:\n                eval_fields = fields.get_eval_fields(field.context)\n                for context_field_name in eval_fields:\n                    if context_field_name not in field.validation_depends:\n                        continue\n                    if context_field_name not in ffields:\n                        context_field = self._fields.get(context_field_name)\n                        ffields[context_field_name] = context_field\n\n        delete_records = self._transaction.delete_records.get(\n            self.__name__, set())\n\n        def cached(id_):\n            names = set()\n            if id_ in self._cache:\n                names.update(self._cache[id_]._keys())\n            if id_ in self._local_cache:\n                names.update(self._local_cache[id_]._keys())\n            return names\n\n        def filter_(id_):\n            return (id_ == self.id  # Ensure the value is read\n                or (id_ not in delete_records\n                    and not ffields.keys() <= cached(id_)))\n\n        def unique(ids):\n            s = set()\n            for id_ in ids:\n                if id_ not in s:\n                    s.add(id_)\n                    yield id_\n        read_size = max(1, min(\n                self._cache.size_limit, self._local_cache.size_limit,\n                self._transaction.database.IN_MAX))\n        index = self._ids.index(self.id)\n        ids = chain(islice(self._ids, index, None),\n            islice(self._ids, 0, max(index - 1, 0)))\n        ids = islice(unique(filter(filter_, ids)), read_size)\n\n        def instantiate(field, value, data):\n            if field._type in ('many2one', 'one2one', 'reference'):\n                if value is None or value is False:\n                    return None\n            elif field._type in ('one2many', 'many2many'):\n                if not value:\n                    return ()\n            try:\n                if field._type == 'reference':\n                    model_name, record_id = value.split(',')\n                    Model = Pool().get(model_name)\n                    try:\n                        record_id = int(record_id)\n                    except ValueError:\n                        return value\n                    if record_id < 0:\n                        return value\n                    value = record_id\n                else:\n                    Model = field.get_target()\n            except KeyError:\n                return value\n            transaction = Transaction()\n            ctx = {}\n            if field.context:\n                pyson_context = PYSONEncoder().encode(field.context)\n                ctx.update(PYSONDecoder(data).decode(pyson_context))\n            datetime_ = None\n            if getattr(field, 'datetime_field', None):\n                datetime_ = data.get(field.datetime_field)\n                ctx = {'_datetime': datetime_}\n            with transaction.set_context(**ctx):\n                kwargs = {}\n                key = (Model, freeze(ctx))\n                if key not in model2cache:\n                    model2cache[key] = local_cache(Model, transaction)\n                kwargs['_local_cache'] = model2cache[key]\n                kwargs['_ids'] = ids = model2ids.setdefault(key, [])\n                kwargs['_transaction_cache'] = transaction.get_cache()\n                kwargs['_transaction'] = transaction\n                if field._type in ('many2one', 'one2one', 'reference'):\n                    value = int(value)\n                    ids.append(value)\n                    return Model(value, **kwargs)\n                elif field._type in ('one2many', 'many2many'):\n                    ids.extend(int(x) for x in value)\n                    return tuple(Model(id, **kwargs) for id in value)\n\n        model2ids = {}\n        model2cache = {}\n        # Read the data\n        with Transaction().set_current_transaction(self._transaction), \\\n                self._transaction.set_user(self._user), \\\n                self._transaction.reset_context(), \\\n                self._transaction.set_context(\n                    self._context, _check_access=False) as transaction:\n            if (self.id in self._cache and name in self._cache[self.id]\n                    and ffields.keys() <= set(self._cache[self.id]._keys())):\n                # Use values from cache\n                read_data = []\n                for id_ in islice(chain(islice(self._ids, index, None),\n                            islice(self._ids, 0, max(index - 1, 0))),\n                        read_size):\n                    if id_ in self._cache:\n                        data = {'id': id_}\n                        for fname in ffields:\n                            if fname not in self._cache[id_]:\n                                break\n                            data[fname] = self._cache[id_][fname]\n                        else:\n                            read_data.append(data)\n            else:\n                # Order data read to update cache in the same order\n                index = {i: n for n, i in enumerate(ids)}\n                read_data = self.read(list(index.keys()), list(ffields.keys()))\n                read_data.sort(key=lambda r: index[r['id']])\n            # create browse records for 'remote' models\n            no_local_cache = {'binary'}\n            if not transaction.readonly:\n                no_local_cache |= {'one2one', 'one2many', 'many2many'}\n            for data in read_data:\n                id_ = data['id']\n                to_delete = set()\n                for fname, field in ffields.items():\n                    fvalue = data[fname]\n                    if field._type in {\n                            'many2one', 'one2one', 'one2many', 'many2many',\n                            'reference'}:\n                        if (fname != name\n                                and field._type not in no_local_cache):\n                            continue\n                        fvalue = instantiate(field, data[fname], data)\n                    if id_ == self.id and fname == name:\n                        value = fvalue\n                    if fname not in self._local_cache[id_]:\n                        self._local_cache[id_][fname] = fvalue\n                    if (field._type in no_local_cache\n                            or field.context\n                            or getattr(field, 'datetime_field', None)\n                            or (isinstance(field, fields.Function)\n                                and (not transaction.readonly\n                                    or field.getter_with_context))):\n                        to_delete.add(fname)\n                self._cache[id_]._update(\n                    **{k: v for k, v in data.items() if k not in to_delete})\n        return value\n\n    @property\n    def _save_values(self):\n        values = {}\n        if not self._values:\n            return values\n        for fname, value in self._values._items():\n            field = self._fields[fname]\n            if isinstance(field, fields.Function) and not field.setter:\n                continue\n            if field._type in ('many2one', 'one2one', 'reference'):\n                if value:\n                    if ((value.id is None or value.id < 0)\n                            and field._type != 'reference'):\n                        value.save()\n                    if field._type == 'reference':\n                        value = str(value)\n                    else:\n                        value = value.id\n            if field._type in ('one2many', 'many2many'):\n                targets = value\n                if self.id is not None and self.id >= 0:\n                    _values, self._values = self._values, None\n                    try:\n                        previous = [t.id for t in getattr(self, fname)]\n                    finally:\n                        self._values = _values\n                else:\n                    previous = []\n                to_add = []\n                to_create = []\n                to_write = []\n                for target in targets:\n                    if (field._type == 'one2many'\n                            and field.field\n                            and target._values):\n                        t_values = target._values._copy()\n                        # Don't look at reverse field\n                        target._values._pop(field.field, None)\n                    else:\n                        t_values = None\n                    try:\n                        if target.id is None or target.id < 0:\n                            to_create.append(target._save_values)\n                        else:\n                            if target.id in previous:\n                                previous.remove(target.id)\n                            else:\n                                to_add.append(target.id)\n                            target_values = target._save_values\n                            if target_values:\n                                to_write.append(\n                                    ('write', [target.id], target_values))\n                    finally:\n                        if t_values:\n                            target._values = t_values\n                value = []\n                if previous:\n                    to_delete, to_remove = [], []\n                    deleted = removed = None\n                    if self._deleted:\n                        deleted = self._deleted[fname]\n                    if self._removed:\n                        removed = self._removed[fname]\n                    for id_ in previous:\n                        if deleted and id_ in deleted:\n                            to_delete.append(id_)\n                        elif removed and id_ in removed:\n                            to_remove.append(id_)\n                        elif field._type == 'one2many':\n                            to_delete.append(id_)\n                        else:\n                            to_remove.append(id_)\n                    if to_delete:\n                        value.append(('delete', to_delete))\n                    if to_remove:\n                        value.append(('remove', to_remove))\n                if to_add:\n                    value.append(('add', to_add))\n                if to_create:\n                    value.append(('create', to_create))\n                if to_write:\n                    value.extend(to_write)\n            values[fname] = value\n        return values\n\n    @dualmethod\n    def save(cls, records):\n        while records:\n            latter = []\n            values = {}\n            save_values = {}\n            to_create = []\n            to_write = []\n            first = next(iter(records))\n            transaction = first._transaction\n            user = first._user\n            context = first._context\n            for record in records:\n                assert isinstance(record, cls), (record, cls)\n                if (record._transaction != transaction\n                        or user != record._user\n                        or context != record._context):\n                    latter.append(record)\n                    continue\n                save_values[record] = record._save_values\n                values[record] = record._values\n                record._values = None\n                if record.id is None or record.id < 0:\n                    to_create.append(record)\n                elif save_values[record]:\n                    to_write.append(record)\n            try:\n                with Transaction().set_current_transaction(transaction), \\\n                        transaction.set_user(user), \\\n                        transaction.reset_context(), \\\n                        transaction.set_context(context, _check_access=False):\n                    if to_create:\n                        news = cls.create([save_values[r] for r in to_create])\n                        for record, new in zip(to_create, news):\n                            record._ids.remove(record.id)\n                            record._id = new.id\n                            record._ids.append(record.id)\n                    if to_write:\n                        cls.write(*sum(\n                                (([r], save_values[r]) for r in to_write), ()))\n            except Exception:\n                for record in to_create + to_write:\n                    record._values = values[record]\n                raise\n            for record in to_create + to_write:\n                record._init_values = None\n                record._deleted = None\n                record._removed = None\n            records = latter\n\n\nclass EvalEnvironment(dict):\n    __slots__ = ('_record', '_model')\n\n    def __init__(self, record, Model):\n        super(EvalEnvironment, self).__init__()\n        self._record = record\n        self._model = Model\n\n    def __getitem__(self, item):\n        if item.startswith('_parent_'):\n            field = item[8:]\n            model_name = self._model._fields[field].model_name\n            ParentModel = Pool().get(model_name)\n            return EvalEnvironment(getattr(self._record, field), ParentModel)\n        if item in self._model._fields:\n            value = getattr(self._record, item)\n            if isinstance(value, Model):\n                if self._model._fields[item]._type == 'reference':\n                    return str(value)\n                return value.id\n            elif (isinstance(value, (list, tuple))\n                    and value and isinstance(value[0], Model)):\n                return [r.id for r in value]\n            else:\n                return value\n        return super(EvalEnvironment, self).__getitem__(item)\n\n    def __getattr__(self, item):\n        try:\n            return self.__getitem__(item)\n        except KeyError as exception:\n            raise AttributeError(*exception.args)\n\n    def get(self, item, default=None):\n        try:\n            return self.__getitem__(item)\n        except Exception:\n            pass\n        return super(EvalEnvironment, self).get(item, default)\n\n    def __bool__(self):\n        return bool(self._record)\n\n\ndef _record_eval_pyson(record, source, encoded=False):\n    transaction = Transaction()\n    if not encoded:\n        pyson = _pyson_encoder.encode(source)\n    else:\n        pyson = source\n    env = EvalEnvironment(record, record.__class__)\n    env['context'] = transaction.context\n    env['active_model'] = record.__class__.__name__\n    env['active_id'] = record.id\n    return PYSONDecoder(env).decode(pyson)\n\n\n_pyson_encoder = PYSONEncoder()\n"
  },
  {
    "path": "trytond/model/modelview.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport collections\nfrom functools import wraps\n\nfrom lxml import etree\n\nfrom trytond.cache import Cache\nfrom trytond.exceptions import UserError\nfrom trytond.i18n import gettext\nfrom trytond.pool import Pool\nfrom trytond.pyson import PYSONEncoder\nfrom trytond.rpc import RPC\nfrom trytond.tools import is_instance_method\nfrom trytond.transaction import Transaction\n\nfrom . import fields\nfrom .fields import on_change_result\nfrom .model import Model\n\n__all__ = ['ModelView']\n\n\nclass AccessButtonError(UserError):\n    pass\n\n\ndef on_change(func):\n    @wraps(func)\n    def wrapper(self, *args, **kwargs):\n        result = func(self, *args, **kwargs)\n        assert result is None, func\n        return self\n    wrapper.on_change = True\n    return wrapper\n\n\nclass ModelView(Model):\n    \"\"\"\n    Define a model with views in Tryton.\n    \"\"\"\n    __slots__ = ()\n    _fields_view_get_cache = Cache('modelview.fields_view_get')\n    _view_toolbar_get_cache = Cache('modelview.view_toolbar_get')\n\n    @classmethod\n    def __setup__(cls):\n        super(ModelView, cls).__setup__()\n        cls.__rpc__['fields_view_get'] = RPC(cache=dict(days=1))\n        cls.__rpc__['view_toolbar_get'] = RPC(cache=dict(days=1))\n        cls.__rpc__['on_change'] = RPC(instantiate=0)\n        cls.__rpc__['on_change_with'] = RPC(instantiate=0)\n        cls.__rpc__['on_change_notify'] = RPC(instantiate=0)\n        cls._buttons = {}\n\n        fields_ = {}\n        for name in dir(cls):\n            if name.startswith('__'):\n                continue\n            attr = getattr(cls, name)\n            if isinstance(attr, fields.Field):\n                fields_[name] = attr\n\n    @classmethod\n    def __post_setup__(cls):\n        super(ModelView, cls).__post_setup__()\n\n        methods = {\n            '_done': set(),\n            'depends': collections.defaultdict(set),\n            'depend_methods': collections.defaultdict(set),\n            'change': collections.defaultdict(set),\n            }\n        cls.__change_buttons = methods['change']\n\n        def set_methods(name):\n            if name in methods['_done']:\n                return\n            methods['_done'].add(name)\n            for parent_cls in cls.__mro__:\n                parent_meth = getattr(parent_cls, name, None)\n                if not parent_meth:\n                    continue\n                for attr in ['depends', 'depend_methods', 'change']:\n                    if isinstance(parent_meth, property):\n                        parent_value = getattr(parent_meth.fget, attr, set())\n                        parent_value |= getattr(parent_meth.fset, attr, set())\n                    else:\n                        parent_value = getattr(parent_meth, attr, set())\n                    if parent_value:\n                        methods[attr][name] |= parent_value\n\n        def setup_field(field_name, field, attribute):\n            if attribute == 'selection_change_with':\n                if isinstance(\n                        getattr(field, 'selection', None), str):\n                    function_name = field.selection\n                else:\n                    return\n            else:\n                function_name = '%s_%s' % (attribute, field_name)\n            function = getattr(cls, function_name, None)\n            if not function:\n                return\n\n            set_methods(function_name)\n            setattr(field, attribute, methods['depends'][function_name])\n\n            meth_names = list(methods['depend_methods'][function_name])\n            meth_done = set()\n            while meth_names:\n                meth_name = meth_names.pop()\n                method = getattr(cls, meth_name)\n                assert callable(method) or isinstance(method, property), \\\n                    \"%s.%s not callable or property\" % (cls, meth_name)\n                set_methods(meth_name)\n                setattr(field, attribute,\n                    getattr(field, attribute) | methods['depends'][meth_name])\n                meth_names += list(\n                    methods['depend_methods'][meth_name] - meth_done)\n                meth_done.add(meth_name)\n\n            if (attribute == 'on_change'\n                    and not getattr(function, 'on_change', None)):\n                # Decorate on_change to always return self\n                setattr(cls, function_name, on_change(function))\n\n        for name, field in cls._fields.items():\n            for attribute in [\n                    'on_change',\n                    'on_change_with',\n                    'autocomplete',\n                    'selection_change_with',\n                    ]:\n                setup_field(name, field, attribute)\n\n        # Update __rpc__\n        for field_name, field in cls._fields.items():\n            field.set_rpc(cls)\n\n        for button in cls._buttons:\n            if not is_instance_method(cls, button):\n                cls.__rpc__.setdefault(button,\n                    RPC(readonly=False, instantiate=0))\n            else:\n                cls.__rpc__.setdefault(button,\n                    RPC(instantiate=0, result=on_change_result))\n\n            meth_names = set()\n            meth_done = set()\n            for parent_cls in cls.__mro__:\n                parent_meth = getattr(parent_cls, button, None)\n                if not parent_meth:\n                    continue\n                cls.__change_buttons[button] |= getattr(\n                    parent_meth, 'change', set())\n                meth_names |= getattr(parent_meth, 'change_methods', set())\n            while meth_names:\n                meth_name = meth_names.pop()\n                method = getattr(cls, meth_name)\n                assert callable(method) or isinstance(method, property), \\\n                    \"%s.%s not callable or property\" % (cls, meth_name)\n                set_methods(meth_name)\n                cls.__change_buttons[button] |= methods['depends'][meth_name]\n                meth_names |= (\n                    methods['depend_methods'][meth_name] - meth_done)\n                meth_done.add(meth_name)\n\n        set_methods('on_change_notify')\n        cls._on_change_notify_depends = methods['depends']['on_change_notify']\n        meth_names = list(methods['depend_methods']['on_change_notify'])\n        meth_done = set()\n        while meth_names:\n            meth_name = meth_names.pop()\n            method = getattr(cls, meth_name)\n            assert callable(method) or isinstance(method, property), \\\n                \"%s.%s not callable or property\" % (cls, meth_name)\n            set_methods(meth_name)\n            cls._on_change_notify_depends |= methods['depends'][meth_name]\n            meth_names += list(\n                methods['depend_methods'][meth_name] - meth_done)\n            meth_done.add(meth_name)\n\n    @classmethod\n    def fields_view_get(cls, view_id=None, view_type='form', level=None):\n        '''\n        Return a view definition.\n        If view_id is None the first one will be used of view_type.\n        The definition is a dictionary with keys:\n           - model: the model name\n           - type: the type of the view\n           - view_id: the id of the view\n           - arch: the xml description of the view\n           - fields: a dictionary with the definition of each field in the view\n           - field_childs: the name of the childs field for tree\n        '''\n        key = (cls.__name__, view_id, view_type, level)\n        result = cls._fields_view_get_cache.get(key)\n        if result:\n            return result\n        result = {'model': cls.__name__}\n        pool = Pool()\n        View = pool.get('ir.ui.view')\n\n        if view_id:\n            view = View(view_id)\n        else:\n            domain = [\n                ('model', '=', cls.__name__),\n                ['OR',\n                    ('inherit', '=', None),\n                    ('inherit.model', '!=', cls.__name__),\n                    ],\n                ]\n            views = View.search(domain)\n            views = [v for v in views if v.rng_type == view_type]\n            if views:\n                view = views[0]\n                view_id = view.id\n            else:\n                view = None\n\n        # if a view was found\n        if view:\n            result = view.view_get(model=cls.__name__)\n\n        # otherwise, build some kind of default view\n        else:\n            if view_type == 'form':\n                res = cls.fields_get()\n                xml = '''<?xml version=\"1.0\"?>''' \\\n                    '''<form col=\"4\">'''\n                for i in res:\n                    if i in ('create_uid', 'create_date',\n                            'write_uid', 'write_date', 'id', 'rec_name'):\n                        continue\n                    if res[i]['type'] not in ('one2many', 'many2many'):\n                        xml += '<label name=\"%s\"/>' % (i,)\n                        xml += '<field name=\"%s\"/>' % (i,)\n                        if res[i]['type'] == 'text':\n                            xml += \"<newline/>\"\n                    else:\n                        xml += '<field name=\"%s\" colspan=\"4\"/>' % (i,)\n                if cls._buttons:\n                    xml += '<group id=\"buttons\" col=\"-1\" colspan=\"4\">'\n                    for button in cls._buttons:\n                        xml += '<button name=\"%s\"/>' % button\n                    xml += '</group>'\n                xml += \"</form>\"\n            elif view_type == 'tree':\n                field = 'id'\n                if cls._rec_name in cls._fields:\n                    field = cls._rec_name\n                xml = '''<?xml version=\"1.0\"?>''' \\\n                    '''<tree><field name=\"%s\"/></tree>''' \\\n                    % (field,)\n            else:\n                xml = ''\n            result['type'] = view_type\n            result['view_id'] = view_id\n            result['arch'] = xml\n            result['field_childs'] = None\n        result['model'] = cls.__name__\n\n        if level is None:\n            level = 1 if result['type'] == 'tree' else 0\n\n        # Update arch and compute fields from arch\n        parser = etree.XMLParser(\n            remove_blank_text=True, resolve_entities=False)\n        tree = etree.fromstring(result['arch'], parser)\n        result['arch'], result['fields'] = cls.parse_view(\n            tree, result['type'], view_id=view_id,\n            field_children=result['field_childs'], level=level)\n\n        cls._fields_view_get_cache.set(key, result)\n        return result\n\n    @classmethod\n    def view_toolbar_get(cls):\n        \"\"\"\n        Returns the model specific actions and exports.\n        A dictionary with keys:\n            - print: a list of available reports\n            - action: a list of available actions\n            - relate: a list of available relations\n            - exports: a list of available exports\n        \"\"\"\n        pool = Pool()\n        Action = pool.get('ir.action.keyword')\n        Export = pool.get('ir.export')\n        Email = pool.get('ir.email.template')\n        key = cls.__name__\n        result = cls._view_toolbar_get_cache.get(key)\n        if result:\n            return result\n        prints = Action.get_keyword('form_print', (cls.__name__, -1))\n        actions = Action.get_keyword('form_action', (cls.__name__, -1))\n        relates = Action.get_keyword('form_relate', (cls.__name__, -1))\n        exports = Export.search_read(\n            [('resource', '=', cls.__name__)],\n            fields_names=['name', 'header', 'export_fields.name'])\n        emails = Email.search_read(\n            [('model.model', '=', cls.__name__)],\n            fields_names=['name'])\n        result = {\n            'print': prints,\n            'action': actions,\n            'relate': relates,\n            'exports': exports,\n            'emails': emails,\n            }\n        cls._view_toolbar_get_cache.set(key, result)\n        return result\n\n    @classmethod\n    def view_attributes(cls):\n        'Return a list of xpath, attribute name and value'\n        return []\n\n    @classmethod\n    def parse_view(\n            cls, tree, type, view_id=None, field_children=None, level=0,\n            view_depends=None):\n        \"\"\"\n        Return sanitized XML and the corresponding fields definition\n        \"\"\"\n        pool = Pool()\n        ModelAccess = pool.get('ir.model.access')\n        FieldAccess = pool.get('ir.model.field.access')\n\n        tree_root = tree.getroottree().getroot()\n        readonly_view = (\n            tree_root.tag == 'board'\n            or (tree_root.tag == 'tree'\n                and not int(tree_root.attrib.get('editable', '0'))))\n\n        encoder = PYSONEncoder()\n        if view_depends is None:\n            view_depends = []\n        else:\n            view_depends = view_depends.copy()\n        with Transaction().set_context(view_id=view_id):\n            for xpath, attribute, value, *extra in cls.view_attributes():\n                if readonly_view and attribute in {'required', 'readonly'}:\n                    continue\n                depends = []\n                if extra:\n                    depends, = extra\n                nodes = tree.xpath(xpath)\n                for element in nodes:\n                    element.set(attribute, encoder.encode(value))\n                if nodes and depends:\n                    view_depends.extend(depends)\n\n        fields_width = {}\n        fields_optional = {}\n        tree_root = tree.getroottree().getroot()\n\n        # Find field without read access\n        fread_accesses = FieldAccess.check(cls.__name__,\n                list(cls._fields.keys()), 'read', access=True)\n        fields_to_remove = set(\n            x for x, y in fread_accesses.items() if not y)\n\n        # Find relation field without read access\n        for name, field in cls._fields.items():\n            if not ModelAccess.check_relation(cls.__name__, name, mode='read'):\n                fields_to_remove.add(name)\n\n        checked = set()\n        while checked < fields_to_remove:\n            to_check = fields_to_remove - checked\n            for name, field in cls._fields.items():\n                for field_to_remove in to_check:\n                    if field_to_remove in field.depends:\n                        fields_to_remove.add(name)\n            checked |= to_check\n\n        buttons_to_remove = set()\n        for name, definition in cls._buttons.items():\n            if fields_to_remove & set(definition.get('depends', [])):\n                buttons_to_remove.add(name)\n\n        field_xpath = ('//field[@name=\"%(name)s\"]'\n            '| //label[@name=\"%(name)s\"] | //page[@name=\"%(name)s\"]'\n            '| //group[@name=\"%(name)s\"] | //separator[@name=\"%(name)s\"]')\n        button_xpath = '//button[@name=\"%(name)s\"]'\n        # Remove field and button without read acces\n        for xpath, names in (\n                (field_xpath, fields_to_remove),\n                (button_xpath, buttons_to_remove),\n                ):\n            for name in names:\n                path = xpath % {'name': name}\n                for i, element in enumerate(tree.xpath(path)):\n                    if type == 'tree' or element.tag == 'page':\n                        parent = element.getparent()\n                        parent.remove(element)\n                    elif type == 'form':\n                        element.tag = 'label'\n                        colspan = element.attrib.get('colspan')\n                        element.attrib.clear()\n                        element.attrib['id'] = 'hidden %s-%s' % (name, i)\n                        if colspan is not None:\n                            element.attrib['colspan'] = colspan\n\n        # Remove empty pages\n        if type == 'form':\n            for page in tree.xpath('//page[not(descendant::*)]'):\n                page.getparent().remove(page)\n\n        if type == 'tree':\n            user = Transaction().user\n            if Transaction().context.get('view_tree_width'):\n                ViewTreeWidth = pool.get('ir.ui.view_tree_width')\n                viewtreewidths = ViewTreeWidth.search([\n                    ('model', '=', cls.__name__),\n                    ('user', '=', user),\n                    ])\n                for viewtreewidth in viewtreewidths:\n                    if viewtreewidth.width > 0:\n                        fields_width[viewtreewidth.field] = viewtreewidth.width\n\n            if view_id:\n                ViewTreeOptional = pool.get('ir.ui.view_tree_optional')\n                viewtreeoptionals = ViewTreeOptional.search([\n                        ('view_id', '=', view_id),\n                        ('user', '=', user),\n                        ])\n                fields_optional = {o.field: o.value for o in viewtreeoptionals}\n\n        fields_def = cls.__parse_fields(\n            tree_root, type,\n            fields_width=fields_width,\n            fields_optional=fields_optional)\n\n        if hasattr(cls, 'active'):\n            fields_def.setdefault('active', {'name': 'active'})\n\n        if field_children:\n            fields_def.setdefault(field_children, {'name': field_children})\n            if field_children in cls._fields:\n                field = cls._fields[field_children]\n                if hasattr(field, 'field'):\n                    fields_def.setdefault(field.field, {'name': field.field})\n\n        for depend in view_depends:\n            if depend not in fields_to_remove:\n                fields_def.setdefault(depend, {'name': depend})\n\n        field_names = list(fields_def.keys())\n\n        for field_name in field_names:\n            if field_name not in cls._fields:\n                continue\n            field = cls._fields[field_name]\n            field_depends = field.display_depends.copy()\n            if not readonly_view:\n                field_depends |= field.edition_depends\n            if 'context' in field_depends and 'context' not in cls._fields:\n                field_depends.discard('context')\n            for depend in field_depends:\n                if depend not in fields_def:\n                    fields_def[depend] = {'name': depend}\n                    field_names.append(depend)\n\n        arch = etree.tostring(\n            tree, encoding='utf-8', pretty_print=False).decode('utf-8')\n        # Do not call fields_def without fields as it returns all fields\n        if fields_def:\n            fields2 = cls.fields_get(list(fields_def.keys()), level=level)\n        else:\n            fields2 = {}\n        for field in fields_def:\n            if field in fields2:\n                fields2[field].update(fields_def[field])\n        return arch, fields2\n\n    @classmethod\n    def __parse_fields(\n            cls, element, type, fields_width=None, fields_optional=None,\n            _fields_attrs=None):\n        pool = Pool()\n        ModelData = pool.get('ir.model.data')\n        ModelAccess = pool.get('ir.model.access')\n        Button = pool.get('ir.model.button')\n        User = pool.get('res.user')\n        ActionWindow = pool.get('ir.action.act_window')\n\n        if fields_width is None:\n            fields_width = {}\n        if fields_optional is None:\n            fields_optional = {}\n        if _fields_attrs is None:\n            fields_attrs = {}\n        else:\n            fields_attrs = _fields_attrs\n\n        def set_view_ids(element):\n            view_ids = []\n            if element.get('view_ids'):\n                for view_id in element.get('view_ids').split(','):\n                    try:\n                        view_ids.append(int(view_id))\n                    except ValueError:\n                        view_ids.append(ModelData.get_id(*view_id.split('.')))\n                element.attrib['view_ids'] = ','.join(map(str, view_ids))\n            return view_ids\n\n        def get_relation(field):\n            if hasattr(field, 'model_name'):\n                return field.model_name\n            elif hasattr(field, 'get_target'):\n                return field.get_target().__name__\n\n        def get_views(relation, widget, view_ids, mode):\n            Relation = pool.get(relation)\n            views = {}\n            if widget in {'one2many', 'many2many'}:\n                # Prefetch only the first view to prevent infinite loop\n                if view_ids:\n                    for view_id in view_ids:\n                        view = Relation.fields_view_get(view_id=view_id)\n                        views[str(view_id)] = view\n                        break\n                else:\n                    for view_type in mode:\n                        views[view_type] = (\n                            Relation.fields_view_get(view_type=view_type))\n                        break\n            return views\n\n        for attr in ('name', 'icon', 'symbol'):\n            if not element.get(attr):\n                continue\n            fields_attrs.setdefault(element.get(attr), {})\n\n        if element.tag == 'field' and type in ['tree', 'form']:\n            for attr in ('name', 'icon'):\n                fname = element.get(attr)\n                if not fname:\n                    continue\n                view_ids = set_view_ids(element)\n                if type != 'form':\n                    continue\n                field = cls._fields[fname]\n                relation = get_relation(field)\n                if not relation:\n                    continue\n                mode = (\n                    element.attrib.pop('mode', None) or 'tree,form').split(',')\n                widget = element.attrib.get('widget', field._type)\n                views = get_views(relation, widget, view_ids, mode)\n                element.attrib['mode'] = ','.join(mode)\n                fields_attrs[fname].setdefault('views', {}).update(views)\n\n            if type == 'tree':\n                if element.get('name') in fields_width:\n                    element.set(\n                        'width', str(fields_width[element.get('name')]))\n                if element.get('optional'):\n                    if element.get('name') in fields_optional:\n                        optional = str(int(\n                                fields_optional[element.get('name')]))\n                        element.set('optional', optional)\n\n        encoder = PYSONEncoder()\n        if element.tag == 'button':\n            button_name = element.attrib['name']\n            if button_name in cls._buttons:\n                states = cls._buttons[button_name]\n            else:\n                states = {}\n            groups = set(User.get_groups())\n            button_attr = Button.get_view_attributes(\n                cls.__name__, button_name)\n            for attr, value in button_attr.items():\n                if not element.get(attr):\n                    element.set(attr, value or '')\n            button_groups = Button.get_groups(cls.__name__, button_name)\n            if ((button_groups and not groups & button_groups)\n                    or (not button_groups\n                        and not ModelAccess.check(\n                            cls.__name__, 'write', raise_exception=False))):\n                states = states.copy()\n                states['readonly'] = True\n            element.set('states', encoder.encode(states))\n\n            button_rules = Button.get_rules(cls.__name__, button_name)\n            if button_rules:\n                element.set('rule', '1')\n\n            change = cls.__change_buttons[button_name]\n            if change:\n                change = list(change)\n                # Add id to change if the button is not cached\n                # Not having the id increase the efficiency of the cache\n                if cls.__rpc__[button_name].cache:\n                    change.append('id')\n                element.set('change', encoder.encode(change))\n            if not is_instance_method(cls, button_name):\n                element.set('type', 'class')\n            else:\n                element.set('type', 'instance')\n\n            for depend in states.get('depends', []):\n                fields_attrs.setdefault(depend, {})\n\n        if element.tag == 'link':\n            link_name = element.attrib['name']\n            action_id = ModelData.get_id(*link_name.split('.'))\n            try:\n                with Transaction().set_context(_check_access=True):\n                    action, = ActionWindow.search([('id', '=', action_id)])\n            except ValueError:\n                action = None\n            if (not action\n                    or not action.res_model\n                    or not ModelAccess.check(\n                        action.res_model, 'read', raise_exception=False)):\n                element.tag = 'label'\n                colspan = element.attrib.get('colspan')\n                link_name = element.attrib['name']\n                element.attrib.clear()\n                element.attrib['id'] = link_name\n                if colspan is not None:\n                    element.attrib['colspan'] = colspan\n            else:\n                element.attrib['id'] = str(action.action.id)\n\n        if element.tag == 'tree' and element.get('sequence'):\n            fields_attrs.setdefault(element.get('sequence'), {})\n\n        if element.tag == 'calendar':\n            for attr in ['dtstart', 'dtend', 'color', 'background_color']:\n                if element.get(attr):\n                    fields_attrs.setdefault(element.get(attr), {})\n\n        for field in element:\n            fields_attrs = cls.__parse_fields(\n                field, type,\n                fields_width=fields_width,\n                fields_optional=fields_optional,\n                _fields_attrs=fields_attrs)\n        return fields_attrs\n\n    @staticmethod\n    def button(func):\n        @wraps(func)\n        def wrapper(cls, records, *args, **kwargs):\n            from .modelstorage import ModelStorage\n            pool = Pool()\n            ModelAccess = pool.get('ir.model.access')\n            Button = pool.get('ir.model.button')\n            ButtonClick = pool.get('ir.model.button.click')\n            User = pool.get('res.user')\n\n            transaction = Transaction()\n            check_access = transaction.context.get('_check_access')\n\n            assert len(records) == len(set(records)), \"Duplicate records\"\n\n            if (transaction.user != 0) and check_access:\n                ModelAccess.check(cls.__name__, 'read')\n                if issubclass(cls, ModelStorage):\n                    # Check record rule access\n                    cls.read([r.id for r in records\n                            if r.id is not None and r.id >= 0],\n                        ['id'])\n                groups = set(User.get_groups())\n                button_groups = Button.get_groups(cls.__name__,\n                    func.__name__)\n                if button_groups:\n                    if not groups & button_groups:\n                        raise AccessButtonError(\n                            gettext('ir.msg_access_button_error',\n                                button=func.__name__,\n                                model=cls.__name__))\n                else:\n                    ModelAccess.check(cls.__name__, 'write')\n\n            with Transaction().set_context(_check_access=False):\n                if (transaction.user != 0) and check_access:\n                    button_rules = Button.get_rules(\n                        cls.__name__, func.__name__)\n                    if button_rules:\n                        clicks = ButtonClick.register(\n                            cls.__name__, func.__name__, records)\n                        records = [r for r in records\n                            if all(br.test(r, clicks.get(r.id, []))\n                                for br in button_rules)]\n                # Reset click after filtering in case the button also has rules\n                names = Button.get_reset(cls.__name__, func.__name__)\n                if names:\n                    ButtonClick.reset(cls.__name__, names, records)\n                return func(cls, records, *args, **kwargs)\n        return wrapper\n\n    @staticmethod\n    def button_action(action):\n        def decorator(func):\n            func = ModelView.button(func)\n\n            @wraps(func)\n            def wrapper(*args, **kwargs):\n                pool = Pool()\n                ModelData = pool.get('ir.model.data')\n                Action = pool.get('ir.action')\n\n                value = func(*args, **kwargs)\n\n                module, fs_id = action.split('.')\n                action_id = Action.get_action_id(\n                    ModelData.get_id(module, fs_id))\n                if value:\n                    action_value = Action(action_id).get_action_value()\n                    action_value.update(value)\n                    return action_value\n                else:\n                    return action_id\n            return wrapper\n        return decorator\n\n    @staticmethod\n    def button_change(*fields, **kwargs):\n        methods = kwargs.pop('methods', None)\n        assert not kwargs\n\n        def decorator(func):\n            func = on_change(func)\n            func.change = set(fields)\n            if methods:\n                func.change_methods = set(methods)\n            return func\n        return decorator\n\n    def on_change(self, fieldnames):\n        for fieldname in sorted(fieldnames):\n            method = getattr(self, 'on_change_%s' % fieldname, None)\n            if method:\n                method()\n        # XXX remove backward compatibility\n        return [self._changed_values]\n\n    def on_change_with(self, fieldnames):\n        changes = {}\n        for fieldname in fieldnames:\n            method_name = 'on_change_with_%s' % fieldname\n            changes[fieldname] = getattr(self, method_name)()\n        return changes\n\n    def on_change_notify(self):\n        \"\"\"Return a list of type and message couples.\n        Available types are info, warning and error.\n        \"\"\"\n        return []\n\n    @property\n    def _changed_values(self):\n        \"\"\"Return the values changed since the instantiation.\n        By default, the value of a field is its internal representation except:\n            - for Many2One and One2One field: the id.\n            - for Reference field: the string model,id\n            - for Many2Many: the list of ids\n            - for One2Many: a dictionary composed of three keys:\n                - add: a list of tuple, the first element is the index where\n                  the new line is added, the second element is\n                  `_default_values`\n                - update: a list of dictionary of `_changed_values` including\n                  the `id`\n                - remove: a list of ids\n        \"\"\"\n        from .modelstorage import ModelStorage\n        changed = {}\n        init_values = self._init_values or self._record()\n        if not self._values:\n            return changed\n        init_record = self.__class__(self.id)\n        for fname, value in self._values._items():\n            field = self._fields[fname]\n            # Always test key presence in case value is None\n            if (fname in init_values\n                    and value == init_values[fname]\n                    and field._type != 'one2many'):\n                continue\n            if field._type in ('many2one', 'one2one', 'reference'):\n                if value:\n                    if isinstance(value, ModelStorage):\n                        changed['%s.' % fname] = {\n                            'rec_name': value.rec_name,\n                            }\n                    if value.id is None:\n                        # Don't consider temporary instance as a change\n                        continue\n                    if field._type == 'reference':\n                        value = str(value)\n                    else:\n                        value = value.id\n            elif field._type in ['one2many', 'many2many']:\n                targets = value\n                if fname in init_values:\n                    init_targets = init_values._get(fname)\n                else:\n                    init_targets = getattr(init_record, fname, [])\n                value = collections.defaultdict(list)\n                previous = [t.id for t in init_targets if t.id]\n                for i, target in enumerate(targets):\n                    if (field._type == 'one2many'\n                            and field.field\n                            and target._values):\n                        t_values = target._values._copy()\n                        # Don't look at reverse field\n                        target._values._pop(field.field, None)\n                    else:\n                        t_values = None\n                    try:\n                        if target.id in previous:\n                            previous.remove(target.id)\n                            if isinstance(target, ModelView):\n                                target_changed = target._changed_values\n                                if target_changed:\n                                    target_changed['id'] = target.id\n                                    value['update'].append(target_changed)\n                        else:\n                            if isinstance(target, ModelView):\n                                # Ensure initial values are returned because\n                                # target was instantiated on server side.\n                                target_init_values = target._init_values\n                                target._init_values = None\n                                try:\n                                    added_values = target._changed_values\n                                finally:\n                                    target._init_values = target_init_values\n                            else:\n                                added_values = target._default_values\n                            added_values['id'] = target.id\n                            value['add'].append((i, added_values))\n                    finally:\n                        if t_values:\n                            target._values = t_values\n                if previous:\n                    to_delete, to_remove = [], []\n                    deleted = removed = None\n                    if self._deleted:\n                        deleted = self._deleted[fname]\n                    if self._removed:\n                        removed = self._removed[fname]\n                    for id_ in previous:\n                        if deleted and id_ in deleted:\n                            to_delete.append(id_)\n                        elif removed and id_ in removed:\n                            to_remove.append(id_)\n                        elif field._type == 'one2many':\n                            to_delete.append(id_)\n                        else:\n                            to_remove.append(id_)\n                    if to_delete:\n                        value['delete'] = to_delete\n                    if to_remove:\n                        value['remove'] = to_remove\n                if not value:\n                    continue\n                value = dict(value)\n            changed[fname] = value\n        return changed\n"
  },
  {
    "path": "trytond/model/multivalue.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the toplevel of this\n# repository contains the full copyright notices and license terms.\nfrom trytond.pool import Pool\n\nfrom .fields import MultiValue\nfrom .match import MatchMixin\nfrom .model import Model\n\n\nclass MultiValueMixin(object):\n    __slots__ = ()\n\n    @classmethod\n    def multivalue_model(cls, field):\n        pool = Pool()\n        Value = pool.get('%s.%s' % (cls.__name__, field))\n        assert issubclass(Value, ValueMixin), (\n            \"%s is not a subclass of ValueMixin\" % Value)\n        return Value\n\n    def multivalue_records(self, field):\n        Value = self.multivalue_model(field)\n        for fname, field in self._fields.items():\n            if (field._type == 'one2many'\n                    and field.model_name == Value.__name__):\n                return getattr(self, fname)\n        return Value.search([])\n\n    def multivalue_record(self, field, **pattern):\n        Value = self.multivalue_model(field)\n        for fname, field in Value._fields.items():\n            if (field._type == 'many2one'\n                    and field.model_name == self.__name__):\n                pattern = pattern.copy()\n                pattern[fname] = self\n                break\n        record = Value(**pattern)\n        for oname, ofield in self._fields.items():\n            if (oname != field\n                    and isinstance(ofield, MultiValue)\n                    and self.multivalue_model(oname) == Value):\n                func = getattr(self, 'default_%s' % oname, None)\n                if func:\n                    setattr(record, oname, func(**pattern))\n        return record\n\n    def __values(self, field, pattern, match_none=True):\n        return [v for v in self.multivalue_records(field)\n            if v.match(pattern, match_none=match_none)]\n\n    def get_multivalue(self, name, **pattern):\n        Value = self.multivalue_model(name)\n        pattern = filter_pattern(pattern, Value)\n        values = self.__values(name, pattern, match_none=False)\n        if not values:\n            value = Value(**pattern)\n            func = getattr(self, 'default_%s' % name, lambda **kw: None)\n            setattr(value, name, func(**pattern))\n        else:\n            value = values[0]\n        return getattr(value, name)\n\n    def _multivalue_getter(self, name):\n        Value = self.multivalue_model(name)\n        value = self.get_multivalue(name)\n        if isinstance(value, Model):\n            if Value._fields[name]._type == 'reference':\n                return str(value)\n            return value.id\n        elif isinstance(value, (list, tuple)):\n            return tuple(r.id if isinstance(r, Model) else r for r in value)\n        else:\n            return value\n\n    def set_multivalue(self, name, value, save=True, **pattern):\n        Value = self.multivalue_model(name)\n        pattern = filter_pattern(pattern, Value)\n        values = self.__values(name, pattern, match_none=True)\n        if not values:\n            values = [self.multivalue_record(name, **pattern)]\n        for record in values:\n            setattr(record, name, value)\n        if save:\n            Value.save(values)\n        else:\n            return values\n\n    @classmethod\n    def _multivalue_setter(cls, records, name, val):\n        Value = cls.multivalue_model(name)\n        to_save = []\n        for record in records:\n            to_save.extend(record.set_multivalue(name, val, save=False))\n        Value.save(to_save)\n\n\nclass ValueMixin(MatchMixin):\n\n    def match(self, pattern, match_none=True):\n        return super(ValueMixin, self).match(pattern, match_none=match_none)\n\n\ndef filter_pattern(pattern, Value):\n    return {f: v for f, v in pattern.items() if f in Value._fields}\n"
  },
  {
    "path": "trytond/model/order.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the toplevel of this\n# repository contains the full copyright notices and license terms.\nfrom sql import Column\n\nfrom trytond.i18n import lazy_gettext\nfrom trytond.model import Index, fields\n\n\ndef sequence_ordered(\n        field_name='sequence',\n        field_label=lazy_gettext('ir.msg_sequence'),\n        order='ASC NULLS FIRST'):\n    \"Returns a mixin to order the model by order fields\"\n    assert order.startswith('ASC')\n\n    class SequenceOrderedMixin(object):\n        \"Mixin to order model by a sequence field\"\n        __slots__ = ()\n\n        @classmethod\n        def __setup__(cls):\n            super(SequenceOrderedMixin, cls).__setup__()\n            table = cls.__table__()\n            cls._order = [(field_name, order)] + cls._order\n            cls._sql_indexes.add(\n                Index(table,\n                    (Column(table, field_name), Index.Range(order=order)),\n                    (table.id, Index.Range(order=order))))\n\n    setattr(SequenceOrderedMixin, field_name, fields.Integer(field_label))\n    return SequenceOrderedMixin\n"
  },
  {
    "path": "trytond/model/symbol.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.rpc import RPC\n\n\nclass SymbolMixin(object):\n    __slots__ = ()\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        cls.__rpc__.update({\n                'get_symbol': RPC(instantiate=0, cache=dict(days=1)),\n                })\n\n    def get_symbol(self, sign, symbol=None):\n        'Return the symbol and its position'\n        position = 1\n        if symbol is None:\n            symbol = getattr(self, 'symbol', None)\n        return symbol, position\n"
  },
  {
    "path": "trytond/model/tree.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom itertools import chain\n\nfrom trytond.i18n import gettext\nfrom trytond.tools import escape_wildcard\n\nfrom .modelstorage import ValidationError\n\n\nclass RecursionError(ValidationError):\n    pass\n\n\ndef tree(parent='parent', name='name', separator=None):\n    from . import fields\n\n    class TreeMixin(object):\n        __slots__ = ()\n\n        if separator:\n            @classmethod\n            def __setup__(cls):\n                super(TreeMixin, cls).__setup__()\n                field = getattr(cls, name)\n                clause = (\n                    name, 'not like', '%' + escape_wildcard(separator) + '%')\n                # If TreeMixin is after the class where name is defined in\n                # __mro__, it modifies the base field copied so it must ensure\n                # to add only once the domain\n                if clause not in field.domain:\n                    domain = [clause]\n                    if field.domain:\n                        domain.append(field.domain)\n                    field.domain = domain\n\n            def get_rec_name(self, _):\n                record, names = self, []\n                while record:\n                    names.append(getattr(record, name))\n                    record = getattr(record, parent)\n                return separator.join(reversed(names))\n\n            @fields.depends(parent, '_parent_%s.rec_name' % parent, name)\n            def on_change_with_rec_name(self):\n                names = []\n                if self.parent and self.parent.rec_name:\n                    names.append(self.parent.rec_name)\n                names.append(getattr(self, name) or '')\n                return separator.join(names)\n\n            @classmethod\n            def search_rec_name(cls, _, clause):\n                domain = []\n                if isinstance(clause[2], str):\n                    field = name\n                    values = list(reversed(clause[2].split(separator)))\n                    for value in values:\n                        domain.append((field, clause[1], value.strip()))\n                        field = parent + '.' + field\n                    if ((\n                                clause[1].endswith('like')\n                                and not clause[2].replace(\n                                    '%%', '__').startswith('%'))\n                            or not clause[1].endswith('like')):\n                        if clause[1].startswith('not') or clause[1] == '!=':\n                            operator = '!='\n                            domain.insert(0, 'OR')\n                        else:\n                            operator = '='\n                        top_parent = '.'.join((parent,) * len(values))\n                        domain.append((top_parent, operator, None))\n                    if (clause[1].endswith('like')\n                            and clause[2].replace('%%', '__').endswith('%')):\n                        ids = list(map(int, cls.search(domain, order=[])))\n                        domain = [(parent, 'child_of', ids)]\n                elif clause[2] is None:\n                    domain.append((name, clause[1], clause[2]))\n                else:\n                    if clause[1].startswith('not'):\n                        operator = '!='\n                        domain.append('AND')\n                    else:\n                        operator = '='\n                        domain.append('OR')\n                    for value in clause[2]:\n                        domain.append(cls.search_rec_name(\n                                name, (clause[0], operator, value)))\n                return domain\n\n        @classmethod\n        def validate_fields(cls, records, field_names):\n            super().validate_fields(records, field_names)\n            cls.check_recursion(records, field_names)\n\n        @classmethod\n        def check_recursion(cls, records, field_names=None):\n            '''\n            Function that checks if there is no recursion in the tree\n            composed with parent as parent field name.\n            '''\n            if hasattr(super(TreeMixin, cls), 'check_recursion'):\n                super(TreeMixin, cls).check_recursion(records, field_names)\n\n            if field_names and parent not in field_names:\n                return\n\n            parent_type = cls._fields[parent]._type\n\n            if parent_type not in ('many2one', 'many2many', 'one2one'):\n                raise ValueError(\n                    'Unsupported field type \"%s\" for field \"%s\" on \"%s\"'\n                    % (parent_type, parent, cls.__name__))\n\n            visited = set()\n\n            for record in records:\n                walked = set()\n                walker = getattr(record, parent)\n                while walker:\n                    if parent_type == 'many2many':\n                        for walk in walker:\n                            walked.add(walk.id)\n                            if walk.id == record.id:\n                                parent_name = ', '.join(getattr(r, name)\n                                    for r in getattr(record, parent))\n                                raise RecursionError(\n                                    gettext('ir.msg_recursion_error',\n                                        rec_name=getattr(record, name),\n                                        parent_rec_name=parent_name))\n                        walker = list(chain(*(\n                                    getattr(walk, parent)\n                                    for walk in walker\n                                    if walk.id not in visited)))\n                    else:\n                        walked.add(walker.id)\n                        if walker.id == record.id:\n                            parent_name = getattr(\n                                getattr(record, parent), name)\n                            raise RecursionError(\n                                gettext('ir.msg_recursion_error',\n                                    rec_name=getattr(record, name),\n                                    parent_rec_name=parent_name))\n                        walker = (getattr(walker, parent) not in visited\n                            and getattr(walker, parent))\n                visited.update(walked)\n\n    return TreeMixin\n"
  },
  {
    "path": "trytond/model/union.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the toplevel of this\n# repository contains the full copyright notices and license terms.\nfrom sql import Column, Literal, Union\n\nfrom trytond.model import fields\nfrom trytond.pool import Pool\n\n\nclass UnionMixin:\n    'Mixin to combine models'\n    __slots__ = ()\n\n    @staticmethod\n    def union_models():\n        return []\n\n    @classmethod\n    def union_shard(cls, column, model):\n        models = cls.union_models()\n        length = len(models)\n        i = models.index(model)\n        return ((column * length) + i)\n\n    @classmethod\n    def union_unshard(cls, record_id):\n        pool = Pool()\n        models = cls.union_models()\n        length = len(models)\n        record_id, i = divmod(record_id, length)\n        Model = pool.get(models[i])\n        return Model(record_id)\n\n    @classmethod\n    def union_column(cls, name, field, table, Model):\n        column = Literal(None)\n        union_field = Model._fields.get(name)\n        if union_field:\n            column = Column(table, union_field.name)\n            if (isinstance(field, fields.Many2One)\n                    and field.model_name == cls.__name__):\n                target_model = union_field.model_name\n                if target_model in cls.union_models():\n                    column = cls.union_shard(column, target_model)\n                else:\n                    column = Literal(None)\n        return column\n\n    @classmethod\n    def union_columns(cls, model):\n        pool = Pool()\n        Model = pool.get(model)\n        table = Model.__table__()\n        columns = [cls.union_shard(table.id, model).as_('id')]\n        for name in sorted(cls._fields.keys()):\n            field = cls._fields[name]\n            if name == 'id' or hasattr(field, 'set'):\n                continue\n            column = cls.union_column(name, field, table, Model)\n            columns.append(field.sql_cast(column).as_(name))\n        return table, columns\n\n    @classmethod\n    def table_query(cls):\n        queries = []\n        for model in cls.union_models():\n            table, columns = cls.union_columns(model)\n            queries.append(table.select(*columns))\n        return Union(*queries)\n"
  },
  {
    "path": "trytond/model/workflow.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom collections import OrderedDict\nfrom functools import wraps\n\n\nclass Workflow(object):\n    \"\"\"\n    Mix-in class to handle transition check.\n    \"\"\"\n    __slots__ = ()\n    _transition_state = 'state'\n\n    @classmethod\n    def __setup__(cls):\n        super(Workflow, cls).__setup__()\n        cls._transitions = set()\n\n    @staticmethod\n    def transition(state):\n        def check_transition(func):\n            @wraps(func)\n            def wrapper(cls, records, *args, **kwargs):\n                filtered = []\n                to_update = OrderedDict()\n\n                assert len(records) == len(set(records)), \"Duplicate records\"\n\n                for record in records:\n                    current_state = getattr(record, cls._transition_state)\n                    transition = (current_state, state)\n                    if transition in cls._transitions:\n                        filtered.append(record)\n                        if current_state != state:\n                            to_update[record] = current_state\n\n                result = func(cls, filtered, *args, **kwargs)\n                if to_update:\n                    for record in list(to_update.keys()):\n                        current_state = getattr(record, cls._transition_state)\n                        if current_state != to_update[record]:\n                            del to_update[record]\n                    cls.write(list(to_update), {\n                            cls._transition_state: state,\n                            })\n                return result\n            return wrapper\n        return check_transition\n\n    @classmethod\n    def copy(cls, records, default=None):\n        if default is None:\n            default = {}\n        else:\n            default = default.copy()\n        default.setdefault(\n            cls._transition_state, cls._defaults[cls._transition_state]())\n        return super().copy(records, default=default)\n"
  },
  {
    "path": "trytond/modules/__init__.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport configparser\nimport importlib\nimport itertools\nimport logging\nimport os\nimport sys\nfrom collections import defaultdict\nfrom glob import iglob\nfrom importlib.machinery import SOURCE_SUFFIXES, FileFinder, SourceFileLoader\n\nfrom sql import Table\nfrom sql.functions import CurrentTimestamp\n\nimport trytond.convert as convert\nimport trytond.tools as tools\nfrom trytond.config import config\nfrom trytond.exceptions import MissingDependenciesException\nfrom trytond.transaction import Transaction\n\nlogger = logging.getLogger(__name__)\n\nir_module = Table('ir_module')\nir_model_data = Table('ir_model_data')\n\nOPJ = os.path.join\nMODULES_PATH = os.path.abspath(os.path.dirname(__file__))\n\nMODULES = []\n\nEGG_MODULES = {}\n\n\ndef update_egg_modules():\n    global EGG_MODULES\n    try:\n        import pkg_resources\n        for ep in pkg_resources.iter_entry_points('trytond.modules'):\n            EGG_MODULES[ep.name] = ep\n    except ImportError:\n        pass\n\n\nupdate_egg_modules()\n\n\ndef import_module(name, fullname=None):\n    if fullname is None:\n        fullname = 'trytond.modules.' + name\n    try:\n        module = importlib.import_module(fullname)\n    except ImportError:\n        if name not in EGG_MODULES:\n            raise\n        ep = EGG_MODULES[name]\n        # Can not use ep.load because modules are declared in an importable\n        # path and it can not import submodule.\n        path = os.path.join(\n            ep.dist.location, *ep.module_name.split('.')[:-1])\n        if not os.path.isdir(path):\n            # Find module in path\n            for path in sys.path:\n                path = os.path.join(\n                    path, *ep.module_name.split('.')[:-1])\n                if os.path.isdir(os.path.join(path, name)):\n                    break\n            else:\n                # When testing modules from setuptools location is the\n                # module directory\n                path = os.path.dirname(ep.dist.location)\n        spec = FileFinder(\n            path, (SourceFileLoader, SOURCE_SUFFIXES)\n            ).find_spec(fullname)\n        if spec.loader:\n            module = spec.loader.load_module()\n        else:\n            raise\n    return module\n\n\ndef get_module_info(name):\n    \"Return the content of the tryton.cfg\"\n    module_config = configparser.ConfigParser()\n    with tools.file_open(os.path.join(name, 'tryton.cfg')) as fp:\n        module_config.read_file(fp)\n        directory = os.path.dirname(fp.name)\n    info = dict(module_config.items('tryton'))\n    info['directory'] = directory\n    for key in ('depends', 'extras_depend', 'xml'):\n        if key in info:\n            info[key] = info[key].strip().splitlines()\n    return info\n\n\nclass Graph(dict):\n    def get(self, name):\n        if name in self:\n            node = self[name]\n        else:\n            node = self[name] = Node(name)\n        return node\n\n    def add(self, name, deps):\n        node = self.get(name)\n        for dep in deps:\n            self.get(dep).append(node)\n        return node\n\n    def __iter__(self):\n        for node in sorted(self.values(), key=lambda n: (n.depth, n.name)):\n            yield node\n\n\nclass Node(list):\n    def __init__(self, name):\n        super(Node, self).__init__()\n        self.name = name\n        self.info = None\n        self.__depth = 0\n\n    def __repr__(self):\n        return str((self.name, self.depth, tuple(self)))\n\n    @property\n    def depth(self):\n        return self.__depth\n\n    @depth.setter\n    def depth(self, value):\n        if value > self.__depth:\n            self.__depth = value\n            for child in self:\n                child.depth = value + 1\n\n    def append(self, node):\n        assert isinstance(node, Node)\n        node.depth = self.depth + 1\n        super(Node, self).append(node)\n\n\ndef create_graph(module_list):\n    module_list = set(module_list)\n    all_deps = set()\n    graph = Graph()\n    for module in module_list:\n        info = get_module_info(module)\n        deps = info.get('depends', []) + [\n            d for d in info.get('extras_depend', []) if d in module_list]\n        node = graph.add(module, deps)\n        assert node.info is None\n        node.info = info\n        all_deps.update(deps)\n\n    missing = all_deps - module_list\n    if missing:\n        raise MissingDependenciesException(list(missing))\n    return graph\n\n\ndef is_module_to_install(module, update):\n    if module in update:\n        return True\n    return False\n\n\ndef load_translations(pool, node, languages):\n    module = node.name\n    localedir = '%s/%s' % (node.info['directory'], 'locale')\n    lang2filenames = defaultdict(list)\n    for filename in itertools.chain(\n            iglob('%s/*.po' % localedir),\n            iglob('%s/override/*.po' % localedir)):\n        filename = filename.replace('/', os.sep)\n        lang = os.path.splitext(os.path.basename(filename))[0]\n        if lang not in languages:\n            continue\n        lang2filenames[lang].append(filename)\n    base_path_position = len(node.info['directory']) + 1\n    for language, files in lang2filenames.items():\n        filenames = [f[base_path_position:] for f in files]\n        logger.info('%s:loading %s', module, ','.join(filenames))\n        Translation = pool.get('ir.translation')\n        Translation.translation_import(language, module, files)\n\n\ndef load_module_graph(graph, pool, update=None, lang=None):\n    # Prevent to import backend when importing module\n    from trytond.cache import Cache\n    from trytond.ir.lang import get_parent_language\n\n    if lang is None:\n        lang = [config.get('database', 'language')]\n    if update is None:\n        update = []\n    modules_todo = []\n    models_to_update_history = set()\n    models_with_indexes = set()\n\n    # Load also parent languages\n    lang = set(lang)\n    for code in list(lang):\n        while code:\n            lang.add(code)\n            code = get_parent_language(code)\n\n    transaction = Transaction()\n    with transaction.connection.cursor() as cursor:\n        modules = [x.name for x in graph]\n        module2state = dict()\n        for sub_modules in tools.grouped_slice(modules):\n            cursor.execute(*ir_module.select(ir_module.name, ir_module.state,\n                    where=ir_module.name.in_(list(sub_modules))))\n            module2state.update(cursor)\n        modules = set(modules)\n\n        for node in graph:\n            module = node.name\n            if module not in MODULES:\n                continue\n            logger.info(module)\n            classes = pool.fill(module, modules)\n            if update:\n                pool.setup(classes)\n            package_state = module2state.get(module, 'not activated')\n            if (is_module_to_install(module, update)\n                    or (update\n                        and package_state in ('to activate', 'to upgrade'))):\n                if package_state not in ('to activate', 'to upgrade'):\n                    if package_state == 'activated':\n                        package_state = 'to upgrade'\n                    elif package_state != 'to remove':\n                        package_state = 'to activate'\n                for child in node:\n                    module2state[child.name] = package_state\n                for type in list(classes.keys()):\n                    for cls in classes[type]:\n                        logger.info('%s:register %s', module, cls.__name__)\n                        cls.__register__(module)\n                for model in classes['model']:\n                    if hasattr(model, '_history'):\n                        models_to_update_history.add(model.__name__)\n                    if hasattr(model, '_update_sql_indexes'):\n                        models_with_indexes.add(model.__name__)\n\n                # Instanciate a new parser for the module\n                tryton_parser = convert.TrytondXmlHandler(\n                    pool, module, package_state, modules, lang)\n\n                for filename in node.info.get('xml', []):\n                    filename = filename.replace('/', os.sep)\n                    logger.info('%s:loading %s', module, filename)\n                    # Feed the parser with xml content:\n                    with tools.file_open(OPJ(module, filename), 'rb') as fp:\n                        tryton_parser.parse_xmlstream(fp)\n\n                modules_todo.append((module, list(tryton_parser.to_delete)))\n\n                load_translations(pool, node, lang)\n\n                if package_state == 'to remove':\n                    continue\n                cursor.execute(*ir_module.select(ir_module.id,\n                        where=(ir_module.name == module)))\n                try:\n                    module_id, = cursor.fetchone()\n                    cursor.execute(*ir_module.update([ir_module.state],\n                            ['activated'], where=(ir_module.id == module_id)))\n                except TypeError:\n                    cursor.execute(*ir_module.insert(\n                            [ir_module.create_uid, ir_module.create_date,\n                                ir_module.name, ir_module.state],\n                            [[0, CurrentTimestamp(), module, 'activated'],\n                                ]))\n                module2state[module] = 'activated'\n\n            # Avoid clearing cache to prevent dead lock on ir.cache table\n            Cache.rollback(transaction)\n            transaction.commit()\n            # Clear transaction cache to update default_factory\n            transaction.cache.clear()\n\n        if not update:\n            pool.setup()\n        else:\n            # Remove unknown models and fields\n            Model = pool.get('ir.model')\n            Model.clean()\n            ModelField = pool.get('ir.model.field')\n            ModelField.clean()\n            transaction.commit()\n\n        pool.setup_mixin()\n\n        if update:\n            for model_name in models_with_indexes:\n                model = pool.get(model_name)\n                if model._sql_indexes:\n                    logger.info('index:create %s', model_name)\n                    model._update_sql_indexes()\n            transaction.commit()\n            for model_name in models_to_update_history:\n                model = pool.get(model_name)\n                if model._history:\n                    logger.info('history:update %s', model.__name__)\n                    model._update_history_table()\n            transaction.commit()\n\n        # Vacuum :\n        while modules_todo:\n            (module, to_delete) = modules_todo.pop()\n            convert.post_import(pool, module, to_delete)\n\n        if update:\n            # Ensure cache is clear for other instances\n            Cache.clear_all()\n            Cache.refresh_pool(transaction)\n    logger.info('all modules loaded')\n\n\ndef get_module_list():\n    module_list = set()\n    if os.path.exists(MODULES_PATH) and os.path.isdir(MODULES_PATH):\n        for file in os.listdir(MODULES_PATH):\n            if file.startswith('.'):\n                continue\n            if file == '__pycache__':\n                continue\n            if os.path.isdir(OPJ(MODULES_PATH, file)):\n                module_list.add(file)\n    update_egg_modules()\n    module_list.update(EGG_MODULES.keys())\n    module_list.add('ir')\n    module_list.add('res')\n    module_list.add('tests')\n    return list(module_list)\n\n\ndef register_classes():\n    '''\n    Import modules to register the classes in the Pool\n    '''\n    import trytond.ir\n    trytond.ir.register()\n    import trytond.res\n    trytond.res.register()\n    import trytond.tests\n    trytond.tests.register()\n\n    for node in create_graph(get_module_list()):\n        module = node.name\n        logger.info('%s:registering classes', module)\n\n        if module in ('ir', 'res', 'tests'):\n            MODULES.append(module)\n            continue\n\n        the_module = import_module(module)\n        # Some modules register nothing in the Pool\n        if hasattr(the_module, 'register'):\n            the_module.register()\n        MODULES.append(module)\n\n\ndef load_modules(\n        database_name, pool, update=None, lang=None, activatedeps=False):\n    # Do not import backend when importing module\n    from trytond import backend\n    res = True\n    if update:\n        update = update[:]\n    else:\n        update = []\n\n    def _load_modules(update):\n        global res\n        transaction = Transaction()\n\n        with transaction.set_context(_no_trigger=True), \\\n                transaction.connection.cursor() as cursor:\n            # Migration from 3.6: remove double module\n            old_table = 'ir_module_module'\n            new_table = 'ir_module'\n            if backend.TableHandler.table_exist(old_table):\n                backend.TableHandler.table_rename(old_table, new_table)\n\n            # Migration from 4.0: rename installed to activated\n            cursor.execute(*ir_module.select(ir_module.name,\n                    where=ir_module.state.in_(('installed', 'uninstalled'))))\n            if cursor.fetchone():\n                cursor.execute(*ir_module.update(\n                        [ir_module.state], ['activated'],\n                        where=ir_module.state == 'installed'))\n                cursor.execute(*ir_module.update(\n                        [ir_module.state], ['not activated'],\n                        where=ir_module.state == 'uninstalled'))\n\n            if update:\n                cursor.execute(*ir_module.select(ir_module.name,\n                        where=ir_module.state.in_(('activated', 'to activate',\n                                'to upgrade', 'to remove'))))\n            else:\n                cursor.execute(*ir_module.select(ir_module.name,\n                        where=ir_module.state.in_(('activated', 'to upgrade',\n                                'to remove'))))\n            module_list = [name for (name,) in cursor]\n            graph = None\n            while graph is None:\n                module_list += update\n                try:\n                    graph = create_graph(module_list)\n                except MissingDependenciesException as e:\n                    if not activatedeps:\n                        raise\n                    update += e.missings\n\n            load_module_graph(graph, pool, update, lang)\n\n            Configuration = pool.get('ir.configuration')\n            Configuration(1).check()\n\n            if update:\n                cursor.execute(*ir_module.select(ir_module.name,\n                        where=(ir_module.state == 'to remove')))\n                for mod_name, in cursor:\n                    res = False\n                    # TODO check if ressource not updated by the user\n                    with transaction.connection.cursor() as cursor_delete:\n                        cursor_delete.execute(*ir_model_data.select(\n                                ir_model_data.model, ir_model_data.db_id,\n                                where=(ir_model_data.module == mod_name),\n                                order_by=ir_model_data.id.desc))\n                        for rmod, rid in cursor_delete:\n                            Model = pool.get(rmod)\n                            Model.delete([Model(rid)])\n                    transaction.connection.commit()\n                cursor.execute(*ir_module.update([ir_module.state],\n                        ['not activated'],\n                        where=(ir_module.state == 'to remove')))\n                transaction.connection.commit()\n\n                Module = pool.get('ir.module')\n                Module.update_list()\n        # Need to commit to unlock SQLite database\n        transaction.commit()\n\n    if not Transaction().connection:\n        with Transaction().start(database_name, 0):\n            _load_modules(update)\n    else:\n        with Transaction().new_transaction(), \\\n                Transaction().set_user(0), \\\n                Transaction().reset_context():\n            _load_modules(update)\n\n    return res\n"
  },
  {
    "path": "trytond/pool.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport builtins\nimport logging\nfrom collections import OrderedDict, defaultdict\nfrom threading import RLock\n\nfrom trytond.modules import load_modules, register_classes\nfrom trytond.transaction import Transaction\n\n__all__ = ['Pool', 'PoolMeta', 'PoolBase', 'isregisteredby']\n\nlogger = logging.getLogger(__name__)\n\n\nclass PoolMeta(type):\n\n    def __new__(cls, name, bases, dct):\n        if '__slots__' not in dct and not dct.get('__no_slots__'):\n            dct['__slots__'] = ()\n        new = type.__new__(cls, name, bases, dct)\n        if '__name__' in dct:\n            try:\n                new.__name__ = dct['__name__']\n            except TypeError:\n                new.__name__ = dct['__name__'].encode('utf-8')\n        return new\n\n\nclass PoolBase(object, metaclass=PoolMeta):\n    @classmethod\n    def __setup__(cls):\n        pass\n\n    @classmethod\n    def __post_setup__(cls):\n        pass\n\n    @classmethod\n    def __register__(cls, module_name):\n        pass\n\n\nclass Pool(object):\n\n    classes = {\n        'model': defaultdict(OrderedDict),\n        'wizard': defaultdict(OrderedDict),\n        'report': defaultdict(OrderedDict),\n    }\n    classes_mixin = defaultdict(list)\n    _started = False\n    _lock = RLock()\n    _locks = {}\n    _pool = {}\n    test = False\n    _instances = {}\n    _modules = None\n\n    def __new__(cls, database_name=None):\n        if database_name is None:\n            database_name = Transaction().database.name\n        result = cls._instances.get(database_name)\n        if result:\n            return result\n        lock = cls._locks.get(database_name)\n        if not lock:\n            with cls._lock:\n                lock = cls._locks.setdefault(database_name, RLock())\n        with lock:\n            return cls._instances.setdefault(database_name,\n                super(Pool, cls).__new__(cls))\n\n    def __init__(self, database_name=None):\n        if database_name is None:\n            database_name = Transaction().database.name\n        self.database_name = database_name\n\n    @staticmethod\n    def register(*classes, **kwargs):\n        '''\n        Register a list of classes\n        '''\n        module = kwargs['module']\n        type_ = kwargs['type_']\n        depends = set(kwargs.get('depends', []))\n        assert type_ in ('model', 'report', 'wizard')\n        for cls in classes:\n            mpool = Pool.classes[type_][module]\n            assert cls not in mpool, cls\n            assert issubclass(cls.__class__, PoolMeta), cls\n            mpool[cls] = depends\n\n    @staticmethod\n    def register_mixin(mixin, classinfo, module):\n        Pool.classes_mixin[module].append((classinfo, mixin))\n\n    @classmethod\n    def start(cls):\n        '''\n        Start/restart the Pool\n        '''\n        with cls._lock:\n            for classes in Pool.classes.values():\n                classes.clear()\n            register_classes()\n            cls._started = True\n\n    @classmethod\n    def stop(cls, database_name):\n        '''\n        Stop the Pool\n        '''\n        with cls._lock:\n            if database_name in cls._instances:\n                del cls._instances[database_name]\n            lock = cls._locks.get(database_name)\n            if not lock:\n                return\n            with lock:\n                if database_name in cls._pool:\n                    del cls._pool[database_name]\n\n    @classmethod\n    def database_list(cls):\n        '''\n        :return: database list\n        '''\n        with cls._lock:\n            databases = []\n            for database in cls._pool.keys():\n                if cls._locks.get(database):\n                    if cls._locks[database].acquire(False):\n                        databases.append(database)\n                        cls._locks[database].release()\n            return databases\n\n    @property\n    def lock(self):\n        '''\n        Return the database lock for the pool.\n        '''\n        return self._locks[self.database_name]\n\n    def init(self, update=None, lang=None, activatedeps=False):\n        '''\n        Init pool\n        Set update to proceed to update\n        lang is a list of language code to be updated\n        '''\n        with self._lock:\n            if not self._started:\n                self.start()\n        with self._locks[self.database_name]:\n            # Don't reset pool if already init and not to update\n            if not update and self._pool.get(self.database_name):\n                return\n            logger.info('init pool for \"%s\"', self.database_name)\n            self._pool.setdefault(self.database_name, {})\n            self._modules = []\n            # Clean the _pool before loading modules\n            for type in self.classes.keys():\n                self._pool[self.database_name][type] = {}\n            try:\n                restart = not load_modules(\n                    self.database_name, self, update=update, lang=lang,\n                    activatedeps=activatedeps)\n            except Exception:\n                del self._pool[self.database_name]\n                self._modules = None\n                raise\n            if restart:\n                self.init()\n\n    def get(self, name, type='model'):\n        '''\n        Get an object from the pool\n\n        :param name: the object name\n        :param type: the type\n        :return: the instance\n        '''\n        if type == '*':\n            for type in self.classes.keys():\n                if name in self._pool[self.database_name][type]:\n                    break\n        try:\n            return self._pool[self.database_name][type][name]\n        except KeyError:\n            if type == 'report':\n                from trytond.report import Report\n\n                # Keyword argument 'type' conflicts with builtin function\n                cls = builtins.type(name, (Report,), {'__slots__': ()})\n                cls.__setup__()\n                cls.__post_setup__()\n                self.add(cls, type)\n                self.setup_mixin(type='report', name=name)\n                return self.get(name, type=type)\n            raise\n\n    def add(self, cls, type='model'):\n        '''\n        Add a classe to the pool\n        '''\n        with self._locks[self.database_name]:\n            self._pool[self.database_name][type][cls.__name__] = cls\n\n    def iterobject(self, type='model'):\n        '''\n        Return an iterator over object name, object\n\n        :param type: the type\n        :return: an iterator\n        '''\n        return self._pool[self.database_name][type].items()\n\n    def fill(self, module, modules):\n        '''\n        Fill the pool with the registered class from the module for the\n        activated modules.\n        Return a list of classes for each type in a dictionary.\n        '''\n        classes = {}\n        for type_ in self.classes.keys():\n            classes[type_] = []\n            for cls, depends in self.classes[type_].get(module, {}).items():\n                if not depends.issubset(modules):\n                    continue\n                try:\n                    previous_cls = self.get(cls.__name__, type=type_)\n                    cls = type(\n                        cls.__name__, (cls, previous_cls), {'__slots__': ()})\n                except KeyError:\n                    pass\n                assert issubclass(cls, PoolBase), cls\n                self.add(cls, type=type_)\n                classes[type_].append(cls)\n        self._modules.append(module)\n        return classes\n\n    def setup(self, classes=None):\n        logger.info('setup pool for \"%s\"', self.database_name)\n        if classes is None:\n            classes = {}\n            for type_ in self._pool[self.database_name]:\n                classes[type_] = list(\n                    self._pool[self.database_name][type_].values())\n        for type_, lst in classes.items():\n            for cls in lst:\n                cls.__setup__()\n            for cls in lst:\n                cls.__post_setup__()\n\n    def setup_mixin(self, type=None, name=None):\n        logger.info('setup mixin for \"%s\"', self.database_name)\n        if type is not None:\n            types = [type]\n        else:\n            types = self.classes.keys()\n        for module in self._modules:\n            if module not in self.classes_mixin:\n                continue\n            for type_ in types:\n                for kname, cls in self.iterobject(type=type_):\n                    if name is not None and kname != name:\n                        continue\n                    for parent, mixin in self.classes_mixin[module]:\n                        if (not issubclass(cls, parent)\n                                or issubclass(cls, mixin)):\n                            continue\n                        cls = builtins.type(\n                            cls.__name__, (mixin, cls), {'__slots__': ()})\n                        self.add(cls, type=type_)\n\n    def refresh(self, modules):\n        if self._modules is not None and set(self._modules) != modules:\n            self.stop(self.database_name)\n\n\ndef isregisteredby(obj, module, type_='model'):\n    pool = Pool()\n    classes = pool.classes[type_]\n    return any(issubclass(obj, cls) for cls in classes[module])\n"
  },
  {
    "path": "trytond/protocols/__init__.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n"
  },
  {
    "path": "trytond/protocols/dispatcher.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport logging\nimport pydoc\nimport time\n\ntry:\n    from http import HTTPStatus\nexcept ImportError:\n    from http import client as HTTPStatus\n\nfrom sql import Table\nfrom werkzeug.exceptions import abort\nfrom werkzeug.wrappers import Response\n\nfrom trytond import __version__, backend, security\nfrom trytond.config import config, get_hostname\nfrom trytond.exceptions import (\n    ConcurrencyException, LoginException, RateLimitException, UserError,\n    UserWarning)\nfrom trytond.tools import is_instance_method\nfrom trytond.transaction import Transaction\nfrom trytond.worker import run_task\nfrom trytond.wsgi import app\n\nfrom .wrappers import with_pool\n\n__all__ = ['register_authentication_service']\n\nlogger = logging.getLogger(__name__)\n\nir_configuration = Table('ir_configuration')\nir_lang = Table('ir_lang')\nir_module = Table('ir_module')\nres_user = Table('res_user')\n_MAX_LENGTH = 80\n\n\n@app.route('/<string:database_name>/', methods=['POST'])\ndef rpc(request, database_name):\n    methods = {\n        'common.db.login': login,\n        'common.db.logout': logout,\n        'system.listMethods': list_method,\n        'system.methodHelp': help_method,\n        'system.methodSignature': lambda *a: 'signatures not supported',\n        }\n    return methods.get(request.rpc_method, _dispatch)(\n        request, database_name, *request.rpc_params)\n\n\ndef login(request, database_name, user, parameters, language=None):\n    context = {\n        'language': language,\n        '_request': request.context,\n        }\n    try:\n        session = security.login(\n            database_name, user, parameters, context=context)\n        code = HTTPStatus.UNAUTHORIZED\n    except backend.DatabaseOperationalError:\n        logger.error('fail to connect to %s', database_name, exc_info=True)\n        abort(HTTPStatus.NOT_FOUND)\n    except RateLimitException:\n        session = None\n        code = HTTPStatus.TOO_MANY_REQUESTS\n    if not session:\n        abort(code)\n    return session\n\n\n@app.auth_required\ndef logout(request, database_name):\n    auth = request.authorization\n    security.logout(\n        database_name, auth.get('userid'), auth.get('session'),\n        context={'_request': request.context})\n\n\n@app.route('/', methods=['POST'])\ndef root(request, *args):\n    methods = {\n        'common.server.version': lambda *a: __version__,\n        'common.db.list': db_list,\n        'common.authentication.services': authentication_services,\n        }\n    return methods[request.rpc_method](request, *request.rpc_params)\n\n\n@app.route('/', methods=['OPTIONS'])\n@app.route('/<path:path>', methods=['OPTIONS'])\ndef options(request, path=None):\n    return Response(status=HTTPStatus.NO_CONTENT)\n\n\ndef db_exist(request, database_name):\n    try:\n        backend.Database(database_name).connect()\n        return True\n    except Exception:\n        return False\n\n\ndef db_list(request, *args):\n    if not config.getboolean('database', 'list'):\n        abort(HTTPStatus.FORBIDDEN)\n    context = {'_request': request.context}\n    hostname = get_hostname(request.host)\n    with Transaction().start(\n            None, 0, context=context, readonly=True, close=True,\n            ) as transaction:\n        return transaction.database.list(hostname=hostname)\n\n\ndef authentication_services(request):\n    return _AUTHENTICATION_SERVICES\n\n\ndef register_authentication_service(name, url):\n    _AUTHENTICATION_SERVICES.append((name, url))\n\n\n_AUTHENTICATION_SERVICES = []\n\n\n@app.auth_required\n@with_pool\ndef list_method(request, pool):\n    methods = []\n    for type in ('model', 'wizard', 'report'):\n        for object_name, obj in pool.iterobject(type=type):\n            for method in obj.__rpc__:\n                methods.append(type + '.' + object_name + '.' + method)\n    return methods\n\n\ndef get_object_method(request, pool):\n    method = request.rpc_method\n    type, _ = method.split('.', 1)\n    name = '.'.join(method.split('.')[1:-1])\n    method = method.split('.')[-1]\n    return pool.get(name, type=type), method\n\n\n@app.auth_required\n@with_pool\ndef help_method(request, pool):\n    obj, method = get_object_method(request, pool)\n    return pydoc.getdoc(getattr(obj, method))\n\n\ndef _safe_repr(args, kwargs, short=False):\n    args = args + tuple('%s=%r' % (k, v) for k, v in kwargs.items())\n    result = repr(args)\n    if not short or len(result) < _MAX_LENGTH:\n        return result\n    return result[:_MAX_LENGTH] + ' [truncated]...)'\n\n\n@app.auth_required\n@with_pool\ndef _dispatch(request, pool, *args, **kwargs):\n    obj, method = get_object_method(request, pool)\n    if method in obj.__rpc__:\n        rpc = obj.__rpc__[method]\n    else:\n        abort(HTTPStatus.FORBIDDEN)\n\n    user = request.user_id\n    session = None\n    if request.authorization.type == 'session':\n        session = request.authorization.get('session')\n\n    if rpc.fresh_session and session:\n        context = {'_request': request.context}\n        if not security.check_timeout(\n                pool.database_name, user, session, context=context):\n            abort(HTTPStatus.UNAUTHORIZED)\n\n    log_message = '%s.%s%s from %s@%s%s in %i ms'\n    username = request.authorization.username\n    if isinstance(username, bytes):\n        username = username.decode('utf-8')\n    log_args = (\n        obj.__name__, method,\n        _safe_repr(args, kwargs, not logger.isEnabledFor(logging.DEBUG)),\n        username, request.remote_addr, request.path)\n\n    def duration():\n        return (time.monotonic() - started) * 1000\n    started = time.monotonic()\n\n    retry = config.getint('database', 'retry')\n    for count in range(retry, -1, -1):\n        if count != retry:\n            time.sleep(0.02 * (retry - count))\n        with Transaction().start(pool.database_name, user,\n                readonly=rpc.readonly) as transaction:\n            try:\n                c_args, c_kwargs, transaction.context, transaction.timestamp \\\n                    = rpc.convert(obj, *args, **kwargs)\n                transaction.context['_request'] = request.context\n                meth = getattr(obj, method)\n                if (rpc.instantiate is None\n                        or not is_instance_method(obj, method)):\n                    result = rpc.result(meth(*c_args, **c_kwargs))\n                else:\n                    assert rpc.instantiate == 0\n                    inst = c_args.pop(0)\n                    if hasattr(inst, method):\n                        result = rpc.result(meth(inst, *c_args, **c_kwargs))\n                    else:\n                        result = [rpc.result(meth(i, *c_args, **c_kwargs))\n                            for i in inst]\n            except backend.DatabaseOperationalError:\n                if count and not rpc.readonly:\n                    transaction.rollback()\n                    logger.debug(\"Retry: %i\", retry - count + 1)\n                    continue\n                logger.exception(log_message, *log_args, duration())\n                raise\n            except (ConcurrencyException, UserError, UserWarning,\n                    LoginException):\n                logger.info(\n                    log_message, *log_args, duration(),\n                    exc_info=logger.isEnabledFor(logging.DEBUG))\n                raise\n            except Exception:\n                logger.exception(log_message, *log_args, duration())\n                raise\n            # Need to commit to unlock SQLite database\n            transaction.commit()\n        while transaction.tasks:\n            task_id = transaction.tasks.pop()\n            run_task(pool, task_id)\n        if session:\n            context = {'_request': request.context}\n            security.reset(pool.database_name, session, context=context)\n        logger.info(log_message, *log_args, duration())\n        logger.debug('Result: %r', result)\n        response = app.make_response(request, result)\n        if rpc.readonly and rpc.cache:\n            response.headers.extend(rpc.cache.headers())\n        return response\n"
  },
  {
    "path": "trytond/protocols/jsonrpc.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport base64\nimport datetime\nimport json\nfrom decimal import Decimal\n\nfrom werkzeug.exceptions import (\n    BadRequest, Conflict, Forbidden, InternalServerError, Locked,\n    TooManyRequests)\nfrom werkzeug.wrappers import Response\n\nfrom trytond.exceptions import (\n    ConcurrencyException, LoginException, MissingDependenciesException,\n    RateLimitException, TrytonException, UserWarning)\nfrom trytond.protocols.wrappers import Request\nfrom trytond.tools import cached_property\n\n\nclass JSONDecoder(object):\n\n    decoders = {}\n\n    @classmethod\n    def register(cls, klass, decoder):\n        assert klass not in cls.decoders\n        cls.decoders[klass] = decoder\n\n    def __call__(self, dct):\n        if dct.get('__class__') in self.decoders:\n            return self.decoders[dct['__class__']](dct)\n        return dct\n\n\nJSONDecoder.register('datetime',\n    lambda dct: datetime.datetime(dct['year'], dct['month'], dct['day'],\n        dct['hour'], dct['minute'], dct['second'], dct['microsecond']))\nJSONDecoder.register('date',\n    lambda dct: datetime.date(dct['year'], dct['month'], dct['day']))\nJSONDecoder.register('time',\n    lambda dct: datetime.time(dct['hour'], dct['minute'], dct['second'],\n        dct['microsecond']))\nJSONDecoder.register('timedelta',\n    lambda dct: datetime.timedelta(seconds=dct['seconds']))\n\n\ndef _bytes_decoder(dct):\n    cast = bytearray if bytes == str else bytes\n    return cast(base64.decodebytes(dct['base64'].encode('utf-8')))\n\n\nJSONDecoder.register('bytes', _bytes_decoder)\nJSONDecoder.register('Decimal', lambda dct: Decimal(dct['decimal']))\n\n\nclass JSONEncoder(json.JSONEncoder):\n\n    serializers = {}\n\n    @classmethod\n    def register(cls, klass, encoder):\n        assert klass not in cls.serializers\n        cls.serializers[klass] = encoder\n\n    def default(self, obj):\n        marshaller = self.serializers.get(type(obj),\n            super(JSONEncoder, self).default)\n        return marshaller(obj)\n\n\nJSONEncoder.register(datetime.datetime,\n    lambda o: {\n        '__class__': 'datetime',\n        'year': o.year,\n        'month': o.month,\n        'day': o.day,\n        'hour': o.hour,\n        'minute': o.minute,\n        'second': o.second,\n        'microsecond': o.microsecond,\n        })\nJSONEncoder.register(datetime.date,\n    lambda o: {\n        '__class__': 'date',\n        'year': o.year,\n        'month': o.month,\n        'day': o.day,\n        })\nJSONEncoder.register(datetime.time,\n    lambda o: {\n        '__class__': 'time',\n        'hour': o.hour,\n        'minute': o.minute,\n        'second': o.second,\n        'microsecond': o.microsecond,\n        })\nJSONEncoder.register(datetime.timedelta,\n    lambda o: {\n        '__class__': 'timedelta',\n        'seconds': o.total_seconds(),\n        })\n\n\ndef _bytes_encoder(o):\n    return {\n        '__class__': 'bytes',\n        'base64': base64.encodebytes(o).decode('utf-8'),\n        }\n\n\nJSONEncoder.register(bytes, _bytes_encoder)\nJSONEncoder.register(bytearray, _bytes_encoder)\nJSONEncoder.register(Decimal,\n    lambda o: {\n        '__class__': 'Decimal',\n        'decimal': str(o),\n        })\n\n\nclass JSONRequest(Request):\n    parsed_content_type = 'json'\n\n    @cached_property\n    def parsed_data(self):\n        if self.parsed_content_type in self.environ.get('CONTENT_TYPE', ''):\n            try:\n                return json.loads(\n                    self.decoded_data.decode(\n                        self.charset, self.encoding_errors),\n                    object_hook=JSONDecoder())\n            except Exception:\n                raise BadRequest('Unable to read JSON request')\n        else:\n            raise BadRequest('Not a JSON request')\n\n    @cached_property\n    def rpc_method(self):\n        try:\n            return self.parsed_data['method']\n        except Exception:\n            pass\n\n    @cached_property\n    def rpc_params(self):\n        try:\n            return self.parsed_data['params']\n        except Exception:\n            pass\n\n\nclass JSONProtocol:\n    content_type = 'json'\n\n    @classmethod\n    def request(cls, environ):\n        return JSONRequest(environ)\n\n    @classmethod\n    def response(cls, data, request):\n        try:\n            parsed_data = request.parsed_data\n        except BadRequest:\n            parsed_data = {}\n        if (isinstance(request, JSONRequest)\n                and set(parsed_data.keys()) == {'id', 'method', 'params'}):\n            response = {'id': parsed_data.get('id', 0)}\n            if isinstance(data, TrytonException):\n                response['error'] = data.args\n            elif isinstance(data, Exception):\n                # report exception back to server\n                response['error'] = (str(data), data.__format_traceback__)\n            else:\n                response['result'] = data\n        else:\n            if isinstance(data, UserWarning):\n                return Conflict(data)\n            elif isinstance(data, LoginException):\n                return Forbidden(data)\n            elif isinstance(data, ConcurrencyException):\n                return Locked(data)\n            elif isinstance(data, RateLimitException):\n                return TooManyRequests(data)\n            elif isinstance(data, MissingDependenciesException):\n                return InternalServerError(data)\n            elif isinstance(data, TrytonException):\n                return BadRequest(data)\n            elif isinstance(data, Exception):\n                return InternalServerError(data)\n            response = data\n        return Response(json.dumps(\n                response, cls=JSONEncoder, separators=(',', ':')),\n            content_type='application/json')\n"
  },
  {
    "path": "trytond/protocols/wrappers.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport base64\nimport gzip\nimport logging\nimport time\nfrom functools import wraps\nfrom io import BytesIO\n\ntry:\n    from http import HTTPStatus\nexcept ImportError:\n    from http import client as HTTPStatus\n\nfrom werkzeug.datastructures import Authorization\nfrom werkzeug.exceptions import HTTPException, abort\nfrom werkzeug.wrappers import Request as _Request\nfrom werkzeug.wrappers import Response\n\nfrom trytond import backend, security\nfrom trytond.config import config\nfrom trytond.exceptions import RateLimitException, UserError, UserWarning\nfrom trytond.pool import Pool\nfrom trytond.tools import cached_property\nfrom trytond.transaction import Transaction\n\nlogger = logging.getLogger(__name__)\n\n\nclass Request(_Request):\n\n    view_args = None\n\n    def __repr__(self):\n        args = []\n        try:\n            if self.url is None or isinstance(self.url, str):\n                url = self.url\n            else:\n                url = self.url.decode(self.url_charset)\n            auth = self.authorization\n            if auth:\n                args.append(\"%s@%s\" % (\n                        auth.get('userid', auth.username), self.remote_addr))\n            else:\n                args.append(self.remote_addr)\n            args.append(\"'%s'\" % url)\n            args.append(\"[%s]\" % self.method)\n            args.append(\"%s\" % (self.rpc_method or ''))\n        except Exception:\n            args.append(\"(invalid WSGI environ)\")\n        return \"<%s %s>\" % (\n            self.__class__.__name__, \" \".join(filter(None, args)))\n\n    @property\n    def decoded_data(self):\n        if self.content_encoding == 'gzip':\n            zipfile = gzip.GzipFile(fileobj=BytesIO(self.data), mode='rb')\n            return zipfile.read()\n        else:\n            return self.data\n\n    @property\n    def parsed_data(self):\n        return self.data\n\n    @property\n    def rpc_method(self):\n        return\n\n    @property\n    def rpc_params(self):\n        return\n\n    @cached_property\n    def authorization(self):\n        authorization = super(Request, self).authorization\n        if authorization is None:\n            header = self.environ.get('HTTP_AUTHORIZATION')\n            return parse_authorization_header(header)\n        return authorization\n\n    @cached_property\n    def user_id(self):\n        if not self.view_args:\n            return None\n        database_name = self.view_args.get('database_name')\n        if not database_name:\n            return None\n        auth = self.authorization\n        if not auth:\n            return None\n        context = {'_request': self.context}\n        if auth.type == 'session':\n            user_id = security.check(\n                database_name, auth.get('userid'), auth.get('session'),\n                context=context)\n        else:\n            try:\n                user_id = security.login(\n                    database_name, auth.username, auth, cache=False,\n                    context=context)\n            except RateLimitException:\n                abort(HTTPStatus.TOO_MANY_REQUESTS)\n        return user_id\n\n    @cached_property\n    def context(self):\n        return {\n            'remote_addr': self.remote_addr,\n            'http_host': self.environ.get('HTTP_HOST'),\n            'scheme': self.scheme,\n            'is_secure': self.is_secure,\n            }\n\n\ndef parse_authorization_header(value):\n    if not value:\n        return\n    if not isinstance(value, bytes):\n        value = value.encode('latin1')\n    try:\n        auth_type, auth_info = value.split(None, 1)\n        auth_type = auth_type.lower()\n    except ValueError:\n        return\n    if auth_type == b'session':\n        try:\n            username, userid, session = base64.b64decode(auth_info).split(\n                b':', 3)\n            userid = int(userid)\n        except Exception:\n            return\n        return Authorization('session', {\n                'username': username.decode(\"latin1\"),\n                'userid': userid,\n                'session': session.decode(\"latin1\"),\n                })\n\n\ndef set_max_request_size(size):\n    def decorator(func):\n        func.max_request_size = size\n        return func\n    return decorator\n\n\ndef allow_null_origin(func):\n    func.allow_null_origin = True\n    return func\n\n\ndef with_pool(func):\n    @wraps(func)\n    def wrapper(request, database_name, *args, **kwargs):\n        database_list = Pool.database_list()\n        pool = Pool(database_name)\n        if database_name not in database_list:\n            with Transaction().start(database_name, 0, readonly=True):\n                pool.init()\n        try:\n            return func(request, pool, *args, **kwargs)\n        except HTTPException:\n            logger.debug('%s', request, exc_info=True)\n            raise\n        except (UserError, UserWarning) as e:\n            logger.debug('%s', request, exc_info=True)\n            if request.rpc_method:\n                raise\n            else:\n                abort(HTTPStatus.BAD_REQUEST, e)\n        except Exception as e:\n            logger.error('%s', request, exc_info=True)\n            if request.rpc_method:\n                raise\n            else:\n                abort(HTTPStatus.INTERNAL_SERVER_ERROR, e)\n    return wrapper\n\n\ndef with_transaction(readonly=None, user=0, context=None):\n    from trytond.worker import run_task\n\n    def decorator(func):\n        @wraps(func)\n        def wrapper(request, pool, *args, **kwargs):\n            nonlocal user, context\n            readonly_ = readonly  # can not modify non local\n            if readonly_ is None:\n                if request.method in {'POST', 'PUT', 'DELETE', 'PATCH'}:\n                    readonly_ = False\n                else:\n                    readonly_ = True\n            if context is None:\n                context = {}\n            else:\n                context = context.copy()\n            context['_request'] = request.context\n            if user == 'request':\n                user = request.user_id\n            retry = config.getint('database', 'retry')\n            for count in range(retry, -1, -1):\n                if count != retry:\n                    time.sleep(0.02 * (retry - count))\n                with Transaction().start(\n                        pool.database_name, user, readonly=readonly_,\n                        context=context) as transaction:\n                    try:\n                        result = func(request, pool, *args, **kwargs)\n                    except backend.DatabaseOperationalError:\n                        if count and not readonly_:\n                            transaction.rollback()\n                            continue\n                        raise\n                    # Need to commit to unlock SQLite database\n                    transaction.commit()\n                while transaction.tasks:\n                    task_id = transaction.tasks.pop()\n                    run_task(pool, task_id)\n                return result\n        return wrapper\n    return decorator\n\n\ndef user_application(name, json=True):\n    from .jsonrpc import JSONEncoder\n    from .jsonrpc import json as json_\n\n    def decorator(func):\n        @wraps(func)\n        def wrapper(request, *args, **kwargs):\n            pool = Pool()\n            UserApplication = pool.get('res.user.application')\n\n            authorization = request.headers['Authorization']\n            try:\n                auth_type, auth_info = authorization.split(None, 1)\n                auth_type = auth_type.lower()\n            except ValueError:\n                abort(HTTPStatus.UNAUTHORIZED)\n            if auth_type != 'bearer':\n                abort(HTTPStatus.FORBIDDEN)\n\n            application = UserApplication.check(auth_info, name)\n            if not application:\n                abort(HTTPStatus.FORBIDDEN)\n            transaction = Transaction()\n            # TODO language\n            with transaction.set_user(application.user.id), \\\n                    transaction.set_context(_check_access=True):\n                response = func(request, *args, **kwargs)\n            if not isinstance(response, Response) and json:\n                response = Response(json_.dumps(response, cls=JSONEncoder),\n                    content_type='application/json')\n            return response\n        return wrapper\n    return decorator\n"
  },
  {
    "path": "trytond/protocols/xmlrpc.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport logging\nimport xmlrpc.client as client\n# convert decimal to float before marshalling:\nfrom decimal import Decimal\n\nimport defusedxml.xmlrpc\nfrom werkzeug.exceptions import (\n    BadRequest, Conflict, Forbidden, InternalServerError, Locked,\n    TooManyRequests)\nfrom werkzeug.wrappers import Response\n\nfrom trytond.exceptions import (\n    ConcurrencyException, LoginException, MissingDependenciesException,\n    RateLimitException, TrytonException, UserWarning)\nfrom trytond.model.fields.dict import ImmutableDict\nfrom trytond.protocols.wrappers import Request\nfrom trytond.tools import cached_property\n\nlogger = logging.getLogger(__name__)\n\ndefusedxml.xmlrpc.monkey_patch()\n\n\ndef dump_decimal(self, value, write):\n    write('<value><bigdecimal>')\n    write(str(Decimal(value)))\n    write('</bigdecimal></value>')\n\n\ndef dump_date(self, value, write):\n    value = {'__class__': 'date',\n        'year': value.year,\n        'month': value.month,\n        'day': value.day,\n        }\n    self.dump_struct(value, write)\n\n\ndef dump_time(self, value, write):\n    value = {'__class__': 'time',\n        'hour': value.hour,\n        'minute': value.minute,\n        'second': value.second,\n        'microsecond': value.microsecond,\n        }\n    self.dump_struct(value, write)\n\n\ndef dump_timedelta(self, value, write):\n    value = {'__class__': 'timedelta',\n        'seconds': value.total_seconds(),\n        }\n    self.dump_struct(value, write)\n\n\ndef dump_long(self, value, write):\n    try:\n        self.dump_long(value, write)\n    except OverflowError:\n        write('<value><biginteger>')\n        write(str(int(value)))\n        write('</biginteger></value>\\n')\n\n\nclient.Marshaller.dispatch[Decimal] = dump_decimal\nclient.Marshaller.dispatch[datetime.date] = dump_date\nclient.Marshaller.dispatch[datetime.time] = dump_time\nclient.Marshaller.dispatch[datetime.timedelta] = dump_timedelta\nclient.Marshaller.dispatch[int] = dump_long\n\n\ndef dump_struct(self, value, write, escape=client.escape):\n    converted_value = {}\n    for k, v in value.items():\n        if isinstance(k, int):\n            k = str(k)\n        elif isinstance(k, float):\n            k = repr(k)\n        converted_value[k] = v\n    return self.dump_struct(converted_value, write, escape=escape)\n\n\nclient.Marshaller.dispatch[dict] = dump_struct\nclient.Marshaller.dispatch[ImmutableDict] = dump_struct\n\n\nclass XMLRPCDecoder(object):\n\n    decoders = {}\n\n    @classmethod\n    def register(cls, klass, decoder):\n        assert klass not in cls.decoders\n        cls.decoders[klass] = decoder\n\n    def __call__(self, dct):\n        if dct.get('__class__') in self.decoders:\n            return self.decoders[dct['__class__']](dct)\n        return dct\n\n\nXMLRPCDecoder.register('date',\n    lambda dct: datetime.date(dct['year'], dct['month'], dct['day']))\nXMLRPCDecoder.register('time',\n    lambda dct: datetime.time(dct['hour'], dct['minute'], dct['second'],\n        dct['microsecond']))\nXMLRPCDecoder.register('timedelta',\n    lambda dct: datetime.timedelta(seconds=dct['seconds']))\nXMLRPCDecoder.register('Decimal', lambda dct: Decimal(dct['decimal']))\n\n\ndef end_struct(self, data):\n    mark = self._marks.pop()\n    # map structs to Python dictionaries\n    dct = {}\n    items = self._stack[mark:]\n    for i in range(0, len(items), 2):\n        dct[items[i]] = items[i + 1]\n    dct = XMLRPCDecoder()(dct)\n    self._stack[mark:] = [dct]\n    self._value = 0\n\n\nclient.Unmarshaller.dispatch['struct'] = end_struct\n\n\nclass XMLRequest(Request):\n    parsed_content_type = 'xml'\n\n    @cached_property\n    def parsed_data(self):\n        if self.parsed_content_type in self.environ.get('CONTENT_TYPE', ''):\n            try:\n                # TODO replace by own loads\n                return client.loads(self.decoded_data, use_builtin_types=True)\n            except Exception:\n                raise BadRequest('Unable to read XMl request')\n        else:\n            raise BadRequest('Not an XML request')\n\n    @property\n    def rpc_method(self):\n        return self.parsed_data[1]\n\n    @property\n    def rpc_params(self):\n        return self.parsed_data[0]\n\n\nclass XMLProtocol:\n    content_type = 'xml'\n\n    @classmethod\n    def request(cls, environ):\n        return XMLRequest(environ)\n\n    @classmethod\n    def response(cls, data, request):\n        if isinstance(request, XMLRequest):\n            if isinstance(data, TrytonException):\n                data = client.Fault(data.code, str(data))\n            elif isinstance(data, Exception):\n                data = client.Fault(255, str(data))\n            else:\n                data = (data,)\n            return Response(client.dumps(\n                    data, methodresponse=True, allow_none=True),\n                content_type='text/xml')\n        else:\n            if isinstance(data, UserWarning):\n                return Conflict(data)\n            elif isinstance(data, LoginException):\n                return Forbidden(data)\n            elif isinstance(data, ConcurrencyException):\n                return Locked(data)\n            elif isinstance(data, RateLimitException):\n                return TooManyRequests(data)\n            elif isinstance(data, MissingDependenciesException):\n                return InternalServerError(data)\n            elif isinstance(data, TrytonException):\n                return BadRequest(data)\n            elif isinstance(data, Exception):\n                return InternalServerError(data)\n            return Response(data)\n"
  },
  {
    "path": "trytond/pyson.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport json\nfrom decimal import Decimal\nfrom functools import reduce\n\nfrom dateutil.relativedelta import relativedelta\n\n\nclass PYSON(object):\n\n    def pyson(self):\n        raise NotImplementedError\n\n    def types(self):\n        raise NotImplementedError\n\n    @staticmethod\n    def eval(dct, context):\n        raise NotImplementedError\n\n    def __invert__(self):\n        if self.types() != {bool}:\n            return Not(Bool(self))\n        else:\n            return Not(self)\n\n    def __and__(self, other):\n        if (isinstance(other, PYSON)\n                and other.types() != {bool}):\n            other = Bool(other)\n        if (isinstance(self, And)\n                and not isinstance(self, Or)):\n            return And(*self._statements, other)\n        if self.types() != {bool}:\n            return And(Bool(self), other)\n        else:\n            return And(self, other)\n\n    __rand__ = __and__\n\n    def __or__(self, other):\n        if (isinstance(other, PYSON)\n                and other.types() != {bool}):\n            other = Bool(other)\n        if isinstance(self, Or):\n            return Or(*self._statements, other)\n        if self.types() != {bool}:\n            return Or(Bool(self), other)\n        else:\n            return Or(self, other)\n\n    __ror__ = __or__\n\n    def __eq__(self, other):\n        return Equal(self, other)\n\n    def __ne__(self, other):\n        return Not(Equal(self, other))\n\n    def __gt__(self, other):\n        return Greater(self, other)\n\n    def __ge__(self, other):\n        return Greater(self, other, True)\n\n    def __lt__(self, other):\n        return Less(self, other)\n\n    def __le__(self, other):\n        return Less(self, other, True)\n\n    def get(self, k, d=''):\n        return Get(self, k, d)\n\n    def in_(self, obj):\n        return In(self, obj)\n\n    def contains(self, k):\n        return In(k, self)\n\n    def __repr__(self):\n        klass = self.__class__.__name__\n        return '%s(%s)' % (klass, ', '.join(map(repr, self.__repr_params__)))\n\n    @property\n    def __repr_params__(self):\n        return NotImplementedError\n\n\nclass PYSONEncoder(json.JSONEncoder):\n\n    def default(self, obj):\n        if isinstance(obj, PYSON):\n            return obj.pyson()\n        elif isinstance(obj, datetime.date):\n            if isinstance(obj, datetime.datetime):\n                return DateTime(obj.year, obj.month, obj.day,\n                        obj.hour, obj.minute, obj.second, obj.microsecond\n                        ).pyson()\n            else:\n                return Date(obj.year, obj.month, obj.day).pyson()\n        elif isinstance(obj, Decimal):\n            return float(obj)\n        return super(PYSONEncoder, self).default(obj)\n\n\nclass PYSONDecoder(json.JSONDecoder):\n\n    def __init__(self, context=None, noeval=False):\n        self.__context = context or {}\n        self.noeval = noeval\n        super(PYSONDecoder, self).__init__(object_hook=self._object_hook)\n\n    def _object_hook(self, dct):\n        if '__class__' in dct:\n            klass = CONTEXT.get(dct['__class__'])\n            if klass:\n                if not self.noeval:\n                    return klass.eval(dct, self.__context)\n                else:\n                    dct = dct.copy()\n                    del dct['__class__']\n                    return klass(**dct)\n        return dct\n\n\nclass Eval(PYSON):\n\n    def __init__(self, v, d=''):\n        super(Eval, self).__init__()\n        self._value = v\n        self._default = d\n\n    @property\n    def __repr_params__(self):\n        return self._value, self._default\n\n    def pyson(self):\n        return {\n            '__class__': 'Eval',\n            'v': self._value,\n            'd': self._default,\n            }\n\n    def types(self):\n        if isinstance(self._default, PYSON):\n            return self._default.types()\n        else:\n            return {type(self._default)}\n\n    @staticmethod\n    def eval(dct, context):\n        if '.' in dct['v'] and dct['v'] not in context:\n            base, name = dct['v'].split('.', 1)\n            return Eval.eval({\n                    'v': name,\n                    'd': dct['d'],\n                    }, context.get(base) or {})\n        return context.get(dct['v'], dct['d'])\n\n    @property\n    def basename(self):\n        name = self._value\n        if name.startswith('_parent_'):\n            name = name[len('_parent_'):]\n        if '.' in name:\n            name = name.split('.', 1)[0]\n        return name\n\n\nclass Not(PYSON):\n\n    def __init__(self, v):\n        super(Not, self).__init__()\n        if isinstance(v, PYSON):\n            if v.types() != {bool}:\n                v = Bool(v)\n        elif not isinstance(v, bool):\n            v = bool(v)\n        self._value = v\n\n    @property\n    def __repr_params__(self):\n        return (self._value,)\n\n    def pyson(self):\n        return {\n            '__class__': 'Not',\n            'v': self._value,\n            }\n\n    def types(self):\n        return {bool}\n\n    @staticmethod\n    def eval(dct, context):\n        return not dct['v']\n\n\nclass Bool(PYSON):\n\n    def __init__(self, v):\n        super(Bool, self).__init__()\n        self._value = v\n\n    @property\n    def __repr_params__(self):\n        return (self._value,)\n\n    def pyson(self):\n        return {\n            '__class__': 'Bool',\n            'v': self._value,\n            }\n\n    def types(self):\n        return {bool}\n\n    @staticmethod\n    def eval(dct, context):\n        return bool(dct['v'])\n\n\nclass And(PYSON):\n\n    def __init__(self, *statements, **kwargs):\n        super(And, self).__init__()\n        statements = list(statements) + kwargs.get('s', [])\n        for i, statement in enumerate(list(statements)):\n            if isinstance(statement, PYSON):\n                if statement.types() != {bool}:\n                    statements[i] = Bool(statement)\n            elif not isinstance(statement, bool):\n                statements[i] = bool(statement)\n        assert len(statements) >= 2, 'must have at least 2 statements'\n        self._statements = statements\n\n    @property\n    def __repr_params__(self):\n        return tuple(self._statements)\n\n    def pyson(self):\n        return {\n            '__class__': 'And',\n            's': self._statements,\n            }\n\n    def types(self):\n        return {bool}\n\n    @staticmethod\n    def eval(dct, context):\n        return bool(reduce(lambda x, y: x and y, dct['s']))\n\n\nclass Or(And):\n\n    def pyson(self):\n        res = super(Or, self).pyson()\n        res['__class__'] = 'Or'\n        return res\n\n    @staticmethod\n    def eval(dct, context):\n        return bool(reduce(lambda x, y: x or y, dct['s']))\n\n\nclass Equal(PYSON):\n\n    def __init__(self, s1, s2):\n        statement1, statement2 = s1, s2\n        super(Equal, self).__init__()\n        if isinstance(statement1, PYSON):\n            types1 = statement1.types()\n        else:\n            types1 = {type(s1)}\n        if isinstance(statement2, PYSON):\n            types2 = statement2.types()\n        else:\n            types2 = {type(s2)}\n        assert types1 == types2, 'statements must have the same type'\n        self._statement1 = statement1\n        self._statement2 = statement2\n\n    @property\n    def __repr_params__(self):\n        return (self._statement1, self._statement2)\n\n    def pyson(self):\n        return {\n            '__class__': 'Equal',\n            's1': self._statement1,\n            's2': self._statement2,\n            }\n\n    def types(self):\n        return {bool}\n\n    @staticmethod\n    def eval(dct, context):\n        return dct['s1'] == dct['s2']\n\n\nclass Greater(PYSON):\n\n    def __init__(self, s1, s2, e=False):\n        statement1, statement2, equal = s1, s2, e\n        super(Greater, self).__init__()\n        for i in (statement1, statement2):\n            if isinstance(i, PYSON):\n                assert i.types().issubset({\n                        int, float, type(None),\n                        datetime.datetime, datetime.date}), \\\n                    'statement must be an integer, float, date or datetime'\n            else:\n                assert isinstance(i, (\n                        int, float, type(None),\n                        datetime.datetime, datetime.date)), \\\n                    'statement must be an integer, float, date or datetime'\n        if isinstance(equal, PYSON):\n            if equal.types() != {bool}:\n                equal = Bool(equal)\n        elif not isinstance(equal, bool):\n            equal = bool(equal)\n        self._statement1 = statement1\n        self._statement2 = statement2\n        self._equal = equal\n\n    @property\n    def __repr_params__(self):\n        return (self._statement1, self._statement2, self._equal)\n\n    def pyson(self):\n        return {\n            '__class__': 'Greater',\n            's1': self._statement1,\n            's2': self._statement2,\n            'e': self._equal,\n            }\n\n    def types(self):\n        return {bool}\n\n    @staticmethod\n    def _convert(dct):\n        for i in ('s1', 's2'):\n            if dct[i] is None:\n                dct[i] = 0.0\n            if not isinstance(dct[i], (int, float)):\n                dct = dct.copy()\n                stmt = dct[i]\n                if isinstance(stmt, datetime.datetime):\n                    stmt = stmt.timestamp()\n                elif isinstance(stmt, datetime.date):\n                    time = datetime.time(0, 0)\n                    stmt = datetime.datetime.combine(stmt, time).timestamp()\n                dct[i] = float(stmt)\n        return dct\n\n    @staticmethod\n    def eval(dct, context):\n        if dct['s1'] is None or dct['s2'] is None:\n            return False\n        dct = Greater._convert(dct)\n        if dct['e']:\n            return dct['s1'] >= dct['s2']\n        else:\n            return dct['s1'] > dct['s2']\n\n\nclass Less(Greater):\n\n    def pyson(self):\n        res = super(Less, self).pyson()\n        res['__class__'] = 'Less'\n        return res\n\n    @staticmethod\n    def eval(dct, context):\n        if dct['s1'] is None or dct['s2'] is None:\n            return False\n        dct = Less._convert(dct)\n        if dct['e']:\n            return dct['s1'] <= dct['s2']\n        else:\n            return dct['s1'] < dct['s2']\n\n\nclass If(PYSON):\n\n    def __init__(self, c, t, e=None):\n        condition, then_statement, else_statement = c, t, e\n        super(If, self).__init__()\n        if isinstance(condition, PYSON):\n            if condition.types() != {bool}:\n                condition = Bool(condition)\n        elif not isinstance(condition, bool):\n            condition = bool(condition)\n        self._condition = condition\n        self._then_statement = then_statement\n        self._else_statement = else_statement\n\n    @property\n    def __repr_params__(self):\n        return (self._condition, self._then_statement, self._else_statement)\n\n    def pyson(self):\n        return {\n            '__class__': 'If',\n            'c': self._condition,\n            't': self._then_statement,\n            'e': self._else_statement,\n            }\n\n    def types(self):\n        if isinstance(self._then_statement, PYSON):\n            types = self._then_statement.types()\n        else:\n            types = {type(self._then_statement)}\n        if isinstance(self._else_statement, PYSON):\n            types |= self._else_statement.types()\n        else:\n            types |= {type(self._else_statement)}\n        return types\n\n    @staticmethod\n    def eval(dct, context):\n        if dct['c']:\n            return dct['t']\n        else:\n            return dct['e']\n\n\nclass Get(PYSON):\n\n    def __init__(self, v, k, d=''):\n        obj, key, default = v, k, d\n        super(Get, self).__init__()\n        if isinstance(obj, PYSON):\n            assert obj.types() == {dict}, 'obj must be a dict'\n        else:\n            assert isinstance(obj, dict), 'obj must be a dict'\n        self._obj = obj\n        if isinstance(key, PYSON):\n            assert key.types() == {str}, 'key must be a string'\n        else:\n            assert isinstance(key, str), 'key must be a string'\n        self._key = key\n        self._default = default\n\n    @property\n    def __repr_params__(self):\n        return (self._obj, self._key, self._default)\n\n    def pyson(self):\n        return {\n            '__class__': 'Get',\n            'v': self._obj,\n            'k': self._key,\n            'd': self._default,\n            }\n\n    def types(self):\n        if isinstance(self._default, PYSON):\n            return self._default.types()\n        else:\n            return {type(self._default)}\n\n    @staticmethod\n    def eval(dct, context):\n        return dct['v'].get(dct['k'], dct['d'])\n\n\nclass In(PYSON):\n\n    def __init__(self, k, v):\n        key, obj = k, v\n        super(In, self).__init__()\n        if isinstance(key, PYSON):\n            assert key.types().issubset({str, int}), \\\n                'key must be a string or an integer or a long'\n        else:\n            assert isinstance(key, (str, int)), \\\n                'key must be a string or an integer or a long'\n        if isinstance(obj, PYSON):\n            assert obj.types().issubset({dict, list}), \\\n                'obj must be a dict or a list'\n            if obj.types() == {dict}:\n                if isinstance(key, PYSON):\n                    assert key.types() == {str}, 'key must be a string'\n                else:\n                    assert isinstance(key, str), 'key must be a string'\n        else:\n            assert isinstance(obj, (dict, list))\n            if isinstance(obj, dict):\n                if isinstance(key, PYSON):\n                    assert key.types() == {str}, 'key must be a string'\n                else:\n                    assert isinstance(key, str), 'key must be a string'\n        self._key = key\n        self._obj = obj\n\n    @property\n    def __repr_params__(self):\n        return (self._key, self._obj)\n\n    def pyson(self):\n        return {\n            '__class__': 'In',\n            'k': self._key,\n            'v': self._obj,\n            }\n\n    def types(self):\n        return {bool}\n\n    @staticmethod\n    def eval(dct, context):\n        if dct['v']:\n            return dct['k'] in dct['v']\n        else:\n            return False\n\n\nclass Date(PYSON):\n\n    def __init__(self, year=None, month=None, day=None,\n            delta_years=0, delta_months=0, delta_days=0, start=None, **kwargs):\n        year = kwargs.get('y', year)\n        month = kwargs.get('M', month)\n        day = kwargs.get('d', day)\n        delta_years = kwargs.get('dy', delta_years)\n        delta_months = kwargs.get('dM', delta_months)\n        delta_days = kwargs.get('dd', delta_days)\n        super(Date, self).__init__()\n        for i in (year, month, day, delta_years, delta_months, delta_days):\n            if isinstance(i, PYSON):\n                assert i.types().issubset({int, type(None)}), \\\n                    '%s must be an integer or None' % (i,)\n            else:\n                assert isinstance(i, (int, type(None))), \\\n                    '%s must be an integer or None' % (i,)\n        self._year = year\n        self._month = month\n        self._day = day\n        self._delta_years = delta_years\n        self._delta_months = delta_months\n        self._delta_days = delta_days\n        self._start = start\n\n    @property\n    def __repr_params__(self):\n        return (self._year, self._month, self._day,\n            self._delta_years, self._delta_months, self._delta_days,\n            self._start)\n\n    def pyson(self):\n        return {\n            '__class__': 'Date',\n            'y': self._year,\n            'M': self._month,\n            'd': self._day,\n            'dy': self._delta_years,\n            'dM': self._delta_months,\n            'dd': self._delta_days,\n            'start': self._start,\n            }\n\n    def types(self):\n        return {datetime.date}\n\n    @staticmethod\n    def eval(dct, context):\n        today = dct.get('start')\n        if isinstance(today, datetime.datetime):\n            today = today.date()\n        if not isinstance(today, datetime.date):\n            today = datetime.date.today()\n        return today + relativedelta(\n            year=dct['y'],\n            month=dct['M'],\n            day=dct['d'],\n            years=dct['dy'],\n            months=dct['dM'],\n            days=dct['dd'],\n            )\n\n\nclass DateTime(Date):\n\n    def __init__(self, year=None, month=None, day=None,\n            hour=None, minute=None, second=None, microsecond=None,\n            delta_years=0, delta_months=0, delta_days=0,\n            delta_hours=0, delta_minutes=0, delta_seconds=0,\n            delta_microseconds=0, start=None, **kwargs):\n        hour = kwargs.get('h', hour)\n        minute = kwargs.get('m', minute)\n        second = kwargs.get('s', second)\n        microsecond = kwargs.get('ms', microsecond)\n        delta_hours = kwargs.get('dh', delta_hours)\n        delta_minutes = kwargs.get('dm', delta_minutes)\n        delta_seconds = kwargs.get('ds', delta_seconds)\n        delta_microseconds = kwargs.get('dms', delta_microseconds)\n        super(DateTime, self).__init__(year=year, month=month, day=day,\n                delta_years=delta_years, delta_months=delta_months,\n                delta_days=delta_days, start=start, **kwargs)\n        for i in (hour, minute, second, microsecond,\n                delta_hours, delta_minutes, delta_seconds, delta_microseconds):\n            if isinstance(i, PYSON):\n                assert i.types() == {int, type(None)}, \\\n                    '%s must be an integer or None' % (i,)\n            else:\n                assert isinstance(i, (int, type(None))), \\\n                    '%s must be an integer or None' % (i,)\n        self._hour = hour\n        self._minute = minute\n        self._second = second\n        self._microsecond = microsecond\n        self._delta_hours = delta_hours\n        self._delta_minutes = delta_minutes\n        self._delta_seconds = delta_seconds\n        self._delta_microseconds = delta_microseconds\n\n    @property\n    def __repr_params__(self):\n        date_params = super(DateTime, self).__repr_params__\n        return (date_params[:3]\n            + (self._hour, self._minute, self._second, self._microsecond)\n            + date_params[3:-1]\n            + (self._delta_hours, self._delta_minutes, self._delta_seconds,\n                self._delta_microseconds)\n            + date_params[-1:])\n\n    def pyson(self):\n        res = super(DateTime, self).pyson()\n        res['__class__'] = 'DateTime'\n        res['h'] = self._hour\n        res['m'] = self._minute\n        res['s'] = self._second\n        res['ms'] = self._microsecond\n        res['dh'] = self._delta_hours\n        res['dm'] = self._delta_minutes\n        res['ds'] = self._delta_seconds\n        res['dms'] = self._delta_microseconds\n        return res\n\n    def types(self):\n        return {datetime.datetime}\n\n    @staticmethod\n    def eval(dct, context):\n        now = dct.get('start')\n        if (isinstance(now, datetime.date)\n                and not isinstance(now, datetime.datetime)):\n            now = datetime.datetime.combine(now, datetime.time())\n        if not isinstance(now, datetime.datetime):\n            now = datetime.datetime.utcnow()\n        return now + relativedelta(\n            year=dct['y'],\n            month=dct['M'],\n            day=dct['d'],\n            hour=dct['h'],\n            minute=dct['m'],\n            second=dct['s'],\n            microsecond=dct['ms'],\n            years=dct['dy'],\n            months=dct['dM'],\n            days=dct['dd'],\n            hours=dct['dh'],\n            minutes=dct['dm'],\n            seconds=dct['ds'],\n            microseconds=dct['dms'],\n            )\n\n\nclass TimeDelta(PYSON):\n\n    def __init__(self, days=0, seconds=0, microseconds=0):\n        for i in [days, seconds, microseconds]:\n            if isinstance(i, PYSON):\n                assert i.types().issubset({int, float}), \\\n                        '%s must be an integer' % (i,)\n            else:\n                assert isinstance(i, (int, float)), \\\n                        '%s must be an integer' % (i,)\n        self._days = days\n        self._seconds = seconds\n        self._microseconds = microseconds\n\n    @property\n    def __repr_params__(self):\n        return self._days, self._seconds, self._microseconds\n\n    def pyson(self):\n        return {\n            '__class__': 'TimeDelta',\n            'd': self._days,\n            's': self._seconds,\n            'm': self._microseconds,\n            }\n\n    def types(self):\n        return {datetime.timedelta}\n\n    @staticmethod\n    def eval(dct, context):\n        return datetime.timedelta(\n            days=dct['d'],\n            seconds=dct['s'],\n            microseconds=dct['m'],\n            )\n\n\nclass Len(PYSON):\n\n    def __init__(self, v):\n        super(Len, self).__init__()\n        if isinstance(v, PYSON):\n            assert v.types().issubset({dict, list, str}), \\\n                'value must be a dict or a list or a string'\n        else:\n            assert isinstance(v, (dict, list, str)), \\\n                'value must be a dict or list or a string'\n        self._value = v\n\n    @property\n    def __repr_params__(self):\n        return (self._value,)\n\n    def pyson(self):\n        return {\n            '__class__': 'Len',\n            'v': self._value,\n            }\n\n    def types(self):\n        return {int}\n\n    @staticmethod\n    def eval(dct, context):\n        return len(dct['v'])\n\n\nclass Id(PYSON):\n    \"\"\"The database id for filesystem id\"\"\"\n\n    def __init__(self, module, fs_id):\n        super(Id, self).__init__()\n        self._module = module\n        self._fs_id = fs_id\n\n    @property\n    def __repr_params__(self):\n        return (self._module, self._fs_id)\n\n    def pyson(self):\n        from trytond.pool import Pool\n        ModelData = Pool().get('ir.model.data')\n        return ModelData.get_id(self._module, self._fs_id)\n\n    def types(self):\n        return {int}\n\n\nCONTEXT = {\n    'Eval': Eval,\n    'Not': Not,\n    'Bool': Bool,\n    'And': And,\n    'Or': Or,\n    'Equal': Equal,\n    'Greater': Greater,\n    'Less': Less,\n    'If': If,\n    'Get': Get,\n    'In': In,\n    'Date': Date,\n    'DateTime': DateTime,\n    'TimeDelta': TimeDelta,\n    'Len': Len,\n    'Id': Id,\n    'true': True,\n    'false': False,\n}\n"
  },
  {
    "path": "trytond/report/__init__.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom .report import Report, get_email\n\n__all__ = [Report, get_email]\n"
  },
  {
    "path": "trytond/report/report.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport inspect\nimport logging\nimport math\nimport operator\nimport os\nimport subprocess\nimport tempfile\nimport time\nimport unicodedata\nimport warnings\nimport zipfile\nfrom email.mime.multipart import MIMEMultipart\nfrom email.mime.text import MIMEText\nfrom io import BytesIO\nfrom itertools import groupby\n\nimport dateutil.tz\n\ntry:\n    import html2text\nexcept ImportError:\n    html2text = None\n\ntry:\n    import weasyprint\nexcept ImportError:\n    weasyprint = None\n\nfrom genshi.filters import Translator\nfrom genshi.template.text import TextTemplate\n\nfrom trytond.exceptions import UserError\nfrom trytond.i18n import gettext\nfrom trytond.pool import Pool, PoolBase\nfrom trytond.rpc import RPC\nfrom trytond.tools import slugify\nfrom trytond.transaction import Transaction\nfrom trytond.url import URLMixin\n\nwarnings.simplefilter(\"ignore\")\nimport relatorio.reporting  # noqa: E402\n\nwarnings.resetwarnings()\ntry:\n    from relatorio.templates.opendocument import MANIFEST, Manifest\nexcept ImportError:\n    Manifest, MANIFEST = None, None\n\nlogger = logging.getLogger(__name__)\n\nMIMETYPES = {\n    'odt': 'application/vnd.oasis.opendocument.text',\n    'odp': 'application/vnd.oasis.opendocument.presentation',\n    'ods': 'application/vnd.oasis.opendocument.spreadsheet',\n    'odg': 'application/vnd.oasis.opendocument.graphics',\n    'txt': 'text/plain',\n    'xml': 'text/xml',\n    'html': 'text/html',\n    'xhtml': 'text/xhtml',\n    }\nFORMAT2EXT = {\n    'doc6': 'doc',\n    'doc95': 'doc',\n    'docbook': 'xml',\n    'docx7': 'docx',\n    'ooxml': 'xml',\n    'latex': 'ltx',\n    'sdc4': 'sdc',\n    'sdc3': 'sdc',\n    'sdd3': 'sdd',\n    'sdd4': 'sdd',\n    'sdw4': 'sdw',\n    'sdw3': 'sdw',\n    'sxd3': 'sxd',\n    'sxd5': 'sxd',\n    'text': 'txt',\n    'xhtml': 'html',\n    'xls5': 'xls',\n    'xls95': 'xls',\n    }\n\nTIMEDELTA_DEFAULT_CONVERTER = {\n    's': 1,\n    }\nTIMEDELTA_DEFAULT_CONVERTER['m'] = TIMEDELTA_DEFAULT_CONVERTER['s'] * 60\nTIMEDELTA_DEFAULT_CONVERTER['h'] = TIMEDELTA_DEFAULT_CONVERTER['m'] * 60\nTIMEDELTA_DEFAULT_CONVERTER['d'] = TIMEDELTA_DEFAULT_CONVERTER['h'] * 24\nTIMEDELTA_DEFAULT_CONVERTER['w'] = TIMEDELTA_DEFAULT_CONVERTER['d'] * 7\nTIMEDELTA_DEFAULT_CONVERTER['M'] = TIMEDELTA_DEFAULT_CONVERTER['d'] * 30\nTIMEDELTA_DEFAULT_CONVERTER['Y'] = TIMEDELTA_DEFAULT_CONVERTER['d'] * 365\n\n# For most OS maximum filename is 255 but Excel has a limitation which include\n# the path of 218.\n# As on Windows report is most likely to be open from\n# C:\\Users\\<username>\\AppData\\Local\\Temp\\tryton_<random>\\ which has a length of\n# 56 with 12 for username and 8 for random. So 162 should be the maximum but we\n# round it to 100.\nREPORT_NAME_MAX_LENGTH = 100\n\n\nclass TranslateFactory:\n\n    def __init__(self, report_name, translation):\n        self.report_name = report_name\n        self.translation = translation\n\n    def __call__(self, text):\n        return self.translation.get_report(self.report_name, text)\n\n\nclass Report(URLMixin, PoolBase):\n\n    @classmethod\n    def __setup__(cls):\n        super(Report, cls).__setup__()\n        cls.__rpc__ = {\n            'execute': RPC(),\n            }\n\n    @classmethod\n    def check_access(cls):\n        pool = Pool()\n        ActionReport = pool.get('ir.action.report')\n        User = pool.get('res.user')\n\n        if Transaction().user == 0:\n            return\n\n        groups = set(User.get_groups())\n        report_groups = ActionReport.get_groups(cls.__name__)\n        if report_groups and not groups & report_groups:\n            raise UserError('Calling report %s is not allowed!' % cls.__name__)\n\n    @classmethod\n    def header_key(cls, record):\n        return ()\n\n    @classmethod\n    def execute(cls, ids, data):\n        '''\n        Execute the report on record ids.\n        The dictionary with data that will be set in local context of the\n        report.\n        It returns a tuple with:\n            report type,\n            data,\n            a boolean to direct print,\n            the report name (with or without the record names)\n        '''\n        pool = Pool()\n        ActionReport = pool.get('ir.action.report')\n        cls.check_access()\n        context = Transaction().context\n        ids = list(map(int, ids))\n\n        action_id = data.get('action_id')\n        if action_id is None:\n            action_reports = ActionReport.search([\n                    ('report_name', '=', cls.__name__)\n                    ])\n            assert action_reports, '%s not found' % cls\n            action_report = action_reports[0]\n        else:\n            action_report = ActionReport(action_id)\n\n        def report_name(records, reserved_length=0):\n            names = []\n            name_length = 0\n            record_count = len(records)\n            max_length = (REPORT_NAME_MAX_LENGTH\n                - reserved_length\n                - len(str(record_count)) - 2)\n            if action_report.record_name:\n                template = TextTemplate(action_report.record_name)\n            else:\n                template = None\n            for record in records[:5]:\n                if template:\n                    record_name = template.generate(record=record).render()\n                else:\n                    record_name = record.rec_name\n                name_length += len(\n                    unicodedata.normalize('NFKD', record_name)) + 1\n                if name_length > max_length:\n                    break\n                names.append(record_name)\n\n            name = '-'.join(names)\n            if len(records) > len(names):\n                name += '__' + str(record_count - len(names))\n            return name\n\n        records = []\n        model = action_report.model or data.get('model')\n        if model:\n            records = cls._get_records(ids, model, data)\n\n        if not records:\n            groups = [[]]\n            headers = [{}]\n        elif action_report.single:\n            groups = [[r] for r in records]\n            headers = [dict(cls.header_key(r)) for r in records]\n        else:\n            groups = []\n            headers = []\n            for key, group in groupby(records, key=cls.header_key):\n                groups.append(list(group))\n                headers.append(dict(key))\n\n        n = len(groups)\n        join_string = '-'\n        if n > 1:\n            padding = math.ceil(math.log10(n))\n            content = BytesIO()\n            with zipfile.ZipFile(content, 'w') as content_zip:\n                for i, (header, group_records) in enumerate(\n                        zip(headers, groups), 1):\n                    oext, rcontent = cls._execute(\n                        group_records, header, data, action_report)\n                    number = str(i).zfill(padding)\n                    filename = report_name(\n                        group_records, len(number) + len(join_string))\n                    filename = slugify(join_string.join([number, filename]))\n                    rfilename = '%s.%s' % (filename, oext)\n                    content_zip.writestr(rfilename, rcontent)\n            content = content.getvalue()\n            oext = 'zip'\n        else:\n            oext, content = cls._execute(\n                groups[0], headers[0], data, action_report)\n        if not isinstance(content, str):\n            content = bytearray(content) if bytes == str else bytes(content)\n        action_report_name = action_report.name[:REPORT_NAME_MAX_LENGTH]\n        if context.get('with_rec_name', True):\n            filename = join_string.join(\n                filter(None, [\n                    action_report_name,\n                    report_name(\n                        records, len(action_report_name) + len(join_string))]))\n        else:\n            filename = action_report_name\n        return (oext, content, action_report.direct_print, filename)\n\n    @classmethod\n    def _execute(cls, records, header, data, action):\n        # Ensure to restore original context\n        # set_lang may modify it\n        with Transaction().set_context(Transaction().context):\n            report_context = cls.get_context(records, header, data)\n            return cls.convert(action, cls.render(action, report_context))\n\n    @classmethod\n    def _get_records(cls, ids, model, data):\n        pool = Pool()\n        Model = pool.get(model)\n        Config = pool.get('ir.configuration')\n        Lang = pool.get('ir.lang')\n        context = Transaction().context\n\n        class TranslateModel(object):\n            _languages = {}\n\n            def __init__(self, id):\n                self.id = id\n                self._language = Transaction().language\n\n            def set_lang(self, language=None):\n                if isinstance(language, Lang):\n                    language = language.code\n                if not language:\n                    language = Config.get_language()\n                self._language = language\n\n            def __getattr__(self, name):\n                if self._language not in TranslateModel._languages:\n                    with Transaction().set_context(\n                            context=context, language=self._language):\n                        records = Model.browse(ids)\n                    id2record = dict((r.id, r) for r in records)\n                    TranslateModel._languages[self._language] = id2record\n                else:\n                    id2record = TranslateModel._languages[self._language]\n                record = id2record[self.id]\n                return getattr(record, name)\n\n            def __int__(self):\n                return int(self.id)\n\n            def __str__(self):\n                return '%s,%s' % (Model.__name__, self.id)\n\n        return [TranslateModel(id) for id in ids]\n\n    @classmethod\n    def get_context(cls, records, header, data):\n        pool = Pool()\n        User = pool.get('res.user')\n        Lang = pool.get('ir.lang')\n\n        report_context = {}\n        report_context['header'] = header\n        report_context['data'] = data\n        report_context['context'] = Transaction().context\n        report_context['user'] = User(Transaction().user)\n        report_context['records'] = records\n        report_context['record'] = records[0] if records else None\n        report_context['format_date'] = cls.format_date\n        report_context['format_datetime'] = cls.format_datetime\n        report_context['format_timedelta'] = cls.format_timedelta\n        report_context['format_currency'] = cls.format_currency\n        report_context['format_number'] = cls.format_number\n        report_context['format_number_symbol'] = cls.format_number_symbol\n        report_context['datetime'] = datetime\n\n        def set_lang(language=None):\n            if isinstance(language, Lang):\n                language = language.code\n            Transaction().set_context(language=language)\n        report_context['set_lang'] = set_lang\n\n        return report_context\n\n    @classmethod\n    def _callback_loader(cls, report, template):\n        if report.translatable:\n            pool = Pool()\n            Translation = pool.get('ir.translation')\n            translate = TranslateFactory(cls.__name__, Translation)\n            translator = Translator(lambda text: translate(text))\n            # Do not use Translator.setup to add filter at the end\n            # after set_lang evaluation\n            template.filters.append(translator)\n            if hasattr(template, 'add_directives'):\n                template.add_directives(Translator.NAMESPACE, translator)\n\n    @classmethod\n    def render(cls, report, report_context):\n        \"calls the underlying templating engine to renders the report\"\n        template = report.get_template_cached()\n        if template is None:\n            mimetype = MIMETYPES[report.template_extension]\n            loader = relatorio.reporting.MIMETemplateLoader()\n            klass = loader.factories[loader.get_type(mimetype)]\n            template = klass(BytesIO(report.report_content))\n            cls._callback_loader(report, template)\n            report.set_template_cached(template)\n        data = template.generate(**report_context).render()\n        if hasattr(data, 'getvalue'):\n            data = data.getvalue()\n        return data\n\n    @classmethod\n    def convert(cls, report, data, timeout=5 * 60, retry=5):\n        \"converts the report data to another mimetype if necessary\"\n        input_format = report.template_extension\n        output_format = report.extension or report.template_extension\n\n        if (weasyprint\n                and input_format in {'html', 'xhtml'}\n                and output_format == 'pdf'):\n            return output_format, weasyprint.HTML(string=data).write_pdf()\n\n        if input_format == output_format and output_format in MIMETYPES:\n            return output_format, data\n\n        dtemp = tempfile.mkdtemp(prefix='trytond_')\n        path = os.path.join(\n            dtemp, report.report_name + os.extsep + input_format)\n        oext = FORMAT2EXT.get(output_format, output_format)\n        mode = 'w+' if isinstance(data, str) else 'wb+'\n        with open(path, mode) as fp:\n            fp.write(data)\n        try:\n            cmd = ['soffice',\n                '--headless', '--nolockcheck', '--nodefault', '--norestore',\n                '--convert-to', oext, '--outdir', dtemp, path]\n            output = os.path.splitext(path)[0] + os.extsep + oext\n            for count in range(retry, -1, -1):\n                if count != retry:\n                    time.sleep(0.02 * (retry - count))\n                try:\n                    subprocess.check_call(cmd, timeout=timeout)\n                except subprocess.CalledProcessError:\n                    if count:\n                        continue\n                    logger.error(\n                        \"fail to convert %s to %s\", report.report_name, oext,\n                        exc_info=True)\n                    break\n                if os.path.exists(output):\n                    with open(output, 'rb') as fp:\n                        return oext, fp.read()\n            else:\n                logger.error(\n                    'fail to convert %s to %s', report.report_name, oext)\n            return input_format, data\n        finally:\n            try:\n                os.remove(path)\n                os.remove(output)\n                os.rmdir(dtemp)\n            except OSError:\n                pass\n\n    @classmethod\n    def format_date(cls, value, lang=None, format=None):\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        if lang is None:\n            lang = Lang.get()\n        return lang.strftime(value, format=format)\n\n    @classmethod\n    def format_datetime(cls, value, lang=None, format=None, timezone=None):\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        if lang is None:\n            lang = Lang.get()\n        if value.tzinfo is None:\n            value = value.replace(tzinfo=dateutil.tz.tzutc())\n        if timezone:\n            if isinstance(timezone, str):\n                timezone = dateutil.tz.gettz(timezone)\n            value = value.astimezone(timezone)\n        return lang.strftime(value, format)\n\n    @classmethod\n    def format_timedelta(cls, value, converter=None, lang=None):\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        if lang is None:\n            lang = Lang.get()\n        if not converter:\n            converter = TIMEDELTA_DEFAULT_CONVERTER\n        if value is None:\n            return ''\n\n        def translate(k):\n            xml_id = 'ir.msg_timedelta_%s' % k\n            translation = gettext(xml_id)\n            return translation if translation != xml_id else k\n\n        text = []\n        value = value.total_seconds()\n        sign = '-' if value < 0 else ''\n        value = abs(value)\n        converter = sorted(\n            converter.items(), key=operator.itemgetter(1), reverse=True)\n        values = []\n        for k, v in converter:\n            part, value = divmod(value, v)\n            values.append(part)\n\n        for (k, _), v in zip(converter[:-3], values):\n            if v:\n                text.append(lang.format('%d', v, True) + translate(k))\n        if any(values[-3:]) or not text:\n            time = '%02d:%02d' % tuple(values[-3:-1])\n            if values[-1] or value:\n                time += ':%02d' % values[-1]\n            text.append(time)\n        text = sign + ' '.join(text)\n        if value:\n            if not any(values[-3:]):\n                # Add space if no time\n                text += ' '\n            text += ('%.6f' % value)[1:]\n        return text\n\n    @classmethod\n    def format_currency(\n            cls, value, lang, currency, symbol=True, grouping=True,\n            digits=None):\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        if lang is None:\n            lang = Lang.get()\n        return lang.currency(\n            value, currency, symbol=symbol, grouping=grouping, digits=digits)\n\n    @classmethod\n    def format_number(\n            cls, value, lang, digits=None, grouping=True, monetary=None):\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        if lang is None:\n            lang = Lang.get()\n        return lang.format_number(\n            value, digits=digits, grouping=grouping, monetary=monetary)\n\n    @classmethod\n    def format_number_symbol(\n            cls, value, lang, symbol, digits=None, grouping=True):\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        if lang is None:\n            lang = Lang.get()\n        return lang.format_number_symbol(\n            value, symbol, digits=digits, grouping=grouping)\n\n\ndef get_email(report, record, languages):\n    \"Return email.mime and title from the report execution\"\n    pool = Pool()\n    ActionReport = pool.get('ir.action.report')\n    report_id = None\n    if inspect.isclass(report) and issubclass(report, Report):\n        Report_ = report\n    else:\n        if isinstance(report, ActionReport):\n            report_name = report.report_name\n            report_id = report.id\n        else:\n            report_name = report\n        Report_ = pool.get(report_name, type='report')\n    converter = None\n    title = None\n    msg = MIMEMultipart('alternative')\n    msg.add_header('Content-Language', ', '.join(l.code for l in languages))\n    for language in languages:\n        with Transaction().set_context(\n                language=language.code, with_rec_name=False):\n            ext, content, _, title = Report_.execute(\n                [record.id], {\n                    'action_id': report_id,\n                    'language': language,\n                    })\n        if ext == 'html' and html2text:\n            if not converter:\n                converter = html2text.HTML2Text()\n            part = MIMEText(\n                converter.handle(content), 'plain', _charset='utf-8')\n            part.add_header('Content-Language', language.code)\n            msg.attach(part)\n        part = MIMEText(content, ext, _charset='utf-8')\n        part.add_header('Content-Language', language.code)\n        msg.attach(part)\n    return msg, title\n"
  },
  {
    "path": "trytond/res/__init__.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.pool import Pool\n\nfrom . import group, ir, routes, user\n\n__all__ = ['register', 'routes']\n\n\ndef register():\n    Pool.register(\n        group.Group,\n        user.User,\n        user.LoginAttempt,\n        user.UserDevice,\n        user.UserAction,\n        user.UserGroup,\n        user.Warning_,\n        user.UserApplication,\n        user.UserConfigStart,\n        ir.UIMenu,\n        ir.UIMenuGroup,\n        ir.ActionGroup,\n        ir.Action,\n        ir.ActionReport,\n        ir.ActionActWindow,\n        ir.ActionWizard,\n        ir.ActionURL,\n        ir.ActionKeyword,\n        ir.ModelButton,\n        ir.ModelButtonGroup,\n        ir.ModelButtonRule,\n        ir.ModelButtonClick,\n        ir.RuleGroup,\n        ir.RuleGroupGroup,\n        ir.SequenceType,\n        ir.SequenceTypeGroup,\n        ir.Export,\n        ir.Export_Group,\n        ir.Export_Write_Group,\n        module='res', type_='model')\n    Pool.register(\n        user.UserConfig,\n        module=\"res\", type_='wizard')\n    Pool.register(\n        user.EmailResetPassword,\n        module='res', type_='report')\n"
  },
  {
    "path": "trytond/res/email_reset_password.html",
    "content": "<!DOCTYPE html>\n<html xmlns:py=\"http://genshi.edgewall.org/\" xmlns:i18n=\"http://genshi.edgewall.org/i18n\">\n    <head>\n        <title>Reset Password</title>\n    </head>\n    <body>\n        <div style=\"display: block; text-align: center\">\n            <div>\n                <h1>Reset Password</h1>\n                <p i18n:msg=\"login,password,host,database,http_host,database\">\n                The password for your account, <strong>${record.login}</strong>, has been reset.<br/>\n                You must set a new one from the user's preferences.<br/>\n                You can connect with this temporary password <strong>${record.password_reset}</strong> to<br/>\n                <a href=\"tryton://${host}/${database}\">tryton://${host}/${database}</a><br/>\n                <a href=\"${http_host}/#${database}\">${http_host}/#${database}</a>\n                </p>\n            </div>\n            <hr style=\"margin-top: 20px; border-style: solid none none; border-color: #EEE\"></hr>\n            <div style=\"font-size: 80%; color: #777\">\n                <p i18n:msg=\"datetime,expire_delay\">\n                The password will expire in <time datetime=\"${record.password_reset_expire.isoformat()}\">${format_timedelta(expire_delay)}</time>.\n                </p>\n            </div>\n        </div>\n    </body>\n</html>\n"
  },
  {
    "path": "trytond/res/exceptions.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom .user import DeleteError, PasswordError\n\n__all__ = [\n    PasswordError,\n    DeleteError,\n    ]\n"
  },
  {
    "path": "trytond/res/group.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom itertools import chain\n\nfrom sql import With\n\nfrom trytond.model import (\n    DeactivableMixin, ModelSQL, ModelView, Unique, fields, tree)\nfrom trytond.pool import Pool\nfrom trytond.tools import grouped_slice\n\n\nclass MenuMany2Many(fields.Many2Many):\n\n    def get(self, ids, model, name, values=None):\n        Menu = self.get_target()\n        res = super(MenuMany2Many, self).get(ids, model, name,\n                values=values)\n        menu_ids = list(set(chain(*res.values())))\n        test_ids = []\n        for sub_ids in grouped_slice(menu_ids):\n            test_ids.append(list(map(int, Menu.search([\n                            ('id', 'in', sub_ids),\n                            ]))))\n        menu_ids = set(chain(*test_ids))\n        for group_id, ids in res.items():\n            res[group_id] = tuple(id_ for id_ in ids if id_ in menu_ids)\n        return res\n\n\nclass Group(DeactivableMixin, tree(), ModelSQL, ModelView):\n    \"Group\"\n    __name__ = \"res.group\"\n    name = fields.Char('Name', required=True, translate=True)\n    users = fields.Many2Many('res.user-res.group', 'group', 'user', 'Users')\n    parent = fields.Many2One(\n        'res.group', \"Parent\",\n        help=\"The group to inherit accesses from.\")\n    model_access = fields.One2Many('ir.model.access', 'group',\n       'Access Model')\n    field_access = fields.One2Many('ir.model.field.access', 'group',\n        'Access Field')\n    buttons = fields.Many2Many(\n        'ir.model.button-res.group', 'group', 'button', \"Buttons\")\n    rule_groups = fields.Many2Many('ir.rule.group-res.group',\n       'group', 'rule_group', 'Rules',\n       domain=[('global_p', '!=', True), ('default_p', '!=', True)])\n    menu_access = MenuMany2Many('ir.ui.menu-res.group',\n       'group', 'menu', 'Access Menu')\n\n    @classmethod\n    def __setup__(cls):\n        super(Group, cls).__setup__()\n        table = cls.__table__()\n        cls._sql_constraints += [\n            ('name_uniq', Unique(table, table.name),\n                'The name of the group must be unique!')\n        ]\n        cls._order.insert(0, ('name', 'ASC'))\n\n    @classmethod\n    def write(cls, *args):\n        super().write(*args)\n        pool = Pool()\n        # Restart the cache on the domain_get method\n        pool.get('ir.rule')._domain_get_cache.clear()\n        # Restart the cache for get_groups\n        pool.get('res.user')._get_groups_cache.clear()\n        # Restart the cache for model access and view\n        pool.get('ir.model.access')._get_access_cache.clear()\n        pool.get('ir.model.field.access')._get_access_cache.clear()\n        ModelView._fields_view_get_cache.clear()\n\n    @classmethod\n    def copy(cls, groups, default=None):\n        if default is None:\n            default = {}\n        default = default.copy()\n\n        new_groups = []\n        for group in groups:\n            i = 1\n            while True:\n                name = '%s (%d)' % (group.name, i)\n                if not cls.search([('name', '=', name)], order=[]):\n                    break\n                i += 1\n            default['name'] = name\n            new_groups.extend(super(Group, cls).copy([group], default=default))\n        return new_groups\n\n    @classmethod\n    def group_parent_all_cte(cls):\n        group = cls.__table__()\n        parents = With('id', 'parent', recursive=True)\n        parents.query = group.select(group.id, group.parent)\n        parents.query |= group.select(group.id, group.id)\n        parents.query |= (group\n            .join(parents, condition=group.parent == parents.id)\n            .select(group.id, parents.parent))\n        return parents\n"
  },
  {
    "path": "trytond/res/group.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <record model=\"res.group\" id=\"group_admin\">\n            <field name=\"name\">Administration</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"group_view_form\">\n            <field name=\"model\">res.group</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">group_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"group_view_tree\">\n            <field name=\"model\">res.group</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">group_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_group_form\">\n            <field name=\"name\">Groups</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">res.group</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_group_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"group_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_group_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_group_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"group_view_form\"/>\n            <field name=\"act_window\" ref=\"act_group_form\"/>\n        </record>\n        <menuitem\n            parent=\"res.menu_res\"\n            action=\"act_group_form\"\n            sequence=\"20\"\n            id=\"menu_group_form\"/>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_group_form_admin\">\n            <field name=\"menu\" ref=\"menu_group_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n\n        <record model=\"ir.model.access\" id=\"access_group\">\n            <field name=\"model\" search=\"[('model', '=', 'res.group')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_group_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'res.group')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/res/ir.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.cache import Cache\nfrom trytond.model import DeactivableMixin, ModelSQL, fields\nfrom trytond.pool import Pool, PoolMeta\nfrom trytond.pyson import Eval\n\n\nclass UIMenu(metaclass=PoolMeta):\n    __name__ = 'ir.ui.menu'\n\n    groups = fields.Many2Many(\n        'ir.ui.menu-res.group', 'menu', 'group', \"Groups\")\n\n\nclass UIMenuGroup(ModelSQL):\n    \"UI Menu - Group\"\n    __name__ = 'ir.ui.menu-res.group'\n    menu = fields.Many2One('ir.ui.menu', 'Menu', ondelete='CASCADE',\n        required=True)\n    group = fields.Many2One('res.group', 'Group', ondelete='CASCADE',\n        required=True)\n\n    @classmethod\n    def create(cls, vlist):\n        res = super(UIMenuGroup, cls).create(vlist)\n        # Restart the cache on the domain_get method\n        Pool().get('ir.rule')._domain_get_cache.clear()\n        return res\n\n    @classmethod\n    def write(cls, records, values, *args):\n        super(UIMenuGroup, cls).write(records, values, *args)\n        # Restart the cache on the domain_get method\n        Pool().get('ir.rule')._domain_get_cache.clear()\n\n    @classmethod\n    def delete(cls, records):\n        super(UIMenuGroup, cls).delete(records)\n        # Restart the cache on the domain_get method\n        Pool().get('ir.rule')._domain_get_cache.clear()\n\n\nclass ActionGroup(ModelSQL):\n    \"Action - Group\"\n    __name__ = 'ir.action-res.group'\n    action = fields.Many2One('ir.action', 'Action', ondelete='CASCADE',\n        required=True)\n    group = fields.Many2One('res.group', 'Group', ondelete='CASCADE',\n        required=True)\n\n    @classmethod\n    def create(cls, vlist):\n        Action = Pool().get('ir.action')\n        vlist = [x.copy() for x in vlist]\n        for vals in vlist:\n            if vals.get('action'):\n                vals['action'] = Action.get_action_id(vals['action'])\n        res = super(ActionGroup, cls).create(vlist)\n        # Restart the cache on the domain_get method\n        Pool().get('ir.rule')._domain_get_cache.clear()\n        return res\n\n    @classmethod\n    def write(cls, records, values, *args):\n        Action = Pool().get('ir.action')\n        actions = iter((records, values) + args)\n        args = []\n        for records, values in zip(actions, actions):\n            if values.get('action'):\n                values = values.copy()\n                values['action'] = Action.get_action_id(values['action'])\n            args.extend((records, values))\n        super(ActionGroup, cls).write(*args)\n        # Restart the cache on the domain_get method\n        Pool().get('ir.rule')._domain_get_cache.clear()\n\n    @classmethod\n    def delete(cls, records):\n        super(ActionGroup, cls).delete(records)\n        # Restart the cache on the domain_get method\n        Pool().get('ir.rule')._domain_get_cache.clear()\n\n\nclass Action(metaclass=PoolMeta):\n    __name__ = 'ir.action'\n\n    groups = fields.Many2Many(\n        'ir.action-res.group', 'action', 'group', \"Groups\")\n\n\nclass ActionMixin(metaclass=PoolMeta):\n\n    @classmethod\n    def get_groups(cls, name, action_id=None):\n        # TODO add cache\n        domain = [\n            (cls._action_name, '=', name),\n            ]\n        if action_id:\n            domain.append(('id', '=', action_id))\n        actions = cls.search(domain)\n        groups = {g.id for a in actions for g in a.groups}\n        return groups\n\n\nclass ActionReport(ActionMixin):\n    __name__ = 'ir.action.report'\n\n\nclass ActionActWindow(ActionMixin):\n    __name__ = 'ir.action.act_window'\n\n\nclass ActionWizard(ActionMixin):\n    __name__ = 'ir.action.wizard'\n\n\nclass ActionURL(ActionMixin):\n    __name__ = 'ir.action.url'\n\n\nclass ActionKeyword(metaclass=PoolMeta):\n    __name__ = 'ir.action.keyword'\n\n    groups = fields.Function(fields.One2Many('res.group', None, 'Groups'),\n        'get_groups', searcher='search_groups')\n\n    def get_groups(self, name):\n        return [g.id for g in self.action.groups]\n\n    @classmethod\n    def search_groups(cls, name, clause):\n        return [('action.' + clause[0],) + tuple(clause[1:])]\n\n\nclass ModelButton(metaclass=PoolMeta):\n    __name__ = 'ir.model.button'\n\n    groups = fields.Many2Many(\n        'ir.model.button-res.group', 'button', 'group', \"Groups\")\n    _groups_cache = Cache('ir.model.button.groups')\n\n    @classmethod\n    def create(cls, vlist):\n        result = super().create(vlist)\n        cls._groups_cache.clear()\n        return result\n\n    @classmethod\n    def write(cls, buttons, values, *args):\n        super().write(buttons, values, *args)\n        cls._groups_cache.clear()\n\n    @classmethod\n    def delete(cls, buttons):\n        super().delete(buttons)\n        cls._groups_cache.clear()\n\n    @classmethod\n    def get_groups(cls, model, name):\n        '''\n        Return a set of group ids for the named button on the model.\n        '''\n        key = (model, name)\n        groups = cls._groups_cache.get(key)\n        if groups is not None:\n            return groups\n        buttons = cls.search([\n                ('model.model', '=', model),\n                ('name', '=', name),\n                ])\n        if not buttons:\n            groups = set()\n        else:\n            button, = buttons\n            groups = set(g.id for g in button.groups)\n        cls._groups_cache.set(key, groups)\n        return groups\n\n\nclass ModelButtonGroup(DeactivableMixin, ModelSQL):\n    \"Model Button - Group\"\n    __name__ = 'ir.model.button-res.group'\n    button = fields.Many2One('ir.model.button', 'Button',\n        ondelete='CASCADE', required=True)\n    group = fields.Many2One('res.group', 'Group', ondelete='CASCADE',\n        required=True)\n\n    @classmethod\n    def create(cls, vlist):\n        pool = Pool()\n        result = super(ModelButtonGroup, cls).create(vlist)\n        # Restart the cache for get_groups\n        pool.get('ir.model.button')._groups_cache.clear()\n        return result\n\n    @classmethod\n    def write(cls, records, values, *args):\n        pool = Pool()\n        super(ModelButtonGroup, cls).write(records, values, *args)\n        # Restart the cache for get_groups\n        pool.get('ir.model.button')._groups_cache.clear()\n\n    @classmethod\n    def delete(cls, records):\n        pool = Pool()\n        super(ModelButtonGroup, cls).delete(records)\n        # Restart the cache for get_groups\n        pool.get('ir.model.button')._groups_cache.clear()\n\n\nclass ModelButtonRule(metaclass=PoolMeta):\n    __name__ = 'ir.model.button.rule'\n    group = fields.Many2One('res.group', \"Group\", ondelete='CASCADE')\n\n\nclass ModelButtonClick(metaclass=PoolMeta):\n    __name__ = 'ir.model.button.click'\n    user = fields.Many2One('res.user', \"User\", ondelete='CASCADE')\n\n\nclass RuleGroup(metaclass=PoolMeta):\n    __name__ = 'ir.rule.group'\n\n    groups = fields.Many2Many(\n        'ir.rule.group-res.group', 'rule_group', 'group', \"Groups\")\n\n\nclass RuleGroupGroup(ModelSQL):\n    \"Rule Group - Group\"\n    __name__ = 'ir.rule.group-res.group'\n    rule_group = fields.Many2One('ir.rule.group', 'Rule Group',\n        ondelete='CASCADE', required=True)\n    group = fields.Many2One('res.group', 'Group', ondelete='CASCADE',\n        required=True)\n\n\nclass SequenceType(metaclass=PoolMeta):\n    __name__ = 'ir.sequence.type'\n    groups = fields.Many2Many('ir.sequence.type-res.group', 'sequence_type',\n            'group', 'User Groups',\n            help='Groups allowed to edit the sequences of this type.')\n\n\nclass SequenceTypeGroup(ModelSQL):\n    'Sequence Type - Group'\n    __name__ = 'ir.sequence.type-res.group'\n    sequence_type = fields.Many2One('ir.sequence.type', 'Sequence Type',\n        ondelete='CASCADE', required=True)\n    group = fields.Many2One('res.group', 'User Groups',\n        ondelete='CASCADE', required=True)\n\n    @classmethod\n    def delete(cls, records):\n        Rule = Pool().get('ir.rule')\n        super(SequenceTypeGroup, cls).delete(records)\n        # Restart the cache on the domain_get method of ir.rule\n        Rule._domain_get_cache.clear()\n\n    @classmethod\n    def create(cls, vlist):\n        Rule = Pool().get('ir.rule')\n        res = super(SequenceTypeGroup, cls).create(vlist)\n        # Restart the cache on the domain_get method of ir.rule\n        Rule._domain_get_cache.clear()\n        return res\n\n    @classmethod\n    def write(cls, records, values, *args):\n        Rule = Pool().get('ir.rule')\n        super(SequenceTypeGroup, cls).write(records, values, *args)\n        # Restart the cache on the domain_get method\n        Rule._domain_get_cache.clear()\n\n\nclass Export(metaclass=PoolMeta):\n    __name__ = 'ir.export'\n\n    groups = fields.Many2Many(\n        'ir.export-res.group', 'export', 'group', \"Groups\",\n        help=\"The user groups that can use the export.\")\n    write_groups = fields.Many2Many(\n        'ir.export-write-res.group', 'export', 'group',\n        \"Modification Groups\",\n        domain=[\n            ('id', 'in', Eval('groups', [])),\n            ],\n        states={\n            'invisible': ~Eval('groups'),\n            },\n        depends=['groups'],\n        help=\"The user groups that can modify the export.\")\n\n\nclass Export_Group(ModelSQL):\n    \"Export Group\"\n    __name__ = 'ir.export-res.group'\n\n    export = fields.Many2One(\n        'ir.export', \"Export\", required=True, ondelete='CASCADE')\n    group = fields.Many2One(\n        'res.group', \"Group\", required=True, ondelete='CASCADE')\n\n\nclass Export_Write_Group(Export_Group):\n    \"Export Modification Group\"\n    __name__ = 'ir.export-write-res.group'\n    _table = None  # Needed to reset Export_Group._table\n"
  },
  {
    "path": "trytond/res/ir.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <record model=\"ir.model.access\" id=\"access_ir_sequence_type\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.sequence.type')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_sequence_type_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.sequence.type')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_ui_icon\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.ui.icon')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_ui_icon_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.ui.icon')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_ui_menu\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.ui.menu')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_ui_menu_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.ui.menu')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_ui_view\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.ui.view')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_ui_view_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.ui.view')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_action\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.action')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_action_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.action')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_action_keyword\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.keyword')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_action_keyword_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.keyword')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_action_report\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.report')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_action_report_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.report')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_action_act_window\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.act_window')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_action_act_window_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.act_window')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_action_act_window_view\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.act_window.view')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_action_act_window_view_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.act_window.view')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_action_act_window_domain\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.act_window.domain')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_action_act_window_domain_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.act_window.domain')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_action_wizard\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.wizard')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_action_wizard_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.wizard')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_action_url\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.url')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_action_url_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.url')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_model\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.model')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_model_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.model')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_model_field\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.model.field')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_model_field_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.model.field')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_model_access\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.model.access')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_model_access_ir_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.model.access')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_model_button\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.model.button')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_model_button_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.model.button')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n\n        <record model=\"ir.model.access\" id=\"access_ir_model_button_rule\">\n            <field name=\"model\"\n                search=\"[('model', '=', 'ir.model.button.rule')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_model_button_rule_admin\">\n            <field name=\"model\"\n                search=\"[('model', '=', 'ir.model.button.rule')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n\n        <record model=\"ir.model.access\" id=\"access_ir_model_button_click\">\n            <field name=\"model\"\n                search=\"[('model', '=', 'ir.model.button.click')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\"\n            id=\"access_ir_model_button_click_admin\">\n            <field name=\"model\"\n                search=\"[('model', '=', 'ir.model.button.click')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n\n        <record model=\"ir.model.access\" id=\"access_ir_model_data\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.model.data')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_cron\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.cron')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_cron_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.cron')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_queue\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.queue')]\"/>\n            <field name=\"perm_read\" eval=\"False\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_queue_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.queue')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_lang\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.lang')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_lang_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.lang')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_translation\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.translation')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_translation_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.translation')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_rule_group\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.rule.group')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_rule_group_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.rule.group')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_rule\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.rule')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_rule_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.rule')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_module\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.module')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_module_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.module')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_module_dependency\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.module.dependency')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_module_dependency_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.module.dependency')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_trigger\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.trigger')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_trigger_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.trigger')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_trigger_log\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.trigger.log')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_trigger_log_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.trigger.log')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule.group\" id=\"rule_group_menu\">\n            <field name=\"name\">User in groups</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.ui.menu')]\"/>\n            <field name=\"global_p\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_menu1\">\n            <field name=\"domain\"\n                eval=\"[('groups', 'in', Eval('groups', []))]\"\n                pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_menu\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_menu2\">\n            <field name=\"domain\" eval=\"[('groups', '=', None)]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_menu\"/>\n        </record>\n        <record model=\"ir.rule.group\" id=\"rule_group_action\">\n            <field name=\"name\">User in groups</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.action')]\"/>\n            <field name=\"global_p\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_action1\">\n            <field name=\"domain\"\n                eval=\"[('groups', 'in', Eval('groups', []))]\"\n                pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_action\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_action2\">\n            <field name=\"domain\" eval=\"[('groups', '=', None)]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_action\"/>\n        </record>\n        <record model=\"ir.rule.group\" id=\"rule_group_action_keyword\">\n            <field name=\"name\">User in groups</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.keyword')]\"/>\n            <field name=\"global_p\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_action_keyword1\">\n            <field name=\"domain\"\n                eval=\"[('groups', 'in', Eval('groups', []))]\"\n                pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_action_keyword\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_action_keyword2\">\n            <field name=\"domain\" eval=\"[('groups', '=', None)]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_action_keyword\"/>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_action_report\">\n            <field name=\"name\">User in groups</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.report')]\"/>\n            <field name=\"global_p\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_action_report1\">\n            <field name=\"domain\"\n                eval=\"[('groups', 'in', Eval('groups', []))]\"\n                pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_action_report\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_action_report2\">\n            <field name=\"domain\" eval=\"[('groups', '=', None)]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_action_report\"/>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_action_act_window\">\n            <field name=\"name\">User in groups</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.act_window')]\"/>\n            <field name=\"global_p\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_action_act_window1\">\n            <field name=\"domain\"\n                eval=\"[('groups', 'in', Eval('groups', []))]\"\n                pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_action_act_window\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_action_act_window2\">\n            <field name=\"domain\" eval=\"[('groups', '=', None)]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_action_act_window\"/>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_action_wizard\">\n            <field name=\"name\">User in groups</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.wizard')]\"/>\n            <field name=\"global_p\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_action_wizard1\">\n            <field name=\"domain\"\n                eval=\"[('groups', 'in', Eval('groups', []))]\"\n                pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_action_wizard\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_action_wizard2\">\n            <field name=\"domain\" eval=\"[('groups', '=', None)]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_action_wizard\"/>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_action_url\">\n            <field name=\"name\">User in groups</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.action.url')]\"/>\n            <field name=\"global_p\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_action_url1\">\n            <field name=\"domain\"\n                eval=\"[('groups', 'in', Eval('groups', []))]\"\n                pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_action_url\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_action_url2\">\n            <field name=\"domain\" eval=\"[('groups', '=', None)]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_action_url\"/>\n        </record>\n\n        <record model=\"ir.action-res.group\" id=\"act_module_activate_upgrade_group_admin\">\n            <field name=\"action\" ref=\"ir.act_module_activate_upgrade\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.action-res.group\" id=\"act_translation_update_group_admin\">\n            <field name=\"action\" ref=\"ir.act_translation_update\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.action-res.group\" id=\"act_translation_export_group_admin\">\n            <field name=\"action\" ref=\"ir.act_translation_export\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.action-res.group\" id=\"act_lang_config\">\n            <field name=\"action\" ref=\"ir.act_lang_config\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_administration_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_administration\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_ui_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_ui\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_icon_form_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_icon_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_menu_tree_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_menu_list\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_view_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_view\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_view_tree_width_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_view_tree_width\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_view_tree_optional_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_view_tree_optional\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_action_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_action\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_act_action_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_act_action\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_action_report_form_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_action_report_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_action_act_window_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_action_act_window\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_action_wizard_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_action_wizard\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_action_url_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_action_url\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_models_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_models\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_model_form_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_model_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"model_model_fields_form_group_admin\">\n            <field name=\"menu\" ref=\"ir.model_model_fields_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_model_access_form_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_model_access_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_model_field_access_form_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_model_field_access_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_sequences_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_sequences\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_sequence_form_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_sequence_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_sequence_strict_form_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_sequence_strict_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_ir_sequence_type_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_ir_sequence_type\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_attachment_form_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_attachment_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_scheduler_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_scheduler\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_cron_form_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_cron_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_localization_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_localization\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_lang_form_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_lang_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_translation_form_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_translation_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_translation_set_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_translation_set\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_translation_clean_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_translation_clean\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_translation_update_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_translation_update\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_translation_export_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_translation_export\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_export_form_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_export_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_rule_group_form_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_rule_group_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_modules_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_modules\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_module_form_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_module_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_config_wizard_item_form_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_config_wizard_item_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_module_activate_upgrade_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_module_activate_upgrade\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_trigger_form_group_admin\">\n            <field name=\"menu\" ref=\"ir.menu_trigger_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n\n        <record model=\"ir.model.button-res.group\"\n            id=\"module_activate_button_group_admin\">\n            <field name=\"button\" ref=\"ir.module_activate_button\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.model.button-res.group\"\n            id=\"module_activate_cancel_button_group_admin\">\n            <field name=\"button\" ref=\"ir.module_activate_cancel_button\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.model.button-res.group\"\n            id=\"module_deactivate_button_group_admin\">\n            <field name=\"button\" ref=\"ir.module_deactivate_button\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.model.button-res.group\"\n            id=\"module_deactivate_cancel_button_group_admin\">\n            <field name=\"button\" ref=\"ir.module_deactivate_cancel_button\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.model.button-res.group\"\n            id=\"module_upgrade_button_group_admin\">\n            <field name=\"button\" ref=\"ir.module_upgrade_button\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.model.button-res.group\"\n            id=\"module_upgrade_cancel_button_group_admin\">\n            <field name=\"button\" ref=\"ir.module_upgrade_cancel_button\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.model.button-res.group\"\n            id=\"cron_run_once_button_group_admin\">\n            <field name=\"button\" ref=\"ir.cron_run_once_button\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.model.button-res.group\"\n            id=\"model_data_sync_button_group_admin\">\n            <field name=\"button\" ref=\"ir.model_data_sync_button\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.model.button-res.group\"\n            id=\"view_show_button_group_admin\">\n            <field name=\"button\" ref=\"ir.view_show_button\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"sequence_type_view_form\">\n          <field name=\"model\">ir.sequence.type</field>\n          <field name=\"inherit\" ref=\"ir.sequence_type_view_form\"/>\n          <field name=\"name\">sequence_type_form</field>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_sequence\">\n            <field name=\"name\">User in groups</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.sequence')]\"/>\n            <field name=\"global_p\" eval=\"True\"/>\n            <field name=\"perm_read\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_sequence\">\n            <field name=\"domain\"\n                eval=\"[('sequence_type.groups', 'in', Eval('groups', []))]\"\n                pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_sequence\"/>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_sequence_strict\">\n            <field name=\"name\">User in groups</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.sequence.strict')]\"/>\n            <field name=\"global_p\" eval=\"True\"/>\n            <field name=\"perm_read\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_sequence_strict\">\n            <field name=\"domain\"\n                eval=\"[('sequence_type.groups', 'in', Eval('groups', []))]\"\n                pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_sequence_strict\"/>\n        </record>\n\n        <record model=\"ir.cron\" id=\"cron_trigger_time\">\n            <field name=\"method\">ir.trigger|trigger_time</field>\n            <field name=\"interval_number\" eval=\"5\"/>\n            <field name=\"interval_type\">minutes</field>\n        </record>\n\n        <record model=\"ir.model.access\" id=\"rule_default_view_tree_state\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.ui.view_tree_state')]\" />\n            <field name=\"perm_read\" eval=\"False\" />\n            <field name=\"perm_write\" eval=\"False\" />\n            <field name=\"perm_create\" eval=\"False\" />\n            <field name=\"perm_delete\" eval=\"False\" />\n        </record>\n        <record model=\"ir.model.access\" id=\"rule_group_view_tree_state\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.ui.view_tree_state')]\" />\n            <field name=\"group\" ref=\"res.group_admin\" />\n            <field name=\"perm_read\" eval=\"True\" />\n            <field name=\"perm_write\" eval=\"True\" />\n            <field name=\"perm_create\" eval=\"True\" />\n            <field name=\"perm_delete\" eval=\"True\" />\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_view_search\">\n            <field name=\"name\">Own view search</field>\n            <field name=\"model\"\n                search=\"[('model', '=', 'ir.ui.view_search')]\"/>\n            <field name=\"global_p\" eval=\"False\"/>\n            <field name=\"default_p\" eval=\"True\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_group_view_search1\">\n            <field name=\"domain\"\n                eval=\"[('user', '=', Eval('user', {}).get('id', -1))]\"\n                pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_view_search\"/>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_view_search_common\">\n            <field name=\"name\">Common view search</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.ui.view_search')]\"/>\n            <field name=\"global_p\" eval=\"False\"/>\n            <field name=\"default_p\" eval=\"True\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_group_view_search_common1\">\n            <field\n                name=\"domain\"\n                eval=\"[('user', '=', None)]\"\n                pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_view_search_common\"/>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_view_search_admin\">\n            <field name=\"name\">Any view search</field>\n            <field name=\"model\"\n                search=\"[('model', '=', 'ir.ui.view_search')]\"/>\n            <field name=\"global_p\" eval=\"False\"/>\n            <field name=\"default_p\" eval=\"False\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule.group-res.group\"\n            id=\"rule_group_view_search_admin_group_admin\">\n            <field name=\"rule_group\" ref=\"rule_group_view_search_admin\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_session\">\n            <field name=\"name\">Own session</field>\n            <field name=\"model\"\n                search=\"[('model', '=', 'ir.session')]\"/>\n            <field name=\"global_p\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_session1\">\n            <field name=\"domain\"\n                eval=\"[('create_uid', '=', Eval('user', {}).get('id', -1))]\"\n                pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_session\"/>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_session_wizard\">\n            <field name=\"name\">Own session</field>\n            <field name=\"model\"\n                search=\"[('model', '=', 'ir.session.wizard')]\"/>\n            <field name=\"global_p\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_session_wizard1\">\n            <field name=\"domain\"\n                eval=\"[('create_uid', '=', Eval('user', {}).get('id', -1))]\"\n                pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_session_wizard\"/>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_ui_menu_favorite\">\n            <field name=\"name\">Own favorite</field>\n            <field name=\"model\"\n                search=\"[('model', '=', 'ir.ui.menu.favorite')]\"/>\n            <field name=\"global_p\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_ui_menu_favorite1\">\n            <field name=\"domain\"\n                eval=\"[('create_uid', '=', Eval('user', {}).get('id', -1))]\"\n                pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_ui_menu_favorite\"/>\n        </record>\n\n        <record model=\"ir.model.access\" id=\"access_message\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.message')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_message_group_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.message')]\"/>\n            <field name=\"group\" ref=\"res.group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"export_view_form\">\n            <field name=\"model\">ir.export</field>\n            <field name=\"inherit\" ref=\"ir.export_view_form\"/>\n            <field name=\"name\">export_form</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"export_view_list\">\n            <field name=\"model\">ir.export</field>\n            <field name=\"inherit\" ref=\"ir.export_view_tree\"/>\n            <field name=\"name\">export_list</field>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_export_read\">\n            <field name=\"name\">User in groups</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.export')]\"/>\n            <field name=\"global_p\" eval=\"False\"/>\n            <field name=\"default_p\" eval=\"True\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_group_export_read1\">\n            <field name=\"domain\" eval=\"[('groups', 'in', Eval('groups', []))]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_export_read\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_group_export_read2\">\n            <field name=\"domain\" eval=\"[('create_uid', '=', Eval('user.id', -1))]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_export_read\"/>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_export_write\">\n            <field name=\"name\">User in modification groups</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.export')]\"/>\n            <field name=\"global_p\" eval=\"False\"/>\n            <field name=\"default_p\" eval=\"True\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_group_export_write1\">\n            <field name=\"domain\" eval=\"[('write_groups', 'in', Eval('groups', []))]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_export_write\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_group_export_write2\">\n            <field name=\"domain\" eval=\"[('create_uid', '=', Eval('user.id', -1))]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_export_write\"/>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_export_any\">\n            <field name=\"name\">Any export</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.export')]\"/>\n            <field name=\"global_p\" eval=\"False\"/>\n            <field name=\"default_p\" eval=\"False\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_group_export_any1\">\n            <field name=\"domain\" eval=\"[]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_export_any\"/>\n        </record>\n        <record model=\"ir.rule.group-res.group\" id=\"rule_group_export_any_admin\">\n            <field name=\"rule_group\" ref=\"rule_group_export_any\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_export_line_read\">\n            <field name=\"name\">User in groups</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.export.line')]\"/>\n            <field name=\"global_p\" eval=\"False\"/>\n            <field name=\"default_p\" eval=\"True\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_group_export_line_read1\">\n            <field name=\"domain\" eval=\"[('export.groups', 'in', Eval('groups', []))]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_export_line_read\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_group_export_line_read2\">\n            <field name=\"domain\" eval=\"[('export.create_uid', '=', Eval('user.id', -1))]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_export_line_read\"/>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_export_line_write\">\n            <field name=\"name\">User in modification groups</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.export.line')]\"/>\n            <field name=\"global_p\" eval=\"False\"/>\n            <field name=\"default_p\" eval=\"True\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_group_export_line_write1\">\n            <field name=\"domain\" eval=\"[('export.write_groups', 'in', Eval('groups', []))]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_export_line_write\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_group_export_line_write2\">\n            <field name=\"domain\" eval=\"[('export.create_uid', '=', Eval('user.id', -1))]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_export_line_write\"/>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_export_line_any\">\n            <field name=\"name\">Any export</field>\n            <field name=\"model\" search=\"[('model', '=', 'ir.export.line')]\"/>\n            <field name=\"global_p\" eval=\"False\"/>\n            <field name=\"default_p\" eval=\"False\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_group_export_line_any1\">\n            <field name=\"domain\" eval=\"[]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_export_line_any\"/>\n        </record>\n        <record model=\"ir.rule.group-res.group\" id=\"rule_group_export_line_any_admin\">\n            <field name=\"rule_group\" ref=\"rule_group_export_line_any\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n\n        <record model=\"ir.model.access\" id=\"access_ir_email_template\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.email.template')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_email_template_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.email.template')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n\n        <record model=\"ir.model.access\" id=\"access_ir_error\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.error')]\"/>\n            <field name=\"perm_read\" eval=\"False\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_ir_error_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'ir.error')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/res/locale/bg.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"Действие - група\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"Бутон\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Потребител\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"Група правила\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"Групи потребители\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"Групи потребители\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Вид последователност\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"Меню\"\n\n#, fuzzy\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"Бутон\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"Достъп до поле\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"Достъп до меню\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"Модел на достъпа\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"Правила\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Потребители\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"Действия\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"Email\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"Език\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"Посока на езика\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"Потребителско име\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"Действие на меню\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"Парола\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"Подпис\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"Лента със статус\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"Предупреждения\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Потребител\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Потребител\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Потребител\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"Потребителско име\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"Потребителско име\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"Винаги\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Име\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Потребител\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"Групите на които е позволено да редактират този вид последователност\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"Действие което ще бъде изпълнено при влизане\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Configure Users\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"Действие - група\"\n\n#, fuzzy\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"Групи потребители\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Send by email a new temporary password to the user\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Cancel\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Validate\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"Бутон модел - група\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"Групи потребители\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"Групи потребители\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"Група правила - Група\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"Вид последователност - Група\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"Потребителско меню - група\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\n#, fuzzy\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Administration\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Потребител\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"Потребител - група\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"Начално конфигуриране на потребител\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"Потребителско предупреждение\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Validate\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"Фактура\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"Членове\"\n\n#, fuzzy\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"Вмимавайте потребителско име да е уникално\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"Сега може да добавите потребители към системата.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"Права за достъп\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"Действия\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"Членство към група\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"Предпочитания\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Потребител\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отказ\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"Добре\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"Добавяне\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"Край\"\n"
  },
  {
    "path": "trytond/res/locale/ca.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grups\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"Acció\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grups\"\n\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grups\"\n\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grups\"\n\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grups\"\n\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grups\"\n\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grups\"\n\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"Grups de modificació\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Exportació\"\n\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Exportació\"\n\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grups\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"Botó\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Usuari\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grups\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"Regla grup\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"Grups d'usuaris\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"Grups d'usuaris\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Tipus de seqüència\"\n\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grups\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menú\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"Botons\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"Accés a camps\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"Accés a menús\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"Accés a models\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"Pare\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"Regles\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Usuaris\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"Accions\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"Aplicacions\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"URL de la insígnia d’avatar\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"Correu electrònic\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grups\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"Direcció idioma\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"Nom usuari\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"Acció menú\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"Contrasenya\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"Hash de la contrasenya\"\n\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Restableix la contrasenya\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"Expiració restableix contrasenya\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"Menú PySON\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"Sessions\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"Firma\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"Progrés\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"Alertes\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"Acció\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Usuari\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Usuari\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"Aplicació\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"Clau\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"Estat\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Usuari\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"Galeta\"\n\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"Nom usuari\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"Galeta del dispositiu\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"Adreça IP\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"Xarxa IP\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"Nom usuari\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"Sempre\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Usuari\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"Els grups d'usuaris que poden utilitzar la exportació.\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"Els grups d'usuari que poden modificar l'exportació.\"\n\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"Els grups que poden editar les seqüències d'aquest tipus.\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"El grup del que heredar els permisos d'accés.\"\n\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"Les accions que s'executaran quan s'identifiqui.\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Grups\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Configura usuaris\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Usuaris\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Restableix la contrasenya\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"Acció - grup\"\n\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"Grups d'exportació\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"Grup de modificació d'exportació\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"\"\n\"La contrasenya no pot ser la mateixa que el correu electrònic de l'usuari.\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"La contrasenya està prohibida.\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"La contrasenya ha de tenir com a mínim %(length)i caràcters.\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"La contrasenya no pot ser la mateixa que el nom d'usuari de l'usuari.\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"La contrasenya no pot ser la mateixa que el nom de l'usuari.\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\"Per motius de registres els usuaris no es poden eliminar, en el seu lloc els\"\n\" podeu de desactivar.\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"Contrasenya per %(login)s\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Envia per correu electrònic una nova contrasenya temporal al usuari\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Cancel·la\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Valida\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Restableix la contrasenya\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"Model Botó - Grup\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"Usuari als grups\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"Usuari als grups\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"Usuari als grups\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"Usuari als grups\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"Usuari als grups\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"Usuari als grups\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"Qualsevol exportació\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"Qualsevol exportació\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"Usuari als grups\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Usuari als grups de modificació\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"Usuari als grups\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Usuari als grups de modificació\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"Usuari als grups\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"Usuari als grups\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"Usuari als grups\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"Sessió pròpia\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"Sessió pròpia\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"Favorit propi\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"Aplicació d'usuari pròpia\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"Qualsevol aplicació d'usuari\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"Advertència pròpia\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"Vista de cerca pròpia\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"Qualsevol vista de cerca\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"Vista de cerca comuna\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"Regla grup - Grup\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"Tipus de seqüència - Grup\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Grups\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Usuaris\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Usuaris\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"Menú UI - Grup\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Administració\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Usuari\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"Usuari - Acció\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"Usuari - Grup\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"Aplicació d'usuari\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"Configuració inicial usuari\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"Dispositiu d'usuari\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"Intent d'inici de sessió\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"Alerta usuari\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Restableix la contrasenya\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\"La contrasenya del teu compte, [1:%(login)s], s'ha resetablert.[2:]\\n\"\n\"                Heu d'establir una nova contraseña des de les preferències del usuari.[3:]\\n\"\n\"                Podeu conectar amb aquesta contraseña temporal [4:%(password)s] a [5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(host)s/#%(database)s]\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"La contrasenya caducarà el [1:%(datetime)s].\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"Cancel·lada\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"Sol·lcitat\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Validada\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"Permisos d'accés\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"Membres\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"Aneu en compte, el nom d'usuari ha de ser únic.\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"Ara podeu afegir usuaris al sistema.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"Permisos d'accés\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"Accions\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"Membres del grup\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"Preferències\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Usuari\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancel·la\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"D'acord\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"Afegeix\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"Finalitza\"\n"
  },
  {
    "path": "trytond/res/locale/cs.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\n#, fuzzy\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Namu\"\n\n#, fuzzy\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"\"\n\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Configure Users\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Send by email a new temporary password to the user\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Cancel\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Validate\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Administration\"\n\n#, fuzzy\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Validate\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\n#, fuzzy\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancel\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"\"\n"
  },
  {
    "path": "trytond/res/locale/de.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppen\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"Aktion\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppe\"\n\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppen\"\n\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppen\"\n\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppen\"\n\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppen\"\n\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppen\"\n\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppen\"\n\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"Gruppen mit Änderungsberechtigung\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Export\"\n\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppe\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Export\"\n\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppe\"\n\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppen\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"Button\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppe\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppe\"\n\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppen\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppe\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"Regel Gruppe\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"Benutzergruppen\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"Benutzergruppen\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Nummernkreistyp\"\n\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppen\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppe\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menü\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"Buttons\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"Zugriffsberechtigung Feld\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"Menü Berechtigungen\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"Rechteverwaltung\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Gruppenname\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"Übergeordnet (Gruppe)\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"Datensatzregeln\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"Aktionen\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"Anwendungen\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"Avatar Badge URL\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"E-Mail\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppen\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"Sprache\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"Sprache Richtung\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"Benutzername\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"Menüaktion\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"Passwort\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"Passwort Hash\"\n\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Passwort zurücksetzen\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"Passwortrücksetzung Verfall\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"PySON Menü\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"Sitzungen\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"Signatur\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"Status Anzeige\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"Warnungen\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"Aktion\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppe\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"Anwendung\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"Schlüssel\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"Status\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"Cookie\"\n\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"Benutzername\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"Geräte Cookie\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"IP-Adresse\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"IP-Netz\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"Anmeldename\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"Immer\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Name\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"Die Benutzergruppe, die den Export verwenden darf.\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"Die Benutzergruppe, die den Export verändern darf.\"\n\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"\"\n\"Gruppen mit der Berechtigung zur Bearbeitung von Nummernkreisen dieses Typs.\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"Die Gruppe von der die Zugriffsberechtigungen geerbt werden.\"\n\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"Diese Aktionen werden nach dem Login ausgeführt.\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Gruppen\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Benutzer konfigurieren\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Passwort zurücksetzen\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"Aktion - Gruppe\"\n\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"Export Gruppe\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"Export Änderung Gruppe\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"\"\n\"Passwort und E-Mail-Adresse des Benutzers müssen unterschiedlich sein.\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"Dieses Passwort ist nicht erlaubt.\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"Das Passwort muss mindestens %(length)i lang sein.\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"Das Passwort und der Benutzername müssen unterschiedlich sein.\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"Das Passwort und der Name des Benutzers müssen unterschiedlich sein.\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\"Aus Dokumentationsgründen können Benutzer nicht gelöscht werden. Sie sollten\"\n\" stattdessen deaktiviert werden.\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"Passwort für %(login)s\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Neues temporäres Passwort als E-Mail an Benutzer senden\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Annullieren\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Bestätigen\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Passwort zurücksetzen\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"Modell Button - Gruppe\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"Benutzer in den Gruppen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"Benutzer in den Gruppen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"Benutzer in den Gruppen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"Benutzer in den Gruppen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"Benutzer in den Gruppen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"Benutzer in den Gruppen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"Alle Exporte\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"Alle Exporte\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"Benutzer in den Gruppen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Benutzer in den Gruppen mit Änderungsberechtigung\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"Benutzer in den Gruppen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Benutzer in den Gruppen mit Änderungsberechtigung\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"Benutzer in den Gruppen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"Benutzer in den Gruppen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"Benutzer in den Gruppen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"Eigene Session\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"Eigene Session\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"Eigene Favoriten\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"Eigene Benutzeranwendung\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"Beliebige Benutzeranwendung\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"Eigene Warnung\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"Eigene Suchansicht\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"Beliebige Suchansicht\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"Allgemeine Filterlesezeichen\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"Gruppenregel - Gruppe\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"Nummernkreistyp - Gruppe\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Gruppen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"Oberfläche Menü - Gruppe\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Gruppe\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Administration\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"Benutzer - Aktion\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"Benutzer - Gruppe\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"Benutzeranwendung\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"Benutzer Konfiguration Init\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"Benutzer Gerät\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"Login Versuch\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"Benutzer Warnung\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Passwort zurücksetzen\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\"Das Passwort für Ihr Konto, [1:%(login)s], wurde zurückgesetzt.[2:]\\n\"\n\"                Sie müssen ein neues über die Benutzereinstellungen vergeben.[3:]\\n\"\n\"                Sie können sich mit diesem temporären Passwort [4:%(password)s] verbinden mit[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"Das Passwort wird in [1:%(datetime)s] ablaufen.\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"Annulliert\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"Angefragt\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Bestätigt\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"Zugriffsberechtigungen\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"Mitglieder\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"\"\n\"Achten Sie darauf, dass ein Anmeldename nur einmal vergeben werden kann.\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"Sie können nun Benutzer für das System hinzufügen.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"Zugriffsberechtigungen\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"Aktionen\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"Gruppenzugehörigkeit\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"Einstellungen\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Benutzer\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Abbrechen\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"Hinzufügen\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"Fertig\"\n"
  },
  {
    "path": "trytond/res/locale/es.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"Acción\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"Grupos de modificación\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Exportación\"\n\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Exportación\"\n\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"Botón\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"Grupo de reglas\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"Grupos de usuarios\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"Grupos de usuarios\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Tipo de secuencia\"\n\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menú\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"Botones\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"Acceso a campos\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"Acceso a menús\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"Acceso a modelos\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"Padre\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"Reglas\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Usuarios\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"Acciones\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"Aplicaciones\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"URL de la insignia del avatar\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"Correo electrónico\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"Dirección del idioma\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"Nombre usuario\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"Acción menú\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"Contraseña\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"Hash de la contraseña\"\n\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Restablecer contraseña\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"Expiración restablecer contraseña\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"Menú PySON\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"Sesiones\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"Firma\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"Barra de estado\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"Avisos\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"Acción\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"Aplicación\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"Clave\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"Estado\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"Cookie\"\n\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"Nombre de usuario\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"Cookie del dispositivo\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"Dirección IP\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"Red IP\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"Nombre usuario\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"Siempre\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Nombre\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"Los grupos de usuarios que pueden utilizar la exportación.\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"Los grupos de usuarios que pueden modificar la exportación.\"\n\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"Los grupos que pueden editar las secuencias de este tipo.\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"El grupo del que heredar los permisos de acceso.\"\n\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"Las acciones que se ejecutarán cuando se identifique.\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Configurar usuarios\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Usuarios\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Restablecer contraseña\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"Acción - Grupo\"\n\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"Grupos de exportación\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"Grupos de modificación de exportación\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"La contraseña no puede ser la misma que el correo del usuario.\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"La contraseña esta prohibida.\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"La contraseña debe tener al menos %(length)i caracteres.\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"\"\n\"La contraseña no puede ser la misma que el nombre de usuario del usuario.\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"La contraseña no puede ser la misma que el nombre del usuario.\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\"Por motivos de registros los usuarios no pueden eliminarse, en su lugar \"\n\"deben ser desactivados.\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"Contraseña para %(login)s\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"\"\n\"Enviar por correo electrónico una nueva contraseña temporal al usuario\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Validar\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Restablecer contraseña\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"Modelo Botón - Grupo\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"Usuario en grupos\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"Usuario en grupos\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"Usuario en grupos\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"Usuario en grupos\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"Usuario en grupos\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"Usuario en grupos\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"Cualquier exportación\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"Cualquier exportación\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"Usuario en grupos\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Usuario en los grupos de modificación\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"Usuario en grupos\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Usuario en los grupos de modificación\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"Usuario en grupos\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"Usuario en grupos\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"Usuario en grupos\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"Sesión propia\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"Sesión propia\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"Favorito propio\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"Aplicación de usuario propia\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"Cualquier aplicación de usuario\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"Advertencia propia\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"Vista de búsqueda propia\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"Cualquier vista de búsqueda\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"Vista de búsqueda común\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"Grupo de reglas - Grupo\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"Tipo de secuencia - Grupo\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Usuarios\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Usuarios\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"Menú UI - Grupo\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Administración\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"Usuario - Acción\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"Usuario - Grupo\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"Aplicación de usuario\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"Configuración inicial usuario\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"Dispositivo del usuario\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"Intento de inicio de sesión\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"Aviso usuario\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Restablecer contraseña\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\"La contraseña para su cuenta, [1:%(login)s], se ha reseteado.[2:]\\n\"\n\"                Debe establecer una nueva desde las preferencias de usuario.[3:]\\n\"\n\"                Puede conectar con esta contraseña temporal [4:%(password)s] a [5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(host)s/#%(database)s]\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"La contraseña caducará en [1:%(datetime)s].\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"Cancelado\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"Solicitado\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Validada\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"Permisos de acceso\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"Miembros\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"Tened cuidado, el nombre de usuario debe ser único.\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"Si quiere, ahora puede añadir más usuarios en el sistema.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"Permisos de acceso\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"Acciones\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"Grupos\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"Preferencias\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"Aceptar\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"Añadir\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"Finalizar\"\n"
  },
  {
    "path": "trytond/res/locale/es_419.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Usuario\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"Las acciones que se ejecutarán al iniciar sesión\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Usuario\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Usuario\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Usuario\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"Si lo desea, ahora puede agregar más usuarios en el sistema.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Usuario\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"\"\n"
  },
  {
    "path": "trytond/res/locale/et.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupid\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"Toiming\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupp\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupid\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupid\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupid\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupid\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupid\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupid\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"Toiming - Grupp\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupp\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupp\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupid\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"Nupp\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupp\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Kasutaja\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Grupp\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupid\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupp\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"Reegli grupp\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"Kasutajagrupid\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"Kasutajagrupid\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Järjekorra tüüp\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupid\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupp\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menüü\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"Nupud\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"Reeglid\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Kasutajad\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"Toimingud\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"Rakendused\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"E-kiri\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupid\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"Keel\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"Logi sisse\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"Menüü toiming\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"Salasõna\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"Salasõna räsi\"\n\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Salasõna lähtestamine\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"Salasõna aegumistähtaeg\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"PySON menüü\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"Seanss\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"Allkiri\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"Olekuriba\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"Hoiatused\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"Toiming\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Kasutaja\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupp\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Kasutaja\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"Rakendus\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"Võti\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"Olek\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Kasutaja\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"Logi sisse\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"IP aadress\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"IP võrk\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"Logi sisse\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"Alati\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Nimi\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Kasutaja\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"Grupid, kellel on lubatud seda tüüpi järjestusi redigeerida\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"Sisselogimisel käivitatavad toimingud\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Grupid\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Kasutajate seadistamine\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Kasutajad\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Salasõna lähtestamine\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"Toiming - Grupp\"\n\n#, fuzzy\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"Kasutajagrupid\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"Salasõna ei tohi olla sama mis kasutaja e-maili aadress.\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"Salasõna on keelatud.\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"Salasõna ei tohi olla sama mis kasutajanimi.\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"Salasõna ei tohi olla sama mis kasutaja nimi.\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Saada kasutajale e-kirjaga uus ajutine salasõna\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Tühista\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Kinnita\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Lähtesta salasõna\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"Kasutaja gruppides\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"Kasutaja gruppides\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"Kasutaja gruppides\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"Kasutaja gruppides\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"Kasutaja gruppides\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"Kasutaja gruppides\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"Kasutaja gruppides\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Kasutaja gruppides\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"Kasutaja gruppides\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Kasutaja gruppides\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"Kasutaja gruppides\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"Kasutaja gruppides\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"Kasutaja gruppides\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"Oma sessioon\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"Oma sessioon\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"Oma sessioon\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"Oma kasutaja aplikatsioon\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"Kõigi kasutajate aplikatsioon\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"Oma teavitus\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"Oma vaate otsing\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"Kõigi vaate otsing\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"Oma vaate otsing\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"Reegli grupp - Grupp\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"Järjestuse grupp -Grupp\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Grupid\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Kasutajad\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Kasutajad\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"Kasutajaliidese menüü - Grupp\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Grupp\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Administreerimine\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Kasutaja\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"Kasutaja - Toiming\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"Kasutaja - Grupp\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"Kasutaja rakendus\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"Kasutaja seadistuste laadimine\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"Sisselogimiskatse\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"Kasutaja hoiatus\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Salasõna lähtestamine\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"Salasõna aegub\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"Tühistatud\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"Taotletud\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Kinnitatud\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"Ligipääsuõigused\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"Liikmed\"\n\n#, fuzzy\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"Kasutajanimi peab olema unikaalne!\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"Süsteemile saab lisada kasutajaid.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"Ligipääsuõigused\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"Toimingud\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"Grupi liikmelisus\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"Eelistused\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Kasutaja\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Tühista\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"Lisa\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"Lõpp\"\n"
  },
  {
    "path": "trytond/res/locale/fa.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"گروه ها\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"اقدام\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"گروه\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"گروه ها\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"گروه ها\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"گروه ها\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"گروه ها\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"گروه ها\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"گروه ها\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"اقدام - گروه\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"گروه\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"گروه\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"گروه ها\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"دکمه\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"گروه\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"کاربر\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"گروه\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"گروه ها\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"گروه\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"گروه قوانین\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"گروه های کاربر\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"گروه های کاربر\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"نوع ادامه\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"گروه ها\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"گروه\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"منو\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"دکمه ها\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"دسترسی فیلد\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"دسترسی منو\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"مدل دسترسی\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"قوانین\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"کاربران\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"اقدامات\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"برنامه های کاربردی\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"ایمیل\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"گروه ها\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"زبان\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"جهت زبان\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"ورود\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"منو اقدامات\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"رمز عبور\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"رمز عبور درهم\"\n\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"بازنشانی رمز عبور\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"بازنشانی رمز عبور منقضی شده\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"منو PySON\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"جلسات\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"امضاء\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"نوار وضعیت\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"هشدارها\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"اقدام\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"کاربر\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"گروه\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"کاربر\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"برنامه کاربردی\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"کلید\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"وضعیت\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"کاربر\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"ورود\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"آدرس آی پی\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"آی پی شبکه\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"ورود\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"همیشه\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"نام\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"کاربر\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"گروه ها مجاز به ویرایش توالی این نوع هستند\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"اقداماتی که در ورود به سیستم باید اجرا شوند\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"گروه ها\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"پیکربندی کاربران\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"کاربران\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"اقدام - گروه\"\n\n#, fuzzy\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"گروه های کاربر\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"رمز عبور نمی تواند همان ایمیل کاربر باشد.\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"رمز عبور ممنوع است.\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"رمز عبور نمیتواند همان نام ورود به سیستم کاربر باشد.\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"رمز عبور نمی تواند مشابه نام کاربر باشد.\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\"برای اهداف ورود به سیستم، کاربران نمی توانند حذف شوند، در عوض آنها را \"\n\"میتوانید غیرفعال کنید.\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Send by email a new temporary password to the user\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Cancel\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Validate\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"مدل دکمه - گروه\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"گروه های کاربر\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"گروه های کاربر\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"گروه قانون - گروه\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"نوع ادامه - گروه\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"گروه ها\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"کاربران\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"کاربران\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"منوی رابط کاربر - گروه\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"گروه\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"مدیریت\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"کاربر\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"کاربر - اقدام\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"کاربر - گروه\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"کاربر برنامه\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"پیکربندی اولیه کاربر\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"تلاش برای ورود\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"هشدار کاربر\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"بازنشانی کلمه عبور\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"کلمه عبور شما منقضی میشود در\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"لغو شده\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"درخواست شده\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"تایید شده\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"مجوزهای دسترسی\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"اعضاء\"\n\n#, fuzzy\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"مراقب باشید ورود به سیستم باید منحصر به فرد باشد!\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"شما هم اکنون می توانید برخی از کاربران را به سیستم اضافه کنید.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"مجوزهای دسترسی\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"اقدامات\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"عضویت در گروه\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"ظاهر برنامه\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"کاربر\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"انصراف\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"قبول\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"افزودن\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"تاریخ پایان\"\n"
  },
  {
    "path": "trytond/res/locale/fi.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\n#, fuzzy\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"\"\n\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Configure Users\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Send by email a new temporary password to the user\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Cancel\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Validate\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Administration\"\n\n#, fuzzy\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Validate\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\n#, fuzzy\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancel\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"\"\n"
  },
  {
    "path": "trytond/res/locale/fr.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groupes\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"Action\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groupe\"\n\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groupes\"\n\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groupes\"\n\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groupes\"\n\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groupes\"\n\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groupes\"\n\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groupes\"\n\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"Groupes de modification\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Export\"\n\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groupe\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Export\"\n\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groupe\"\n\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groupes\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"Bouton\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groupe\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Utilisateur\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Groupe\"\n\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groupes\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groupe\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"Group de règle\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"Groupes d'utilisateurs\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"Groupes d'utilisateur\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Type de séquence\"\n\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groupes\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groupe\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"Boutons\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"Droit d'accès\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"Accès aux menus\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"Accès au modèle\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"Parent\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"Règles\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Utilisateurs\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"Applications\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"URL du badge avatar\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groupes\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"Langue\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"Direction de la langue\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"Identifiant\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"Action menu\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"Mot de passe\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"Hachage de mot de passe\"\n\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Mot de passe de réinitialisation\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"Expiration du mot de passe de réinitialisation\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"Menu PySON\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"Sessions\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"Signature\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"Barre d'état\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"Avertissements\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"Action\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Utilisateur\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groupe\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Utilisateur\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"Application\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"Clé\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"État\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Utilisateur\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"Cookie\"\n\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"Identifiant\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"Cookie de l'appareil\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"Adresse IP\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"Réseau IP\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"Identifiant\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"Toujours\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Nom\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Utilisateur\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"Les groupes d'utilisateurs pouvant utiliser l'export.\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"Les groupes d'utilisateurs pouvant modifier l'export.\"\n\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"Les groupes autorisés à éditer les séquences de ce type.\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"Le groupe à hériter les accès.\"\n\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"Actions à exécuter lors de la connexion.\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groupes\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Configuration des utilisateurs\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Utilisateurs\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Réinitialiser le mot de passe\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"Action - Groupe\"\n\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"Groupe d'export\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"Groupe de modification d'export\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"\"\n\"Le mot de passe ne peut pas être le même que l'adresse e-mail de \"\n\"l'utilisateur.\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"Le mot de passe est interdit.\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"Le mot de passe doit comporter au moins %(length)i caractères.\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"\"\n\"Le mot de passe ne peut pas être le même que l'identifiant de l'utilisateur.\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"Le mot de passe ne peut pas être le même que le nom de l'utilisateur.\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\"Dans le but de la journalisation les utilisateurs ne peuvent pas être \"\n\"supprimés, ils doivent être désactivés à la place.\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"Mot de passe pour %(login)s\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Envoie par e-mail un nouveau mot de passe temporaire à l'utilisateur\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Annuler\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Valider\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Réinitialiser le mot de passe\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"Bouton de modèle - Groupe\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"Utilisateur dans les groupes\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"Utilisateur dans les groupes\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"Utilisateur dans les groupes\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"Utilisateur dans les groupes\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"Utilisateur dans les groupes\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"Utilisateur dans les groupes\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"N'importe quel export\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"N'importe quel export\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"Utilisateur dans les groupes\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Utilisateur dans les groupes de modification\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"Utilisateur dans les groupes\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Utilisateur dans les groupes de modification\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"Utilisateur dans les groupes\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"Utilisateur dans les groupes\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"Utilisateur dans les groupes\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"Session propre\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"Session propre\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"Favori propre\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"Application utilisateur propre\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"N'importe quelle application utilisateur\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"Avertissement propre\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"Recherche de vue propre\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"N'importe quelle recherche de vue\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"Recherche de vue commune\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"Groupe de règle - Groupe\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"Type de séquence - Groupe\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groupes\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Utilisateurs\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Utilisateurs\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"Menu de l'IU - Groupe\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Groupe\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Administration\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Utilisateur\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"Utilisateur - Action\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"Utilisateur - Groupe\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"Application utilisateur\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"Configuration utilisateur initiale\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"Appareil d'utilisateur\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"Tentative d'identification\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"Avertissement utilisateur\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Réinitialisation de mot de passe\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\"Le mot de passe de votre compte, [1:%(login)s], a été réinitialisé.[2:]\\n\"\n\"                Vous devez en définir un nouveau dans les préférences de l'utilisateur.[3:]\\n\"\n\"                Vous pouvez vous connecter avec ce mot de passe temporaire [4:%(password)s] à [5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"Le mot de passe expirera dans [1:%(datetime)s].\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"Annulée\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"Demandée\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Validée\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"Permissions d'accès\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"Membres\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"Veillez à ce que le nom d'utilisateur soit unique.\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"Vous pouvez maintenant ajouter des utilisateur au système.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"Permission d'accès\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"Actions\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"Groupes\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"Préférences\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Utilisateur\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuler\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"Ajouter\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"Terminer\"\n"
  },
  {
    "path": "trytond/res/locale/hu.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Csoportok\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"Művelet\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Csoport\"\n\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Csoportok\"\n\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Csoportok\"\n\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Csoportok\"\n\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Csoportok\"\n\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Csoportok\"\n\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Csoportok\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"Műveletcsoport\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Exportálás\"\n\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Csoport\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Exportálás\"\n\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Csoport\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Csoportok\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"Gomb\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Csoport\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Felhasználó\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Csoport\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Csoportok\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Csoport\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"Szabályos csoport\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"Felhasználócsoport\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"Felhasználócsoport\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Sorszámozás típusa\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Csoportok\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Csoport\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menü\"\n\n#, fuzzy\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"Gomb\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"Hozzáférési engedély mező\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"Menü engedélyek\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"Hozzáférési engedély\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"Szabályok\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Felhasználók\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"Műveletek\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"Külső alkalmazások\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Csoportok\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"Nyelv\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"Nyelv irányzat\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"Felhasználónév\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"Menü művelet\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"Jelszó\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"Jelszó hash\"\n\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Jelszó visszaállítása\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"PySON Menü\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"Szakaszok\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"Aláírás\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"Állapot\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"Figyelmeztetések\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"Művelet\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Felhasználó\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Csoport\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Felhasználó\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"Kulcs\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"Állapot\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Felhasználó\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"Bejelentkezés\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"Bejelentkezés\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"Mindig\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Név\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Felhasználó\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"A típus számkörének feldolgozásához jogosult csoport\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"\"\n\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"Ezek a műveletek bejelentkezés után le fognak futni.\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Csoportok\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Configure Users\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Felhasználók\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Jelszó visszaállítása\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"Műveletcsoport\"\n\n#, fuzzy\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"Felhasználócsoport\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"Ilyen jelszó nem engedélyezett.\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"A jelszó nem egyezhet meg a felhasználónévvel.\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"A jelszó nem egyezhet meg a felhasználó nevével.\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"%(login)s jelszava\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Send by email a new temporary password to the user\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Mégse\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Jóváhagyás\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Jelszó visszaállítása\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"Minta gomb- csoport\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"Felhasználócsoport\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"Felhasználócsoport\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"Csoportszabály- csoport\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"Sorszámozás típusa ‒ csoport\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Csoportok\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Felhasználók\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Felhasználók\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"Menüfelület- csoport\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Csoport\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Adminisztráció\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Felhasználó\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"Felhasználói művelet\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"Felhasználócsoport\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"Felhasználó beállítások Init\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"Bejelentkezés kísérlet\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"Felhasználó figyelmeztetés\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Jelszó visszaállítása\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\"A [1:%(login)s] nevű felhasználójának a jelszavát visszaállítottuk.[2:]\\n\"\n\"                Adjon meg egy újat a Felhasználói beállítások ablakban.[3:]\\n\"\n\"                Most a [4:%(password)s] ideiglenes jelszóval tud bejelentkezni a következő rendszerbe[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(host)s/#%(database)s]\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"Az ideiglenes jelszó az [1:%(datetime)s UTC] időpontig érvényes.\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"érvénytelen\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"jóváhagyott\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"Műveletek\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"Saját csoportjaim\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"Felhasználói beállítások\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Felhasználó\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Mégse\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"Hozzáad\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"Befejezés\"\n"
  },
  {
    "path": "trytond/res/locale/id.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Kelompok\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Kelompok\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Kelompok\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Kelompok\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Kelompok\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Kelompok\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Kelompok\"\n\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Kelompok\"\n\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Kelompok\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Kelompok\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Kelompok\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"Tombol\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Kelompok\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Kelompok\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Kelompok\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Kelompok\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Jenis Urutan\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Kelompok\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Kelompok\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"Tombol\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"Induk\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"Aplikasi-Aplikasi\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"Email\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"Bahasa\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"Login\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"Kata sandi\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Atur Ulang Kata Sandi\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"Menu PySON\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Kelompok\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"Aplikasi\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"Kunci\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"Status\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"Login\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"Alamat IP\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Nama\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"\"\n\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Atur Ulang Kata Sandi\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"Kata sandi tidak boleh sama dengan alamat email pengguna.\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"Kata sandi itu terlarang.\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"Kata sandi tidak boleh sama dengan login pengguna.\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"Kata sandi tidak boleh sama dengan nama pengguna.\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Kirim melalui email kata sandi baru sementara ke pengguna\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Batal\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Atur Ulang Kata Sandi\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"Pengguna dalam kelompok\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"Pengguna dalam kelompok\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"Pengguna dalam kelompok\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"Pengguna dalam kelompok\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"Pengguna dalam kelompok\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"Pengguna dalam kelompok\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"Pengguna dalam kelompok\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"Pengguna dalam kelompok\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"Pengguna dalam kelompok\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"Pengguna dalam kelompok\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"Pengguna dalam kelompok\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Kelompok\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Administrasi\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"Pengguna - Tindakan\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"Pengguna - Kelompok\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"Aplikasi Pengguna\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Atur Ulang Kata Sandi\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"Kata sandi akan kedaluwarsa dalam [1:%(datetime)s].\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"Dibatalkan\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"Izin Akses\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"Anggota\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"Hati-hati karena login harus unik.\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"Anda sekarang dapat menambahkan beberapa pengguna ke dalam sistem.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"Izin Akses\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"Tindakan\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Pengguna\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Batal\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"Tambah\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"Selesai\"\n"
  },
  {
    "path": "trytond/res/locale/it.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppi\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"Azione\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppo\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppi\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppi\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppi\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppi\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppi\"\n\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppi\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"Azione - Gruppo\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Esportazione\"\n\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppo\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Esportazione\"\n\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppo\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppi\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"Bottone\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppo\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Utente\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppo\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppi\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppo\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"Regola Gruppo\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"Gruppi Utente\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"Gruppi Utente\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Tipo Sequenza\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppi\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppo\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"Pulsanti\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"Campo di accesso\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"Menu di accesso\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"Modello di accesso\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"Regole\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Utenti\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"Azioni\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"Applicazioni\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"Email\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Gruppi\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"Lingua\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"Attribuzione Lingua\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"Login\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"Azione di Menu\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"Password\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"Hash della Password\"\n\n#, fuzzy\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"Menu PySON\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"Sessioni\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"Firma\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"Barra di Stato\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"Avvisi\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"Azione\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Utente\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Gruppo\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Utente\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"Applicazione\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"Chiave\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"Stato\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Utente\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"Login\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"Indirizzo IP\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"Rete IP\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"Login\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"Sempre\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Utente\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"Gruppi con permesso di modifica delle sequenze di questo tipo\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"Azioni da fare al login\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Gruppi\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Configure Users\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Utenti\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"Azione - Gruppo\"\n\n#, fuzzy\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"Gruppi Utente\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"Password per %(login)s\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Send by email a new temporary password to the user\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Annulla\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Verifica\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"Modello Biottone - Gruppo\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"Qualsiasi esportazione\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"Qualsiasi esportazione\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"Utente in gruppi\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"Utente in gruppi\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"Utente in gruppi\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"Utente in gruppi\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"Utente in gruppi\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"Propria sessione\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"Propria sessione\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"Qualsiasi applicazione utente\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"Qualsiasi ricerca vista\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"Qualsiasi ricerca vista\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"Regola Gruppo - Gruppo\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"Tipo Sequenza - Gruppo\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Gruppi\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Utenti\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Utenti\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"Menu Interfaccia Utente - Gruppo\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Gruppo\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Amministrazione\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Utente\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"Utente - Azione\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"Utente - Gruppo\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"Applicazione utente\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"Utente Config Init\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"Tentativo di Login\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"Gruppi Utente\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"Annullato\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"Richiesto\"\n\n#, fuzzy\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Validate\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"Permessi di Accesso\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"Membri\"\n\n#, fuzzy\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"Attenzione all'unicità della login\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"Utenti Inseribili a sistema\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"Permessi di Accesso\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"Azioni\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"Appartenenza a Gruppo\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"Preferenze\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Utente\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annulla\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"Inserisci\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"Fine\"\n"
  },
  {
    "path": "trytond/res/locale/lo.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"ກຸ່ມ\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"ການດຳເນີນການ\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"ກຸ່ມ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"ກຸ່ມ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"ກຸ່ມ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"ກຸ່ມ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"ກຸ່ມ\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"ກຸ່ມ\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"ກຸ່ມ\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"ດຳເນີນການ - ກຸ່ມ\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"ກຸ່ມ\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"ກຸ່ມ\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"ກຸ່ມ\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"ປຸ່ມ\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"ກຸ່ມ\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"ຜູ້ໃຊ້\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"ກຸ່ມ\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"ກຸ່ມ\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"ກຸ່ມ\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"ກຸ່ມກົດລະບຽບ\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"ກຸ່ມຜູ້ໃຊ້ງານ\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"ກຸ່ມຜູ້ໃຊ້ງານ\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"ປະເພດລຳດັບ\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"ກຸ່ມ\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"ກຸ່ມ\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"ລາຍການຄຳສັ່ງ\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"ປຸ່ມ\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"ຊ່ອງຂໍ້ມູນທີ່ເຂົ້າເຖິງ\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"ລາຍການຄຳສັ່ງທີ່ເຂົ້າເຖິງ\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"ຮ່າງແບບທີ່ເຂົ້າເຖິງ\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"ກົດລະບຽບ\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"ຜູ້ໃຊ້\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"ດຳເນີນການ\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"ແອັບພຼີເຄເຊິນ\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"ອີເມວລ໌\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"ກຸ່ມ\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"ພາສາ\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"ທິດທາງພາສາ\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"ເຂົ້າສູ່ລະບົບ\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"ລາຍການຄຳສັ່ງດຳເນີນການ\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"ລະຫັດຜ່ານ\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"ສັນຍະລັກລະຫັດຜ່ານ\"\n\n#, fuzzy\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"ລາຍການຄຳສັ່ງ PySON\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"ຄັ້ງ\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"ລາຍເຊັນ\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"ແຖບສະຖານະ\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"ຄຳເຕືອນ\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"ດຳເນີນການ\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"ຜູ້ໃຊ້\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"ກຸ່ມ\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"ຜູ້ໃຊ້\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"ໂປຣແກຣມນຳໃຊ້\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"ຄຳທີ່ເປັນກຸນແຈ\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"ສະຖານະ\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"ຜູ້ໃຊ້\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"ເຂົ້າສູ່ລະບົບ\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"ເຂົ້າສູ່ລະບົບ\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"ເລື້ອຍໆ\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"ຊື່\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"ຜູ້ໃຊ້\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"ກຸ່ມອະນຸຍາດໃຫ້ແກ້ໄຂລຳດັບຂອງປະເພດນີ້\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"ດຳເນີນການ ທີ່ຈະແລ່ນຂຶ້ນ ໃນເວລາ ເຂົ້າສູ່ລະບົບ\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Configure Users\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"ດຳເນີນການ - ກຸ່ມ\"\n\n#, fuzzy\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"ກຸ່ມຜູ້ໃຊ້ງານ\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"ລະຫັດຜ່ານ ບໍ່ສາມາດ ຊິເປັນອັນດຽວກັນກັບຊື່ຜູ້ໃຊ້ ອີເມວລ໌\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"ລະຫັດຜ່ານນີ້ຖືກຫ້າມໃຊ້\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"ລະຫັດຜ່ານ ບໍ່ສາມາດ ເປັນອັນດຽວກັນກັບ ຊື່ ທີ່ໃຊ້ເຊື່ອມຕໍ່ເຂົ້າລະບົບ.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"ລະຫັດຜ່ານ ບໍ່ສາມາດ ເປັນອັນດຽວກັນກັບ ຊື່ ຜູ້ໃຊ້ງານ.\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Send by email a new temporary password to the user\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Cancel\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Validate\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"ແບບປຸ່ມ - ກຸ່ມ\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"ກຸ່ມຜູ້ໃຊ້ງານ\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"ກຸ່ມຜູ້ໃຊ້ງານ\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"ກຸ່ມກົດລະບຽບ - ກຸ່ມ\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"ປະເພດລຳດັບ - ກຸ່ມ\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"ລາຍການຄຳສັ່ງ UI - ກຸ່ມ\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"ກຸ່ມ\"\n\n#, fuzzy\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Administration\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"ຜູ້ໃຊ້\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"ຜູ້ໃຊ້ - ການດຳເນີນການ\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"ຜູ້ໃຊ້ - ກຸ່ມ\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"ໂປຣແກຣມໃຊ້ງານຂອງຜູ້ໃຊ້\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"ກຳນົດຄ່າຜູ້ໃຊ້ງານຂັ້ນພື້ນຖານ\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"ການພະຍາຍາມເຂົ້າສູ່ລະບົບ\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"ຄຳເຕືອນຜູ້ໃຊ້ງານ\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"ຍົກເລີກແລ້ວ\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"ຮ້ອງຂໍແລ້ວ\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"ກວດສອບຄວາມຖືກຕ້ອງແລ້ວ\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"ການອະນຸຍາດເຂົ້າເຖິງ\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"ສະມາຊິກ\"\n\n#, fuzzy\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"ລະວັງ ການເຂົ້າສູ່ລະບົບຕ້ອງບໍ່ຊໍ້າກັນ\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"ບັດນີ້ທ່ານສາມາດເພີ່ມຜູ້ໃຊ້ງານເຂົ້າໃນລະບົບໄດ້ແລ້ວ\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"ການອະນຸຍາດໃຫ້ເຂົ້າເຖິງ\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"ການດຳເນີນການ\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"ສະມາຊິກກຸ່ມ\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"ການປັບແຕ່ງຄ່າ\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"ຜູ້ໃຊ້\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"ຍົກເລີກ\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"ຕົກລົງ\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"ເພີ່ມ\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"ສິ້ນສຸດ\"\n"
  },
  {
    "path": "trytond/res/locale/lt.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupės\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"Veiksmas\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupė\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupės\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupės\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupės\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupės\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupės\"\n\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupės\"\n\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Eksportas\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupė\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Eksportas\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupė\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupės\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"Mygtukas\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupė\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Naudotojas\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Grupė\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupės\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupė\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"Taisyklė grupei\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"Naudotojo grupės\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"Naudotojo grupės\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Numeruotės tipas\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupės\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupė\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"Meniu\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"Mygtukai\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"Lauko prieiga\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"Meniu prieiga\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"Modelio prieiga\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"Taisyklės\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Naudotojai\"\n\n#, fuzzy\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"Veiksmai\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"Programos\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"El.paštas\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupės\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"Kalba\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"Rašymo kryptis\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"Registracijos vardas\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"Meniu veiksmas\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Vardas\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"Slaptažodis\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"Slaptažodžio santrauka\"\n\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Iš naujo nustatyti slaptažodį\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"Atstatyto slaptažodžio galiojimo trukmė\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"PySON meniu\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"Sesijos\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"Parašas\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"Būsenos juosta\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"Perspėjimai\"\n\n#, fuzzy\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"Veiksmai\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Naudotojas\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupės\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Naudotojas\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"Programa\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"Raktas\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"Būsena\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Naudotojas\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"Registracijos vardas\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"IP adresas\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"IP tinklas\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"Registracija\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"Visada\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Pavadinimas\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Naudotojas\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"Naudotojo grupės galinčios naudoti eksportavimą.\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"Naudotojo grupės galinčios keisti eksportavimą.\"\n\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"Grupės galinčios keisti šio tipo numeruotes.\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"\"\n\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"Veiksmai, kurie bus atliekami registruojantis.\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Grupės\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Naudotojų valdymas\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Naudotojai\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Atstatyti slaptažodį\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"Veiksmai - Grupės\"\n\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"Galinčių eksportuoti grupė\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"Galinčių taisyti eksportavimą grupė\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"Slaptažodis negali būti toks pat, kaip naudotojo el.pašto adresas.\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"Slaptažodis neleidžiamas.\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"Slaptažodis negali būti toks pats kaip naudotojo vardas.\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"Slaptažodis negali būti toks pats kaip naudotojo prisijungimo vardas.\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\"Dėl duomenų registravimo naudotojas negali būti ištrintas, vietoj to jis \"\n\"turi būti išjungtas.\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Siųsti naudotojui el.laišku naują laikiną slaptažodį\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Atsisakyti\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Patvirtinti\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Atstatyti slaptažodį\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"Modelio mygtukas - Grupė\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"Naudotojo grupės\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"Naudotojo grupės\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"Naudotojo grupės\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"Naudotojo grupės\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"Naudotojo grupės\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"Naudotojo grupės\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"Bet koks eksportavimas\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"Bet koks eksportavimas\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"Naudotojo grupės\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Naudotojo grupės su taisymo teise\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"Naudotojo grupės\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Naudotojo grupės su taisymo teise\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"Naudotojo grupės\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"Naudotojo grupės\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"Naudotojo grupės\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"Bet kuri naudotojo programa\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"Grupės taisyklė - grupė\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"Numeruotės tipas - grupė\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Grupės\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Naudotojai\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Naudotojai\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"Naudotojo meniu - grupė\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Grupė\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Valdymas\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Naudotojas\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"Naudotojas - Veiksmas\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"Naudotojas - Grupė\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"Naudotojo taikomoji programa\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"Bandymas prisijungti\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"Perspėjimai naudotojui\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Atstatyti slaptažodį\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"Slaptažodžio galiojimas baigsis\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"Pabaigta\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"Užklausta\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Patvirtinta\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"Prieigos leidimai\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"Nariai\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"Įsitikinkite, kad prisijungimo vardas yra unikalus.\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"Galite pridėti sistemos naudotojus.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"Prieigos leidimai\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"Veiksmai\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"Priklauso grupei\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"Nustatymai\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Naudotojas\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Atsisakyti\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"Gerai\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"Pridėti\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"Pabaigti\"\n"
  },
  {
    "path": "trytond/res/locale/nl.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groepen\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"Actie\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groep\"\n\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groepen\"\n\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groepen\"\n\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groepen\"\n\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groepen\"\n\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groepen\"\n\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groepen\"\n\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"Wijzigings groepen\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Exporteren\"\n\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groep\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Exporteren\"\n\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groep\"\n\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groepen\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"Knop\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groep\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Gebruiker\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Groep\"\n\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groepen\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groep\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"Regelgroep\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"Gebruikersgroepen\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"Gebruikersgroepen\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Reeks type\"\n\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groepen\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groep\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"Knoppen\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"Toegang veld\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"Toegang menu\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"Toegang model\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"Bovenliggend\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"Regels\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Gebruikers\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"Acties\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"Toepassingen\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"Avatar-badge-URL\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groepen\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"Taal\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"Taalrichting\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"Inlognaam\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"Menu Actie\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"Wachtwoord\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"Wachtwoord Hash\"\n\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset wachtwoord\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"Reset wachtwoord verlopen\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"PySON menu\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"Sessies\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"Handtekening\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"Statusbalk\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"Waarschuwing\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"Actie\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Gebruiker\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groep\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Gebruiker\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"Toepassingen\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"Sleutel\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"Status\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Gebruiker\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"Cookie\"\n\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"Inlognaam\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"Apparaatcookie\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"IP Adres\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"IP-netwerk\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"Inlognaam\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"Altijd\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Naam\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Gebruiker\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"De gebruikersgroepen die de export kunnen gebruiken.\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"De gebruikersgroepen die de export kunnen wijzigen.\"\n\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"Groepen die dit type reeksen mogen bewerken.\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"De groep waarvan de rechten worden overgenomen.\"\n\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"Deze acties worden na het inloggen uitgevoerd.\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groepen\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Gebruikers configureren\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Gebruikers\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Reset wachtwoord\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"Actie - Groep\"\n\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"Exporteer groep\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"Exporteer modificatiegroep\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"\"\n\"Het wachtwoord mag niet hetzelfde zijn als het e-mailadres van de gebruiker.\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"Dit wachtwoord is niet toegestaan.\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"Het wachtwoord moet minimaal %(length)i tekens bevatten.\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"\"\n\"Het wachtwoord mag niet hetzelfde zijn als de gebruikersnaam van de \"\n\"gebruiker.\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"Het wachtwoord mag niet hetzelfde zijn als de gebruikersnaam.\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\"Voor logboekdoeleinden kunnen gebruikers niet worden verwijderd, maar moeten\"\n\" ze worden gedeactiveerd.\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"Wachtwoord voor %(login)s\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Stuur per e-mail een tijdelijk wachtwoord naar de gebruiker\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Annuleer\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Bevestigen\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Reset wachtwoord\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"Modelknop - groep\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"Gebruiker in groepen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"Gebruiker in groepen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"Gebruiker in groepen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"Gebruiker in groepen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"Gebruiker in groepen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"Gebruiker in groepen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"Elke export\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"Elke export\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"Gebruiker in groepen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Gebruiker in modificatiegroepen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"Gebruiker in groepen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Gebruiker in modificatiegroepen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"Gebruiker in groepen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"Gebruiker in groepen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"Gebruiker in groepen\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"Eigen sessie\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"Eigen sessie\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"Eigen favoriet(en)\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"Eigen gebruikersapplicatie\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"Elke gebruikerstoepassing\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"Eigen waarschuwing\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"Eigen zoek weergave\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"Elke weergave zoeken\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"Gemeenschappelijke zoekfunctie\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"Regelgroep - Groep\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"Reeks type - Groep\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groepen\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Gebruikers\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Gebruikers\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"UI-menu - Groep\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Groep\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Systeembeheer\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Gebruiker\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"Gebruiker - Actie\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"Gebruiker - Groep\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"Gebruikerstoepassing\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"Gebruiker configuratie start\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"Gebruikersapparaat\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"Inlogpoging\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"Gebruikerswaarschuwing\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset wachtwoord\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\"Het wachtwoord voor uw account, [1:%(login)s], is opnieuw ingesteld.[2:]\\n\"\n\"                U moet er een nieuw aanmaken in de gebruikers voorkeuren[3:]\\n\"\n\"               U kunt verbinding maken met dit tijdelijke wachtwoord [4:%(password)s] op[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(host)s/#%(database)s]\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"Het wachtwoord verloopt op [1:%(datetime)s].\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"Geannuleerd\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"Aangevraagd\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Bevestigd\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"Toegangsrechten\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"Leden\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"Letop: De login moet uniek zijn.\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"Er kunnen nu gebruikers toegevoegd worden aan het systeem.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"Toegangsrechten\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"Acties\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"Groepslidmaatschap\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"Voorkeuren\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Gebruiker\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Annuleer\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"Ok\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"Toevoegen\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"Einde\"\n"
  },
  {
    "path": "trytond/res/locale/pl.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupy\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"Akcja\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupa\"\n\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupy\"\n\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupy\"\n\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupy\"\n\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupy\"\n\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupy\"\n\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupy\"\n\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"Grupy zezwalające na modyfikację\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Eksportuj\"\n\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupa\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Eksportuj\"\n\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupa\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupy\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"Przycisk\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupa\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Użytkownik\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Grupa\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupy\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupa\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"Grupa reguł\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"Grupy użytkownika\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"Grupy użytkownika\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Typ sekwencji\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupy\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupa\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"Przyciski\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"Pole dostępu\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"Menu dostępu\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"Model dostępu\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"Reguły\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Użytkownicy\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"Akcje\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"Aplikacje\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"E-mail\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupy\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"Język\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"Kierunek pisania\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"Login\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"Menu akcji\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"Hasło\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"Hasło zakodowane\"\n\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset hasła\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"Wygaśnięcie resetowania hasła\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"Menu PySON\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"Sesje\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"Podpis\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"Pasek stanu\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"Ostrzeżenia\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"Akcja\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Użytkownik\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupa\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Użytkownik\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"Aplikacja\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"Klucz\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"Stan\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Użytkownik\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"Login\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"Adres IP\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"IP sieci\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"Login\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"Zawsze\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Nazwa\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Użytkownik\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"Grupy użytkowników zezwalająca na wykonywanie eksportu.\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"Grupy użytkowników zezwalające na modyfikowanie eksportu.\"\n\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"Grupy uprawnione do edycji tego typu sekwencji.\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"\"\n\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"Akcje, które zostaną wykonane podczas logowania.\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Grupy\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Konfiguruj ustawienia użytkowników\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Użytkownicy\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"Akcja - Grupa\"\n\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"Grupy zezwalające na eksport\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"Grupa zezwalająca na modyfikowanie eksportu\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"Hasło nie może być takie samo jak adres e-mail użytkownika.\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"Takie hasło jest niedozwolone.\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"Hasło nie może być takie samo jak login użytkownika.\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"Hasło nie może być takie samo jak nazwa użytkownika.\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\"Z powodu zapisów w dziennikach użytkownicy nie mogą zostać usunięci. W \"\n\"zamian należy ich zdezaktywować.\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"Hasło użytkownika: %(login)s\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Wyślij do użytkownika e-mailem nowe tymczasowe hasło\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Anuluj\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Wykonaj walidację\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"Przycisk modelu - Grupa\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"Użytkownik w grupach\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"Użytkownik w grupach\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"Użytkownik w grupach\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"Użytkownik w grupach\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"Użytkownik w grupach\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"Użytkownik w grupach\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"Dowolny eksport\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"Dowolny eksport\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"Użytkownik w grupach\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Użytkownik w grupach zezwalających na modyfikacje\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"Użytkownik w grupach\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Użytkownik w grupach zezwalających na modyfikacje\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"Użytkownik w grupach\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"Użytkownik w grupach\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"Użytkownik w grupach\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"Własna sesja\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"Własna sesja\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"Własne ulubione\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"Własna aplikacja użytkownika\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"Dowolna aplikacja użytkownika\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"Własne ostrzeżenie\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"Własny widok wyszukiwania\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"Dowolny widok wyszukiwania\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"Wspólny widok wyszukiwania\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"Grupa reguł - Grupa\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"Typ sekwencji - Grupa\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Grupy\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Użytkownicy\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Użytkownicy\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"UI Menu - Grupa\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Grupa\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Administracja\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Użytkownik\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"Użytkownik - Akcja\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"Użytkownik - Grupa\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"Aplikacja użytkownika\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"Wstępne ustawienia użytkownika\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"Próba logowania\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"Ostrzeżenie użytkownika\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Zresetuj hasło\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\"Hasło do twojego konta, [1:%(login)s], zostało zresetowane.[2:]\\n\"\n\"                Musisz ustawić nowe hasło w preferencjach użytkownika.[3:]\\n\"\n\"                Możesz połączyć się używając tymczasowego hasła [4:%(password)s] do [5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(host)s/#%(database)s]\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"Hasło wygaśnie o [1:%(datetime)s UTC].\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"Anulowano\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"Zażądany\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Potwierdzony\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"Prawa dostępu\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"Członkowie\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"Pamiętaj, że login musi być unikatowy.\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"Teraz możesz dodać do systemu kilku użytkowników.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"Prawa dostępu\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"Akcje\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"Członkostwo grupy\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"Preferencje\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Użytkownik\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Anuluj\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"Dodaj\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"Koniec\"\n"
  },
  {
    "path": "trytond/res/locale/pt.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"Ação\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"Ação - Grupo\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"Botão\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Usuário\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"Regra do Grupo\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"Grupos do Usuário\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"Grupos do Usuário\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Tipo de Sequência\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"Menu\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"Botões\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"Acesso ao Campo\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"Acesso ao Menu\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"Acesso ao Modelo\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"Regras\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Usuários\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"Ações\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"Aplicações\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"Email\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"Idioma\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"Direção de Idioma\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"Nome de Usuário\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"Ação de Menu\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"Senha\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"Hash de Senha\"\n\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Redefinir senha\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"Redefinir Senha Expira\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"Menu PySON\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"Sessões\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"Assinatura\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"Barra de Status\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"Alertas\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"Ação\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Usuário\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Usuário\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"Aplicação\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"Chave\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"Estado\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Usuário\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"Nome de Usuário\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"Endereço IP\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"Rede IP\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"Nome de Usuário\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"Sempre\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Nome\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Usuário\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"Grupos que possuem permissão para editar sequências deste tipo\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"Ações que serão executadas ao entrar\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Configurar Usuários\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Usuários\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"Ação - Grupo\"\n\n#, fuzzy\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"Grupos de Usuários\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"A senha não pode ser a mesma que o email.\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"A senha é proibida.\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"A senha não pode ser a mesma que o nome de usuário.\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"A senha não pode ser a mesma que o nome.\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\"Usuários não podem ser excluídos por questões de registro, eles devem ser \"\n\"desativados.\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Send by email a new temporary password to the user\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Cancel\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Validate\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"Modelo Botão - Grupo\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"Grupos de Usuários\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"Grupos de Usuários\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"Regra Grupo - Grupo\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"Sequência Tipo - Grupo\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Grupos\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Usuários\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Usuários\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"UI Menu - Grupo\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Grupo\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Administração\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Usuário\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"Usuário - Ação\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"Usuário - Grupo\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"Aplicação do Usuário\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"Init de Configuração de Usuário\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"Tentativa de Entrar\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"Alerta de Usuário\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Redefinir senha\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"A senha irá expirar em\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"Cancelado\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"Solicitado\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Validado\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"Permissões de acesso\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"Membros\"\n\n#, fuzzy\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"O nome de usuário deve ser único!\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"Você já pode adicionar usuários ao sistema.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"Permissões de Acesso\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"Ações\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"Grupos\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"Preferências\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Usuário\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancelar\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"Adicionar\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"Fim\"\n"
  },
  {
    "path": "trytond/res/locale/ro.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupuri\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"Acțiune\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupuri\"\n\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupuri\"\n\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupuri\"\n\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupuri\"\n\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupuri\"\n\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupuri\"\n\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"Modificare Grupuri\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Export\"\n\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Export\"\n\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupuri\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"Buton\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Utilizator\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupuri\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"Grup de Reguli\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"Grupuri de utilizatori\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"Grupuri de utilizatori\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Tip de secvență\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupuri\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"Meniul\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"Butoane\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"Acces la Câmp\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"Acces Menu\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"Acces Model\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"Părinte\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"Reguli\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Utilizatori\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"Acţiuni\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"Aplicații\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"URL Avatar\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"Email\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Grupuri\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"Limba\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"Direcția limbii\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"Autentificare\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"Meniu Acțiune\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"Parola\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"Valoarea de distribuire al Parolei\"\n\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Reseteaza parola\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"Resetare Parola Expira\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"Meniul PySON\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"Sesiuni\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"Semnătură\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"Bara de stare\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"Avertizări\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"Acțiune\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Utilizator\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Utilizator\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"Aplicația\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"Cheie\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"Stat\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Utilizator\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"Cookie\"\n\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"Autentificare\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"Cookie de dispozitiv\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"Adresa IP\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"Rețea IP\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"Autentificare\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"Mereu\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Denumire\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Utilizator\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"Grupurile de utilizatori care pot utiliza exportul.\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"Grupuri de utilizatori care pot modifica exportul.\"\n\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"Grupuri permise să editeze secvențele de acest tip.\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"Grupul de la care se moştenesc permisiuni.\"\n\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"Acțiuni care vor fi rulate la conectare.\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Grupuri\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Configurați utilizatorii\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Utilizatori\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Resetare parola\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"Acțiune - Grup\"\n\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"Grup de export\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"Grupul de modificare a exportului\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"Parola nu poate fi aceeași cu adresa de e-mail a utilizatorului.\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"Parola este interzisă.\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"Parola trebuie să aibă cel puțin %(length)i caractere.\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"Parola nu poate fi aceeași cu utilizatorul.\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"Parola nu poate fi aceeași cu utilizatorul.\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\"În scopuri de înregistrare, utilizatorii nu pot fi șterse, ci trebuie \"\n\"dezactivați.\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"Parola pentru %(login)s\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Trimitere utilizatorului o parola temporara\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Anulare\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Validare\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Resetare Parola\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"Buton Model - Grup\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"Utilizator în grupuri\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"Utilizator în grupuri\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"Utilizator în grupuri\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"Utilizator în grupuri\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"Utilizator în grupuri\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"Utilizator în grupuri\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"Orice export\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"Orice export\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"Utilizator în grupuri\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Utilizator în grupuri de modificare\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"Utilizator în grupuri\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Utilizator în grupuri de modificare\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"Utilizator în grupuri\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"Utilizator în grupuri\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"Utilizator în grupuri\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"Sesiune proprie\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"Sesiune proprie\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"Favorit propriu\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"Aplicație de utilizator proprie\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"Orice aplicație de utilizator\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"Avertisment propriu\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"Căutare proprie vedere\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"Orice căutare a vizualizărilor\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"Căutare vizuală comună\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"Grup de Reguli - Grup\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"Tipul secvenței - grup\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Grupuri\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Utilizatori\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Utilizatori\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"Meniu UI - Grup\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Grup\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Administrare\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Utilizator\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"Utilizator - Acțiune\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"Utilizator - Grup\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"Aplicație utilizator\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"Config Utilizator - Init\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"Dispozitiv al Utilizatorului\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"Încercare de conectare\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"Avertisment utilizator\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Resetare parola\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\"Parolă pentru contul dvs, [1:%(login)s], a fost resetat.[2:]\\n\"\n\"Trebuie să setaţi o parolă noua de la preferinţele al utilizatorului.[3:]\\n\"\n\"Vă puteţi autentifica cu aceasta parolă temporară: [4:%(password)s] până la [5:]\\n\"\n\"[6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"[8:%(host)s/#%(database)s]\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"Parola va expira in [1:%(datetime)s].\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"Anulat\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"Solicitat\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Validat\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"Permisiuni de acces\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"Membri\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"Atenție, datele de logare trebuie să fie unice.\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"Acum se pot adaugă utilizatori în sistem.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"Permisiuni de acces\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"Acţiuni\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"Membru al grupului\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"Preferințe\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Utilizator\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Anulare\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"OK\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"Adăuga\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"Sfârșit\"\n"
  },
  {
    "path": "trytond/res/locale/ru.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Группы\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Группа\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Группы\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Группы\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Группы\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Группы\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Группы\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Группы\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"Действия - Группы\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Группа\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Группа\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Группы\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"Кнопка\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Группа\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Пользователь\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Группа\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Группы\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Группа\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"Правило группы\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"Группы пользователя\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"Группы пользователя\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Тип нумерации\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Группы\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Группа\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"Меню\"\n\n#, fuzzy\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"Кнопка\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"Поле доступа\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"Меню доступа\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"Доступ к модели\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"Правила\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Пользователи\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"Действия\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"Эл.почта\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Группы\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"Язык\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"Направления языка\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"Логин\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"Действия Меню\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Полное имя\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"Пароль\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"Меню PySON\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"Сессии\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"Подпись\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"Строка состояния\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"Предупреждения\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"Действие\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Пользователь\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Группа\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Пользователь\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Пользователь\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"Логин\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"Логин\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"Всегда\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Наименование\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Пользователь\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"Группы которым разрешено редактирование нумерации этого типа\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"Действия выполняемые при входе\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Configure Users\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"Действия - Группы\"\n\n#, fuzzy\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"Группы пользователя\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Send by email a new temporary password to the user\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Cancel\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Validate\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"Кнопка модели - Группа\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"Группы пользователя\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"Группы пользователя\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"Правило группы - Группа\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"Тип нумерации - Группа\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"Пользовательское меню - Группа\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Группа\"\n\n#, fuzzy\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Administration\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Пользователь\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"Пользователь - Действия\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"Пользователь - Группа\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"Инициализация конфигурации пользователя\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"Попытка входа\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"Внимание Пользователь\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Validate\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"Права доступа\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"Члены группы\"\n\n#, fuzzy\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"Будьте внимательны - имена пользователей должны быть уникальными!\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"Теперь вы можете добавить пользователей в базу данных.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"Права доступа\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"Действия\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"Входит в группы\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"Ссылки\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Пользователь\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Отменить\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"Ок\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"Добавить\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"Закончить\"\n"
  },
  {
    "path": "trytond/res/locale/sl.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Skupine\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"Ukrep\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Skupina\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Skupine\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Skupine\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Skupine\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Skupine\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Skupine\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Skupine\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"Ukrep - Skupina\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Skupina\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Skupina\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Skupine\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"Gumb\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Skupina\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Uporabnik\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Skupina\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Skupine\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Skupina\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"Skupina pravila\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"Uporabniške skupine\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"Uporabniške skupine\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Tip štetja\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Skupine\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Skupina\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"Meni\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"Gumbi\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"Dostop do polj\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"Dostop do menijev\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"Dostop do modelov\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"Pravila\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Uporabniki\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"Ukrepi\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"Aplikacije\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"E-pošta\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Skupine\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"Jezik\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"Smer jezika\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"Prijava\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"Izhodiščni meni\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"Geslo\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"Zgoščena vrednost gesla\"\n\n#, fuzzy\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"PySON meni\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"Seje\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"Podpis\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"Statusna vrstica\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"Opozorila\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"Ukrep\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Uporabnik\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Skupina\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Uporabnik\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"Aplikacija\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"Ključ\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"Stanje\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Uporabnik\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"Prijava\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"Prijava\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"Vedno\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Naziv\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Uporabnik\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"Skupine, ki omogočajo urejanje ta oštevilčenja\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"Ukrepi, ki se zaženejo ob prijavi\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Configure Users\"\n\n#, fuzzy\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"Ukrep - Skupina\"\n\n#, fuzzy\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"Uporabniške skupine\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"Geslo mora biti različno od elektronskega naslova uporabnika.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"Geslo je prepovedano.\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"Geslo mora biti različno od uporabnikove prijave.\"\n\n#, fuzzy\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"Geslo mora biti različno od uporabniškega imena.\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Send by email a new temporary password to the user\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Cancel\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Validate\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"Model Gumb - Skupina\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"Uporabniške skupine\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"Uporabniške skupine\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"Skupina pravila - Skupina\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"Tip štetja - Skupina\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\n#, fuzzy\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"UI meni - Skupina\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Skupina\"\n\n#, fuzzy\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Administration\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Uporabnik\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"Uporabnik - Ukrep\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"Uporabnik - Skupina\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"Uporabniška aplikacija\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"Začetna nastavitev uporabnika\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"Poskus prijave\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"Uporabniško opozorilo\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"Preklicano\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"Zahtevano\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Odobreno\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"Dostop\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"Člani\"\n\n#, fuzzy\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"Upoštevajte, da mora biti prijava edinstvena.\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"Sedaj lahko v sistem dodajate uporabnike.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"Dostop\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"Ukrepi\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"Članstvo v skupinah\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"Nastavitve\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Uporabnik\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Prekliči\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"V redu\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"Dodaj\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"Zapri\"\n"
  },
  {
    "path": "trytond/res/locale/tr.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\n#, fuzzy\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\n#, fuzzy\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\n#, fuzzy\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"\"\n\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"\"\n\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Configure Users\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Send by email a new temporary password to the user\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Cancel\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Validate\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Groups\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Users\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Groups\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Administration\"\n\n#, fuzzy\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Reset Password\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Validate\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Users\"\n\n#, fuzzy\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Cancel\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"\"\n"
  },
  {
    "path": "trytond/res/locale/uk.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"Дія\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"Групи модифікації\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Експорт\"\n\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"Експорт\"\n\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"Кнопка\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"Користувач\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"Група правил\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"Групи користувача\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"Групи користувача\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"Тип послідовності\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"Меню\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"Кнопки\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"Доступ до полів\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"Доступ до меню\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"Доступ до моделей\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"Батько\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"Правила\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"Користувачі\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"Дії\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"Програми\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"URL значка аватара\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"Ел.пошта\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"Мова\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"Напрямок мови\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"Логін\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"Дія меню\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"Ім'я\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"Пароль\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"Хеш пароля\"\n\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"Скинути пароль\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"Термін скидання пароля закінчується\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"Меню PySON\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"Сеанси\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"Підпис\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"Панель стану\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"Попередження\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"Дія\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"Користувач\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"Користувач\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"Програма\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"Ключ\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"Стан\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"Користувач\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"Куки\"\n\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"Логін\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"Куки пристрою\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"IP адреса\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"IP мережа\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"Логін\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"Завжди\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"Найменування\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"Користувач\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"Групи користувачів, які можуть використовувати експорт.\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"Групи користувачів, які можуть змінювати експорт.\"\n\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"Групи, яким дозволено редагування послідовностей цього типу.\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"Група для успадкування прав доступу.\"\n\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"Дії, які виконуються під час входу до системи.\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"Налаштувати користувачів\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"Користувачі\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"Скинути пароль\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"Дія - Група\"\n\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"Експортувати групу\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"Експортувати групу модифікації\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"Пароль не може співпадати з адресою ел.пошти користувача.\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"Пароль заборонений.\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"Пароль має містити принаймні %(length)i символів.\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"Пароль не може співпадати з логіном користувача.\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"Пароль не може співпадати з ім'ям користувача.\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"\"\n\"З метою ведення журналу користувачів не можна видалити, натомість їх слід \"\n\"деактивувати.\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"Пароль для %(login)s\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"Надіслати користувачеві ел.поштою новий тимчасовий пароль\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"Скасувати\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"Перевірити\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"Скинути пароль\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"Кнопка моделі - Група\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"Групи користувача\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"Групи користувача\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"Групи користувача\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"Групи користувача\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"Групи користувача\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"Групи користувача\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"Будь-який експорт\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"Будь-який експорт\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"Групи користувача\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Групи модифікації користувача\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"Групи користувача\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"Групи модифікації користувача\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"Групи користувача\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"Групи користувача\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"Групи користувача\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"Власний сеанс\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"Власний сеанс\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"Власне вибране\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"Власна програма користувача\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"Будь-яка програма користувача\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"Власне попередження\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"Власний пошук\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"Будь-який пошук\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"Загальний пошук\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"Група правил - Група\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"Тип послідовності - Група\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"Групи\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"Користувачі\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"Користувачі\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"Меню користувача - Група\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"Група\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"Адміністрування\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"Користувач\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"Користувач - Дія\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"Користувач - Група\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"Програма користувача\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"Ініціалізація конфігурації користувача\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"Пристрій користувача\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"Спроба входу\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"Попередження користувача\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"Скинути пароль\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\"Пароль вашого облікового запису, [1:%(login)s], було скинуто.[2:]\\n\"\n\"    Ви повинні встановити новий пароль у налаштуваннях користувача.[3:]\\n\"\n\"    Ви можете підключитися за допомогою тимчасового паролю [4:%(password)s] до[5:]\\n\"\n\"    [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"    [8:%(http_host)s/#%(database)s]\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"Термін дії пароля закінчиться [1:%(datetime)s].\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"Скасовано\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"Запитано\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"Перевірено\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"Права доступу\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"Члени\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"Будьте обережні, логін має бути унікальним.\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"Тепер ви можете додати користувачів системи.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"Права доступу\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"Дії\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"Членство в групах\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"Налаштування\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"Користувач\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"Скасувати\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"Гаразд\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"Додати\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"Кінець\"\n"
  },
  {
    "path": "trytond/res/locale/zh_CN.po",
    "content": "#\nmsgid \"\"\nmsgstr \"Content-Type: text/plain; charset=utf-8\\n\"\n\nmsgctxt \"field:ir.action,groups:\"\nmsgid \"Groups\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.action-res.group,action:\"\nmsgid \"Action\"\nmsgstr \"操作\"\n\nmsgctxt \"field:ir.action-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.action.act_window,groups:\"\nmsgid \"Groups\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.action.keyword,groups:\"\nmsgid \"Groups\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.action.report,groups:\"\nmsgid \"Groups\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.action.url,groups:\"\nmsgid \"Groups\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.action.wizard,groups:\"\nmsgid \"Groups\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.export,groups:\"\nmsgid \"Groups\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.export,write_groups:\"\nmsgid \"Modification Groups\"\nmsgstr \"修改组\"\n\nmsgctxt \"field:ir.export-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"导出\"\n\nmsgctxt \"field:ir.export-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"组\"\n\nmsgctxt \"field:ir.export-write-res.group,export:\"\nmsgid \"Export\"\nmsgstr \"导出\"\n\nmsgctxt \"field:ir.export-write-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"组\"\n\n#, fuzzy\nmsgctxt \"field:ir.model.button,groups:\"\nmsgid \"Groups\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.model.button-res.group,button:\"\nmsgid \"Button\"\nmsgstr \"按钮\"\n\nmsgctxt \"field:ir.model.button-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.model.button.click,user:\"\nmsgid \"User\"\nmsgstr \"用户\"\n\nmsgctxt \"field:ir.model.button.rule,group:\"\nmsgid \"Group\"\nmsgstr \"组\"\n\n#, fuzzy\nmsgctxt \"field:ir.rule.group,groups:\"\nmsgid \"Groups\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.rule.group-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.rule.group-res.group,rule_group:\"\nmsgid \"Rule Group\"\nmsgstr \"规则组\"\n\nmsgctxt \"field:ir.sequence.type,groups:\"\nmsgid \"User Groups\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.sequence.type-res.group,group:\"\nmsgid \"User Groups\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.sequence.type-res.group,sequence_type:\"\nmsgid \"Sequence Type\"\nmsgstr \"序列类型\"\n\n#, fuzzy\nmsgctxt \"field:ir.ui.menu,groups:\"\nmsgid \"Groups\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.ui.menu-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:ir.ui.menu-res.group,menu:\"\nmsgid \"Menu\"\nmsgstr \"菜单\"\n\nmsgctxt \"field:res.group,buttons:\"\nmsgid \"Buttons\"\nmsgstr \"按钮\"\n\nmsgctxt \"field:res.group,field_access:\"\nmsgid \"Access Field\"\nmsgstr \"字段访问权限\"\n\nmsgctxt \"field:res.group,menu_access:\"\nmsgid \"Access Menu\"\nmsgstr \"菜单访问权限\"\n\nmsgctxt \"field:res.group,model_access:\"\nmsgid \"Access Model\"\nmsgstr \"模型访问权限\"\n\nmsgctxt \"field:res.group,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:res.group,parent:\"\nmsgid \"Parent\"\nmsgstr \"\"\n\nmsgctxt \"field:res.group,rule_groups:\"\nmsgid \"Rules\"\nmsgstr \"规则\"\n\nmsgctxt \"field:res.group,users:\"\nmsgid \"Users\"\nmsgstr \"用户\"\n\nmsgctxt \"field:res.user,actions:\"\nmsgid \"Actions\"\nmsgstr \"操作\"\n\nmsgctxt \"field:res.user,applications:\"\nmsgid \"Applications\"\nmsgstr \"应用\"\n\nmsgctxt \"field:res.user,avatar_badge_url:\"\nmsgid \"Avatar Badge URL\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user,email:\"\nmsgid \"Email\"\nmsgstr \"电子邮件\"\n\nmsgctxt \"field:res.user,groups:\"\nmsgid \"Groups\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:res.user,language:\"\nmsgid \"Language\"\nmsgstr \"语言\"\n\nmsgctxt \"field:res.user,language_direction:\"\nmsgid \"Language Direction\"\nmsgstr \"语言书写方向\"\n\nmsgctxt \"field:res.user,login:\"\nmsgid \"Login\"\nmsgstr \"登录\"\n\nmsgctxt \"field:res.user,menu:\"\nmsgid \"Menu Action\"\nmsgstr \"菜单动作\"\n\nmsgctxt \"field:res.user,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:res.user,password:\"\nmsgid \"Password\"\nmsgstr \"密码\"\n\nmsgctxt \"field:res.user,password_hash:\"\nmsgid \"Password Hash\"\nmsgstr \"密码HASH\"\n\nmsgctxt \"field:res.user,password_reset:\"\nmsgid \"Reset Password\"\nmsgstr \"重置密码\"\n\nmsgctxt \"field:res.user,password_reset_expire:\"\nmsgid \"Reset Password Expire\"\nmsgstr \"重置密码过期\"\n\nmsgctxt \"field:res.user,pyson_menu:\"\nmsgid \"PySON Menu\"\nmsgstr \"PySON 菜单\"\n\nmsgctxt \"field:res.user,sessions:\"\nmsgid \"Sessions\"\nmsgstr \"会话\"\n\nmsgctxt \"field:res.user,signature:\"\nmsgid \"Signature\"\nmsgstr \"签名\"\n\nmsgctxt \"field:res.user,status_bar:\"\nmsgid \"Status Bar\"\nmsgstr \"状态栏\"\n\nmsgctxt \"field:res.user,warnings:\"\nmsgid \"Warnings\"\nmsgstr \"警告\"\n\nmsgctxt \"field:res.user-ir.action,action:\"\nmsgid \"Action\"\nmsgstr \"操作\"\n\nmsgctxt \"field:res.user-ir.action,user:\"\nmsgid \"User\"\nmsgstr \"用户\"\n\nmsgctxt \"field:res.user-res.group,group:\"\nmsgid \"Group\"\nmsgstr \"用户组\"\n\nmsgctxt \"field:res.user-res.group,user:\"\nmsgid \"User\"\nmsgstr \"用户\"\n\nmsgctxt \"field:res.user.application,application:\"\nmsgid \"Application\"\nmsgstr \"应用\"\n\nmsgctxt \"field:res.user.application,key:\"\nmsgid \"Key\"\nmsgstr \"密钥\"\n\nmsgctxt \"field:res.user.application,state:\"\nmsgid \"State\"\nmsgstr \"状态\"\n\nmsgctxt \"field:res.user.application,user:\"\nmsgid \"User\"\nmsgstr \"用户\"\n\nmsgctxt \"field:res.user.device,cookie:\"\nmsgid \"Cookie\"\nmsgstr \"\"\n\n#, fuzzy\nmsgctxt \"field:res.user.device,login:\"\nmsgid \"Login\"\nmsgstr \"登录\"\n\nmsgctxt \"field:res.user.login.attempt,device_cookie:\"\nmsgid \"Device Cookie\"\nmsgstr \"\"\n\nmsgctxt \"field:res.user.login.attempt,ip_address:\"\nmsgid \"IP Address\"\nmsgstr \"IP地址\"\n\nmsgctxt \"field:res.user.login.attempt,ip_network:\"\nmsgid \"IP Network\"\nmsgstr \"IP网络\"\n\nmsgctxt \"field:res.user.login.attempt,login:\"\nmsgid \"Login\"\nmsgstr \"登录\"\n\nmsgctxt \"field:res.user.warning,always:\"\nmsgid \"Always\"\nmsgstr \"总是\"\n\nmsgctxt \"field:res.user.warning,name:\"\nmsgid \"Name\"\nmsgstr \"名称\"\n\nmsgctxt \"field:res.user.warning,user:\"\nmsgid \"User\"\nmsgstr \"用户\"\n\nmsgctxt \"help:ir.export,groups:\"\nmsgid \"The user groups that can use the export.\"\nmsgstr \"可以使用导出功能的用户组.\"\n\nmsgctxt \"help:ir.export,write_groups:\"\nmsgid \"The user groups that can modify the export.\"\nmsgstr \"可以调整导出功能的用户组.\"\n\nmsgctxt \"help:ir.sequence.type,groups:\"\nmsgid \"Groups allowed to edit the sequences of this type.\"\nmsgstr \"允许编辑此类型序列的用户组.\"\n\nmsgctxt \"help:res.group,parent:\"\nmsgid \"The group to inherit accesses from.\"\nmsgstr \"\"\n\nmsgctxt \"help:res.user,actions:\"\nmsgid \"Actions that will be run at login.\"\nmsgstr \"用户登录后自动运行的操作.\"\n\nmsgctxt \"model:ir.action,name:act_group_form\"\nmsgid \"Groups\"\nmsgstr \"组\"\n\nmsgctxt \"model:ir.action,name:act_user_config\"\nmsgid \"Configure Users\"\nmsgstr \"设置用户\"\n\nmsgctxt \"model:ir.action,name:act_user_form\"\nmsgid \"Users\"\nmsgstr \"用户\"\n\nmsgctxt \"model:ir.action,name:report_email_reset_password\"\nmsgid \"Reset Password\"\nmsgstr \"重置密码\"\n\nmsgctxt \"model:ir.action-res.group,name:\"\nmsgid \"Action - Group\"\nmsgstr \"操作 - 组\"\n\nmsgctxt \"model:ir.export-res.group,name:\"\nmsgid \"Export Group\"\nmsgstr \"导出组\"\n\nmsgctxt \"model:ir.export-write-res.group,name:\"\nmsgid \"Export Modification Group\"\nmsgstr \"导出功能调整组\"\n\nmsgctxt \"model:ir.message,text:msg_password_email\"\nmsgid \"The password cannot be the same as user's email address.\"\nmsgstr \"密码不能与用户的电子邮件地址相同.\"\n\nmsgctxt \"model:ir.message,text:msg_password_forbidden\"\nmsgid \"The password is forbidden.\"\nmsgstr \"密码已被禁止.\"\n\nmsgctxt \"model:ir.message,text:msg_password_length\"\nmsgid \"The password must have at least %(length)i characters.\"\nmsgstr \"\"\n\nmsgctxt \"model:ir.message,text:msg_password_login\"\nmsgid \"The password cannot be the same as user's login.\"\nmsgstr \"密码不能与用户登录名相同.\"\n\nmsgctxt \"model:ir.message,text:msg_password_name\"\nmsgid \"The password cannot be the same as user's name.\"\nmsgstr \"密码不能与用户登录名相同.\"\n\nmsgctxt \"model:ir.message,text:msg_user_delete_forbidden\"\nmsgid \"\"\n\"For logging purposes users cannot be deleted, instead they should be \"\n\"deactivated.\"\nmsgstr \"由于日志记录的原因，用户不能删除，只能停用.\"\n\nmsgctxt \"model:ir.message,text:msg_user_password\"\nmsgid \"Password for %(login)s\"\nmsgstr \"%(login)s 的密码\"\n\nmsgctxt \"model:ir.model.button,help:user_reset_password_button\"\nmsgid \"Send by email a new temporary password to the user\"\nmsgstr \"通过电子邮件向用户发送新的临时密码\"\n\nmsgctxt \"model:ir.model.button,string:user_application_cancel_button\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\nmsgctxt \"model:ir.model.button,string:user_application_validate_button\"\nmsgid \"Validate\"\nmsgstr \"验证\"\n\nmsgctxt \"model:ir.model.button,string:user_reset_password_button\"\nmsgid \"Reset Password\"\nmsgstr \"重置密码\"\n\nmsgctxt \"model:ir.model.button-res.group,name:\"\nmsgid \"Model Button - Group\"\nmsgstr \"模型按钮 - 组\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action\"\nmsgid \"User in groups\"\nmsgstr \"组中的用户\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_act_window\"\nmsgid \"User in groups\"\nmsgstr \"组中的用户\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_keyword\"\nmsgid \"User in groups\"\nmsgstr \"组中的用户\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_report\"\nmsgid \"User in groups\"\nmsgstr \"组中的用户\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_url\"\nmsgid \"User in groups\"\nmsgstr \"组中的用户\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_action_wizard\"\nmsgid \"User in groups\"\nmsgstr \"组中的用户\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_any\"\nmsgid \"Any export\"\nmsgstr \"任意导出\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_any\"\nmsgid \"Any export\"\nmsgstr \"任意导出\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_read\"\nmsgid \"User in groups\"\nmsgstr \"组用户\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_line_write\"\nmsgid \"User in modification groups\"\nmsgstr \"修改组中的用户\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_read\"\nmsgid \"User in groups\"\nmsgstr \"用户组\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_export_write\"\nmsgid \"User in modification groups\"\nmsgstr \"修改组中的用户\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_menu\"\nmsgid \"User in groups\"\nmsgstr \"组中的用户\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence\"\nmsgid \"User in groups\"\nmsgstr \"组中的用户\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_sequence_strict\"\nmsgid \"User in groups\"\nmsgstr \"组中的用户\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session\"\nmsgid \"Own session\"\nmsgstr \"自己的会话\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_session_wizard\"\nmsgid \"Own session\"\nmsgstr \"自己的会话\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_ui_menu_favorite\"\nmsgid \"Own favorite\"\nmsgstr \"自己的爱好\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application\"\nmsgid \"Own user application\"\nmsgstr \"自己的用户应用程序\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_application_admin\"\nmsgid \"Any user application\"\nmsgstr \"任意的用户应用程序\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_user_warning\"\nmsgid \"Own warning\"\nmsgstr \"自己的警告\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search\"\nmsgid \"Own view search\"\nmsgstr \"自己的视图搜索\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_admin\"\nmsgid \"Any view search\"\nmsgstr \"任意的视图搜索\"\n\nmsgctxt \"model:ir.rule.group,name:rule_group_view_search_common\"\nmsgid \"Common view search\"\nmsgstr \"公共的视图搜索\"\n\nmsgctxt \"model:ir.rule.group-res.group,name:\"\nmsgid \"Rule Group - Group\"\nmsgstr \"规则组 - 组\"\n\nmsgctxt \"model:ir.sequence.type-res.group,name:\"\nmsgid \"Sequence Type - Group\"\nmsgstr \"序列类别 - 组\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_group_form\"\nmsgid \"Groups\"\nmsgstr \"组\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_res\"\nmsgid \"Users\"\nmsgstr \"用户\"\n\nmsgctxt \"model:ir.ui.menu,name:menu_user_form\"\nmsgid \"Users\"\nmsgstr \"用户\"\n\nmsgctxt \"model:ir.ui.menu-res.group,name:\"\nmsgid \"UI Menu - Group\"\nmsgstr \"UI 菜单 - 组\"\n\nmsgctxt \"model:res.group,name:\"\nmsgid \"Group\"\nmsgstr \"用户组\"\n\nmsgctxt \"model:res.group,name:group_admin\"\nmsgid \"Administration\"\nmsgstr \"管理\"\n\nmsgctxt \"model:res.user,name:\"\nmsgid \"User\"\nmsgstr \"用户\"\n\nmsgctxt \"model:res.user-ir.action,name:\"\nmsgid \"User - Action\"\nmsgstr \"用户 - 操作\"\n\nmsgctxt \"model:res.user-res.group,name:\"\nmsgid \"User - Group\"\nmsgstr \"用户 - 组\"\n\nmsgctxt \"model:res.user.application,name:\"\nmsgid \"User Application\"\nmsgstr \"用户应用\"\n\nmsgctxt \"model:res.user.config.start,name:\"\nmsgid \"User Config Init\"\nmsgstr \"用户初始化配置\"\n\nmsgctxt \"model:res.user.device,name:\"\nmsgid \"User Device\"\nmsgstr \"\"\n\nmsgctxt \"model:res.user.login.attempt,name:\"\nmsgid \"Login Attempt\"\nmsgstr \"登录次数\"\n\nmsgctxt \"model:res.user.warning,name:\"\nmsgid \"User Warning\"\nmsgstr \"用户警告\"\n\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"Reset Password\"\nmsgstr \"重置密码\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"\"\n\"The password for your account, [1:%(login)s], has been reset.[2:]\\n\"\n\"                You must set a new one from the user's preferences.[3:]\\n\"\n\"                You can connect with this temporary password [4:%(password)s] to[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(http_host)s/#%(database)s]\"\nmsgstr \"\"\n\"你的账户 [1:%(login)s] 的密码已经重置.[2:]\\n\"\n\"                你必须使用用户偏好功能设置一个新的密码.[3:]\\n\"\n\"                你可以使用临时密码 [4:%(password)s] 连接到[5:]\\n\"\n\"                [6:tryton://%(host)s/%(database)s][7:]\\n\"\n\"                [8:%(host)s/#%(database)s]\"\n\n#, fuzzy\nmsgctxt \"report:res.user.email_reset_password:\"\nmsgid \"The password will expire in [1:%(datetime)s].\"\nmsgstr \"密码将在 [1:%(datetime)s UTC] 过期.\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Cancelled\"\nmsgstr \"已取消\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Requested\"\nmsgstr \"已申请\"\n\nmsgctxt \"selection:res.user.application,state:\"\nmsgid \"Validated\"\nmsgstr \"已确认\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Access Permissions\"\nmsgstr \"访问权限\"\n\nmsgctxt \"view:res.group:\"\nmsgid \"Members\"\nmsgstr \"成员\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"Be careful that the login must be unique.\"\nmsgstr \"注意登录不能重复.\"\n\nmsgctxt \"view:res.user.config.start:\"\nmsgid \"You can now add some users into the system.\"\nmsgstr \"现在可以给系统添加用户了.\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Access Permissions\"\nmsgstr \"访问权限\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Actions\"\nmsgstr \"动作\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Group Membership\"\nmsgstr \"组成员\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"Preferences\"\nmsgstr \"偏好\"\n\nmsgctxt \"view:res.user:\"\nmsgid \"User\"\nmsgstr \"用户\"\n\nmsgctxt \"wizard_button:res.user.config,start,end:\"\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\nmsgctxt \"wizard_button:res.user.config,start,user:\"\nmsgid \"OK\"\nmsgstr \"确定\"\n\nmsgctxt \"wizard_button:res.user.config,user,add:\"\nmsgid \"Add\"\nmsgstr \"添加\"\n\nmsgctxt \"wizard_button:res.user.config,user,end:\"\nmsgid \"End\"\nmsgstr \"结束\"\n"
  },
  {
    "path": "trytond/res/message.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data grouped=\"1\">\n        <record model=\"ir.message\" id=\"msg_password_length\">\n            <field name=\"text\">The password must have at least %(length)i characters.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_password_forbidden\">\n            <field name=\"text\">The password is forbidden.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_password_name\">\n            <field name=\"text\">The password cannot be the same as user's name.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_password_login\">\n            <field name=\"text\">The password cannot be the same as user's login.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_password_email\">\n            <field name=\"text\">The password cannot be the same as user's email address.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_user_delete_forbidden\">\n            <field name=\"text\">For logging purposes users cannot be deleted, instead they should be deactivated.</field>\n        </record>\n        <record model=\"ir.message\" id=\"msg_user_password\">\n            <field name=\"text\">Password for %(login)s</field>\n        </record>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/res/res.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <menuitem\n            name=\"Users\"\n            parent=\"ir.menu_administration\"\n            sequence=\"10\"\n            id=\"menu_res\"/>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/res/routes.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport logging\nimport random\nimport time\n\nfrom werkzeug.exceptions import abort\n\nfrom trytond.config import config\nfrom trytond.protocols.wrappers import (\n    allow_null_origin, with_pool, with_transaction)\nfrom trytond.transaction import Transaction\nfrom trytond.wsgi import app\n\nlogger = logging.getLogger(__name__)\n\n\n@app.route('/<database_name>/user/application/', methods=['POST', 'DELETE'])\n@allow_null_origin\n@with_pool\n@with_transaction(readonly=False)\ndef user_application(request, pool):\n    User = pool.get('res.user')\n    UserApplication = pool.get('res.user.application')\n    LoginAttempt = pool.get('res.user.login.attempt')\n    data = request.parsed_data\n    login = data.get('user')\n\n    if request.method == 'POST':\n        # Make time random to process and try to use the same path as much as\n        # possible to prevent guessing between valid and invalid requests.\n        Transaction().atexit(time.sleep, random.random())\n        users = User.search([\n                ('login', '=', login),\n                ])\n        if not users:\n            logger.info('User Application not found: %s', data.get('user'))\n            user_id = None\n        else:\n            user, = users\n            user_id = user.id\n        if UserApplication.count(user_id):\n            logger.info('User Application has already a request: %s', login)\n            user_id = None\n        data['user'] = user_id\n        data.pop('key', None)\n        data.pop('state', None)\n        application, = UserApplication.create([data])\n        key = application.key\n        UserApplication.delete(UserApplication.search([\n                    ('user', '=', None),\n                    ]))\n        return key\n    elif request.method == 'DELETE':\n        count = LoginAttempt.count(login)\n        if count > config.getint('session', 'max_attempt', default=5):\n            LoginAttempt.add(login)\n            abort(429)\n        Transaction().atexit(time.sleep, 2 ** count - 1)\n        applications = UserApplication.search([\n                ('user.login', '=', login),\n                ('key', '=', data.get('key')),\n                ('application', '=', data.get('application')),\n                ])\n        if applications:\n            UserApplication.delete(applications)\n            LoginAttempt.remove(login)\n        else:\n            LoginAttempt.add(login)\n"
  },
  {
    "path": "trytond/res/tryton.cfg",
    "content": "[tryton]\ndepends:\n    ir\nxml:\n    res.xml\n    group.xml\n    user.xml\n    ir.xml\n    message.xml\n"
  },
  {
    "path": "trytond/res/user.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\"User\"\n\nimport copy\nimport datetime\nimport hashlib\nimport logging\nimport mmap\nimport random\nimport re\nimport string\nimport time\nimport uuid\n\ntry:\n    import secrets\nexcept ImportError:\n    secrets = None\nimport ipaddress\nimport warnings\nfrom ast import literal_eval\nfrom email.header import Header\nfrom functools import wraps\nfrom itertools import groupby\nfrom operator import attrgetter\n\nfrom passlib.context import CryptContext\nfrom sql import Literal, Null\nfrom sql.aggregate import Count\nfrom sql.conditionals import Case, Coalesce\nfrom sql.functions import CurrentTimestamp\nfrom sql.operators import Concat\n\ntry:\n    import bcrypt\nexcept ImportError:\n    bcrypt = None\ntry:\n    import argon2\nexcept ImportError:\n    argon2 = None\n\nfrom trytond.cache import Cache\nfrom trytond.config import config\nfrom trytond.exceptions import LoginException, RateLimitException, UserError\nfrom trytond.i18n import gettext\nfrom trytond.model import (\n    DeactivableMixin, Index, ModelSQL, ModelView, Unique, Workflow,\n    avatar_mixin, fields)\nfrom trytond.pool import Pool\nfrom trytond.pyson import Bool, Eval, PYSONEncoder\nfrom trytond.report import Report, get_email\nfrom trytond.rpc import RPC\nfrom trytond.sendmail import sendmail_transactional\nfrom trytond.tools import grouped_slice\nfrom trytond.tools.email_ import set_from_header\nfrom trytond.transaction import Transaction\nfrom trytond.url import host, http_host\nfrom trytond.wizard import Button, StateTransition, StateView, Wizard\n\nlogger = logging.getLogger(__name__)\n_has_password = 'password' in re.split('[,+]', config.get(\n    'session', 'authentications', default='password'))\n\npasslib_path = config.get('password', 'passlib')\nif passlib_path:\n    CRYPT_CONTEXT = CryptContext.from_path(passlib_path)\nelse:\n    schemes = ['pbkdf2_sha512']\n    if bcrypt:\n        schemes.insert(0, 'bcrypt')\n    schemes.insert(0, 'scrypt')\n    if argon2:\n        schemes.insert(0, 'argon2')\n    CRYPT_CONTEXT = CryptContext(schemes=schemes)\n\n\ndef gen_password(length=8):\n    alphabet = string.ascii_letters + string.digits\n    if secrets:\n        choice = secrets.choice\n    else:\n        sysrand = random.SystemRandom()\n        choice = sysrand.choice\n    return ''.join(choice(alphabet) for _ in range(length))\n\n\ndef _send_email(from_, users, email_func):\n    from_cfg = config.get('email', 'from')\n    for user in users:\n        if not user.email:\n            logger.info(\"Missing address for '%s' to send email\", user.login)\n            continue\n        msg, title = email_func(user)\n        set_from_header(msg, from_cfg, from_ or from_cfg)\n        msg['To'] = user.email\n        msg['Subject'] = Header(title, 'utf-8')\n        sendmail_transactional(from_cfg, [user.email], msg)\n\n\nclass PasswordError(UserError):\n    pass\n\n\nclass DeleteError(UserError):\n    pass\n\n\nclass User(avatar_mixin(100, 'login'), DeactivableMixin, ModelSQL, ModelView):\n    \"User\"\n    __name__ = \"res.user\"\n    name = fields.Char('Name')\n    login = fields.Char('Login', required=True)\n    password_hash = fields.Char('Password Hash', strip=False)\n    password = fields.Function(fields.Char(\n            \"Password\",\n            states={\n                'invisible': not _has_password,\n                }),\n        getter='get_password', setter='set_password')\n    password_reset = fields.Char(\n        \"Reset Password\", strip=False,\n        states={\n            'invisible': not _has_password,\n            })\n    password_reset_expire = fields.Timestamp(\n        \"Reset Password Expire\",\n        states={\n            'required': Bool(Eval('password_reset')),\n            'invisible': not _has_password,\n            },\n        depends=['password_reset'])\n    signature = fields.Text('Signature')\n    menu = fields.Many2One('ir.action', 'Menu Action',\n        domain=[('usage', '=', 'menu')], required=True)\n    pyson_menu = fields.Function(fields.Char('PySON Menu'), 'get_pyson_menu')\n    actions = fields.Many2Many('res.user-ir.action', 'user', 'action',\n        'Actions', help='Actions that will be run at login.',\n        size=5)\n    groups = fields.Many2Many('res.user-res.group',\n       'user', 'group', 'Groups')\n    applications = fields.One2Many(\n        'res.user.application', 'user', \"Applications\")\n    language = fields.Many2One('ir.lang', 'Language',\n        domain=['OR',\n            ('translatable', '=', True),\n            ])\n    language_direction = fields.Function(fields.Char('Language Direction'),\n            'get_language_direction')\n    email = fields.Char('Email')\n    status_bar = fields.Function(fields.Char('Status Bar'), 'get_status_bar')\n    avatar_badge_url = fields.Function(\n        fields.Char(\"Avatar Badge URL\"), 'get_avatar_badge_url')\n    warnings = fields.One2Many('res.user.warning', 'user', 'Warnings')\n    sessions = fields.Function(fields.Integer('Sessions'),\n            'get_sessions')\n    _get_groups_cache = Cache('res_user.get_groups', context=False)\n\n    @classmethod\n    def __setup__(cls):\n        super(User, cls).__setup__()\n        cls.__rpc__.update({\n                'get_preferences': RPC(check_access=False),\n                'set_preferences': RPC(\n                    readonly=False, check_access=False, fresh_session=True),\n                'get_preferences_fields_view': RPC(check_access=False),\n                })\n        table = cls.__table__()\n        cls._sql_constraints += [\n            ('login_key', Unique(table, table.login),\n                'You can not have two users with the same login!')\n        ]\n        cls._buttons.update({\n                'reset_password': {\n                    'invisible': ~Eval('email', True) | (not _has_password),\n                    },\n                })\n        cls._preferences_fields = [\n            'name',\n            'password',\n            'email',\n            'signature',\n            'menu',\n            'pyson_menu',\n            'actions',\n            'status_bar',\n            'avatar',\n            'avatar_url',\n            'avatar_badge_url',\n            'warnings',\n            'applications',\n        ]\n        cls._context_fields = [\n            'language',\n            'language_direction',\n            'groups',\n        ]\n        cls._order.insert(0, ('name', 'ASC'))\n\n    @classmethod\n    def __register__(cls, module_name):\n        pool = Pool()\n        ModelData = pool.get('ir.model.data')\n        model_data = ModelData.__table__()\n        cursor = Transaction().connection.cursor()\n        super(User, cls).__register__(module_name)\n        table = cls.__table_handler__(module_name)\n\n        # Migration from 3.0\n        if table.column_exist('password') and table.column_exist('salt'):\n            sqltable = cls.__table__()\n            password_hash_new = Concat('sha1$', Concat(sqltable.password,\n                Concat('$', Coalesce(sqltable.salt, ''))))\n            cursor.execute(*sqltable.update(\n                columns=[sqltable.password_hash],\n                values=[password_hash_new]))\n            table.drop_column('password')\n            table.drop_column('salt')\n\n        # Migration from 4.2: Remove required on name\n        table.not_null_action('name', action='remove')\n\n        # Migration from 5.6: Set noupdate to admin\n        cursor.execute(*model_data.update(\n                [model_data.noupdate], [True],\n                where=(model_data.model == cls.__name__)\n                & (model_data.module == 'res')\n                & (model_data.fs_id == 'user_admin')))\n\n    @staticmethod\n    def default_menu():\n        pool = Pool()\n        Action = pool.get('ir.action')\n        actions = Action.search([\n            ('usage', '=', 'menu'),\n            ], limit=1)\n        if actions:\n            return actions[0].id\n        return None\n\n    def get_pyson_menu(self, name):\n        encoder = PYSONEncoder()\n        return encoder.encode(self.menu.get_action_value())\n\n    def get_language_direction(self, name):\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        if self.language:\n            return self.language.direction\n        else:\n            return Lang.default_direction()\n\n    def get_status_bar(self, name):\n        return self.name\n\n    def get_avatar_badge_url(self, name):\n        pass\n\n    def get_password(self, name):\n        return 'x' * 10\n\n    @classmethod\n    def set_password(cls, users, name, value):\n        if value == 'x' * 10:\n            return\n\n        if Transaction().user and value:\n            cls.validate_password(value, users)\n\n        to_write = []\n        for user in users:\n            to_write.extend([[user], {\n                        'password_hash': cls.hash_password(value),\n                        }])\n        cls.write(*to_write)\n\n    @classmethod\n    def validate_password(cls, password, users):\n        password_b = password\n        if isinstance(password, str):\n            password_b = password.encode('utf-8')\n        length = config.getint('password', 'length', default=0)\n        if length > 0:\n            if len(password_b) < length:\n                raise PasswordError(gettext('res.msg_password_length',\n                        length=length,\n                        ))\n        path = config.get('password', 'forbidden', default=None)\n        if path:\n            with open(path, 'r') as f:\n                forbidden = mmap.mmap(\n                    f.fileno(), 0, access=mmap.ACCESS_READ)\n                if forbidden.find(password_b) >= 0:\n                    raise PasswordError(gettext('res.msg_password_forbidden'))\n        for user in users:\n            # Use getattr to allow to use non User instances\n            for test, message in [\n                    (getattr(user, 'name', ''), 'res.msg_password_name'),\n                    (getattr(user, 'login', ''), 'res.msg_password_login'),\n                    (getattr(user, 'email', ''), 'res.msg_password_email'),\n                    ]:\n                if test and password.lower() == test.lower():\n                    raise PasswordError(gettext(message))\n\n    @classmethod\n    @ModelView.button\n    def reset_password(cls, users, length=8, from_=None):\n        for user in users:\n            user.password_reset = gen_password(length=length)\n            user.password_reset_expire = (\n                datetime.datetime.now() + datetime.timedelta(\n                    seconds=config.getint('password', 'reset_timeout')))\n            user.password = None\n        cls.save(users)\n        _send_email(from_, users, cls.get_email_reset_password)\n\n    def get_email_reset_password(self):\n        return get_email(\n            'res.user.email_reset_password', self, self.languages)\n\n    @property\n    def languages(self):\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        if self.language:\n            languages = [self.language]\n        else:\n            languages = Lang.search([\n                    ('code', '=', Transaction().language),\n                    ])\n        return languages\n\n    @staticmethod\n    def get_sessions(users, name):\n        Session = Pool().get('ir.session')\n        now = datetime.datetime.now()\n        timeout = datetime.timedelta(\n            seconds=config.getint('session', 'max_age'))\n        result = dict((u.id, 0) for u in users)\n        with Transaction().set_user(0):\n            for sub_ids in grouped_slice(users):\n                sessions = Session.search([\n                        ('create_uid', 'in', sub_ids),\n                        ], order=[('create_uid', 'ASC')])\n\n                def filter_(session):\n                    timestamp = session.write_date or session.create_date\n                    return abs(timestamp - now) < timeout\n                result.update(dict((i, len(list(g)))\n                        for i, g in groupby(filter(filter_, sessions),\n                            attrgetter('create_uid.id'))))\n        return result\n\n    @staticmethod\n    def _convert_vals(vals):\n        vals = vals.copy()\n        pool = Pool()\n        Action = pool.get('ir.action')\n        if 'menu' in vals:\n            vals['menu'] = Action.get_action_id(vals['menu'])\n        return vals\n\n    @classmethod\n    def read(cls, ids, fields_names):\n        result = super(User, cls).read(ids, fields_names)\n        if not fields_names or 'password_hash' in fields_names:\n            for values in result:\n                values['password_hash'] = None\n        return result\n\n    @classmethod\n    def create(cls, vlist):\n        vlist = [cls._convert_vals(vals) for vals in vlist]\n        return super(User, cls).create(vlist)\n\n    @classmethod\n    def write(cls, users, values, *args):\n        pool = Pool()\n        Session = pool.get('ir.session')\n        UserDevice = pool.get('res.user.device')\n\n        actions = iter((users, values) + args)\n        all_users = []\n        session_to_clear = []\n        users_to_clear = []\n        args = []\n        for users, values in zip(actions, actions):\n            all_users += users\n            args.extend((users, cls._convert_vals(values)))\n\n            if values.keys() & {'active', 'password'}:\n                session_to_clear += users\n                users_to_clear += [u.login for u in users]\n\n        super(User, cls).write(*args)\n\n        Session.clear(session_to_clear)\n        UserDevice.clear(users_to_clear)\n\n        # Clean cursor cache as it could be filled by domain_get\n        for cache in Transaction().cache.values():\n            if cls.__name__ in cache:\n                for user in all_users:\n                    cache[cls.__name__].pop(user.id, None)\n        # Restart the cache for domain_get method\n        pool = Pool()\n        pool.get('ir.rule')._domain_get_cache.clear()\n        # Restart the cache for get_groups\n        cls._get_groups_cache.clear()\n        # Restart the cache of check\n        pool.get('ir.model.access')._get_access_cache.clear()\n        # Restart the cache of check\n        pool.get('ir.model.field.access')._get_access_cache.clear()\n        # Restart the cache\n        ModelView._fields_view_get_cache.clear()\n\n    @classmethod\n    def delete(cls, users):\n        raise DeleteError(gettext('res.msg_user_delete_forbidden'))\n\n    def get_rec_name(self, name):\n        return self.name if self.name else self.login\n\n    @classmethod\n    def search_rec_name(cls, name, clause):\n        if clause[1].startswith('!') or clause[1].startswith('not '):\n            bool_op = 'AND'\n        else:\n            bool_op = 'OR'\n        return [bool_op,\n            ('login',) + tuple(clause[1:]),\n            ('name',) + tuple(clause[1:]),\n            ]\n\n    @classmethod\n    def copy(cls, users, default=None):\n        if default is None:\n            default = {}\n        default = default.copy()\n\n        default['password'] = ''\n        default.setdefault('warnings')\n        default.setdefault('applications')\n\n        new_users = []\n        for user in users:\n            default['login'] = user.login + ' (copy)'\n            new_user, = super(User, cls).copy([user], default)\n            new_users.append(new_user)\n        return new_users\n\n    @classmethod\n    def _get_preferences(cls, user, context_only=False):\n        pool = Pool()\n        ModelData = pool.get('ir.model.data')\n        Action = pool.get('ir.action')\n        Config = pool.get('ir.configuration')\n        ConfigItem = pool.get('ir.module.config_wizard.item')\n        Lang = pool.get('ir.lang')\n\n        res = {}\n        if context_only:\n            fields = cls._context_fields\n        else:\n            fields = cls._preferences_fields + cls._context_fields\n        for field in fields:\n            if cls._fields[field]._type in ('many2one',):\n                if field == 'language':\n                    if user.language:\n                        res['language'] = user.language.code\n                    else:\n                        res['language'] = Config.get_language()\n                else:\n                    if getattr(user, field):\n                        res[field] = getattr(user, field).id\n                        res[field + '.rec_name'] = \\\n                            getattr(user, field).rec_name\n            elif cls._fields[field]._type in ('one2many', 'many2many'):\n                res[field] = [x.id for x in getattr(user, field)]\n                admin_id = ModelData.get_id('res.user_admin')\n                if field == 'actions' and user.id == admin_id:\n                    config_wizard_id = ModelData.get_id('ir',\n                        'act_module_config_wizard')\n                    action_id = Action.get_action_id(config_wizard_id)\n                    if action_id in res[field]:\n                        res[field].remove(action_id)\n                    if ConfigItem.search([\n                                ('state', '=', 'open'),\n                                ]):\n                        res[field].insert(0, action_id)\n            else:\n                res[field] = getattr(user, field)\n\n        if user.language:\n            language = user.language\n        else:\n            try:\n                language = Lang.get(Config.get_language())\n            except ValueError:\n                language = None\n        if language:\n            date = language.date\n            for i, j in [('%a', ''), ('%A', ''), ('%b', '%m'), ('%B', '%m'),\n                    ('%j', ''), ('%U', ''), ('%w', ''), ('%W', '')]:\n                date = date.replace(i, j)\n            res['locale'] = {\n                'date': date,\n                'grouping': literal_eval(language.grouping),\n                'decimal_point': language.decimal_point,\n                'thousands_sep': language.thousands_sep,\n                'mon_grouping': literal_eval(language.mon_grouping),\n                'mon_decimal_point': language.mon_decimal_point,\n                'mon_thousands_sep': language.mon_thousands_sep,\n                'p_sign_posn': language.p_sign_posn,\n                'n_sign_posn': language.n_sign_posn,\n                'positive_sign': language.positive_sign,\n                'negative_sign': language.negative_sign,\n                'p_cs_precedes': language.p_cs_precedes,\n                'n_cs_precedes': language.n_cs_precedes,\n                'p_sep_by_space': language.p_sep_by_space,\n                'n_sep_by_space': language.n_sep_by_space,\n            }\n        return res\n\n    @classmethod\n    def get_preferences(cls, context_only=False):\n        user = Transaction().user\n        user = cls(user)\n        return cls._get_preferences(user, context_only=context_only)\n\n    @classmethod\n    def set_preferences(cls, values):\n        '''\n        Set user preferences\n        '''\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        values_clean = values.copy()\n        fields = cls._preferences_fields + cls._context_fields\n        user_id = Transaction().user\n        user = cls(user_id)\n        for field in values:\n            if field not in fields or field == 'groups':\n                del values_clean[field]\n            if field == 'language':\n                langs = Lang.search([\n                    ('code', '=', values['language']),\n                    ])\n                if langs:\n                    values_clean['language'] = langs[0].id\n                else:\n                    del values_clean['language']\n        # Set new context to write as validation could depend on it\n        context = {}\n        for name in cls._context_fields:\n            if name in values:\n                context[name] = values[name]\n        with Transaction().set_context(context):\n            cls.write([user], values_clean)\n\n    @classmethod\n    def get_preferences_fields_view(cls):\n        pool = Pool()\n        ModelData = pool.get('ir.model.data')\n        Lang = pool.get('ir.lang')\n        Action = pool.get('ir.action')\n\n        view_id = ModelData.get_id('res', 'user_view_form_preferences')\n        res = cls.fields_view_get(view_id=view_id)\n        res = copy.deepcopy(res)\n        for field in res['fields']:\n            if field not in ('groups', 'language_direction'):\n                res['fields'][field]['readonly'] = False\n            else:\n                res['fields'][field]['readonly'] = True\n\n        def convert2selection(definition, name):\n            del definition[name]['relation']\n            del definition[name]['domain']\n            definition[name]['type'] = 'selection'\n            selection = []\n            definition[name]['selection'] = selection\n            return selection\n\n        if 'language' in res['fields']:\n            selection = convert2selection(res['fields'], 'language')\n            langs = Lang.search(cls.language.domain)\n            lang_ids = [l.id for l in langs]\n            with Transaction().set_context(translate_name=True):\n                for lang in Lang.browse(lang_ids):\n                    selection.append((lang.code, lang.name))\n        if 'action' in res['fields']:\n            selection = convert2selection(res['fields'], 'action')\n            selection.append((None, ''))\n            actions = Action.search([])\n            for action in actions:\n                selection.append((action.id, action.rec_name))\n        if 'menu' in res['fields']:\n            selection = convert2selection(res['fields'], 'menu')\n            actions = Action.search([\n                    ('usage', '=', 'menu'),\n                    ])\n            for action in actions:\n                selection.append((action.id, action.rec_name))\n        return res\n\n    @classmethod\n    def get_groups(cls, name=None):\n        '''\n        Return a list of all group ids for the user\n        '''\n        user = Transaction().user\n        groups = cls._get_groups_cache.get(user)\n        if groups is not None:\n            return groups\n        pool = Pool()\n        UserGroup = pool.get('res.user-res.group')\n        cursor = Transaction().connection.cursor()\n        user_group = UserGroup.user_group_all_table()\n        cursor.execute(*user_group.select(\n                user_group.group,\n                where=user_group.user == user))\n        groups = [g for g, in cursor]\n        cls._get_groups_cache.set(user, groups)\n        return groups\n\n    @classmethod\n    def _get_login(cls, login):\n        cursor = Transaction().connection.cursor()\n        table = cls.__table__()\n        cursor.execute(*table.select(table.id, table.password_hash,\n                Case(\n                    (table.password_reset_expire > CurrentTimestamp(),\n                        table.password_reset),\n                    else_=None),\n                where=(table.login == login)\n                & (table.active == Literal(True))))\n        return cursor.fetchone() or (None, None, None)\n\n    @classmethod\n    def get_login(cls, login, parameters):\n        '''\n        Return user id if password matches\n        '''\n        pool = Pool()\n        LoginAttempt = pool.get('res.user.login.attempt')\n        UserDevice = pool.get('res.user.device')\n        parameters = parameters.copy()\n\n        count_ip = LoginAttempt.count_ip()\n        if count_ip > config.getint(\n                'session', 'max_attempt_ip_network', default=300):\n            # Do not add attempt as the goal is to prevent flooding\n            raise RateLimitException()\n        device_cookie = UserDevice.get_valid_cookie(\n            login, parameters.get('device_cookie'))\n        parameters['device_cookie'] = device_cookie\n        count = LoginAttempt.count(login, device_cookie)\n        if count > config.getint('session', 'max_attempt', default=5):\n            LoginAttempt.add(login, device_cookie)\n            raise RateLimitException()\n        Transaction().atexit(time.sleep, random.randint(0, 2 ** count - 1))\n        for methods in config.get(\n                'session', 'authentications', default='password').split(','):\n            user_ids = set()\n            for method in methods.split('+'):\n                if user_ids:\n                    try:\n                        method, options = method.split('?', 1)\n                    except ValueError:\n                        options = []\n                    else:\n                        options = options.split(':')\n                    if cls._check_login_options(options, login, parameters):\n                        continue\n                try:\n                    func = getattr(cls, '_login_%s' % method)\n                except AttributeError:\n                    logger.info('Missing login method: %s', method)\n                    break\n                user_ids.add(func(login, parameters))\n                if len(user_ids) != 1 or not all(user_ids):\n                    break\n            if len(user_ids) == 1 and all(user_ids):\n                LoginAttempt.remove(login, device_cookie)\n                return user_ids.pop()\n        LoginAttempt.add(login, device_cookie)\n\n    @classmethod\n    def _check_login_options(cls, options, login, parameters):\n        for option in options:\n            try:\n                func = getattr(cls, '_check_login_options_%s' % option)\n            except AttributeError:\n                logger.info(\"Missing login option: %s\", option)\n                continue\n            if func(login, parameters):\n                return True\n        else:\n            return False\n\n    @classmethod\n    def _check_login_options_ip_address(cls, login, parameters):\n        context = Transaction().context\n        if context.get('_request') and context['_request'].get('remote_addr'):\n            ip_address = ipaddress.ip_address(\n                str(context['_request']['remote_addr']))\n            network_list = config.get('session', 'authentication_ip_network')\n            if network_list:\n                for network in network_list.split(','):\n                    ip_network = ipaddress.ip_network(network)\n                    if ip_address in ip_network:\n                        return True\n        return False\n\n    @classmethod\n    def _check_login_options_device_cookie(cls, login, parameters):\n        return bool(parameters.get('device_cookie'))\n\n    @classmethod\n    def _login_password(cls, login, parameters):\n        if 'password' not in parameters:\n            msg = gettext('res.msg_user_password', login=login)\n            raise LoginException('password', msg, type='password')\n        user_id, password_hash, password_reset = cls._get_login(login)\n        if user_id and password_hash:\n            password = parameters['password']\n            valid, new_hash = cls.check_password(password, password_hash)\n            if valid:\n                if new_hash:\n                    logger.info(\"Update password hash for %s\", user_id)\n                    with Transaction().new_transaction() as transaction:\n                        with transaction.set_user(0):\n                            cls.write([cls(user_id)], {\n                                    'password_hash': new_hash,\n                                    })\n                return user_id\n        elif user_id and password_reset:\n            if password_reset == parameters['password']:\n                return user_id\n\n    @classmethod\n    def hash_password(cls, password):\n        '''Hash given password in the form\n        <hash_method>$<password>$<salt>...'''\n        if not password:\n            return None\n        return CRYPT_CONTEXT.hash(password)\n\n    @classmethod\n    def check_password(cls, password, hash_):\n        if not hash_:\n            return False\n        try:\n            return CRYPT_CONTEXT.verify_and_update(password, hash_)\n        except ValueError:\n            hash_method = hash_.split('$', 1)[0]\n            warnings.warn(\n                \"Use deprecated hash method %s\" % hash_method,\n                DeprecationWarning)\n            valid = getattr(cls, 'check_' + hash_method)(password, hash_)\n            if valid:\n                new_hash = CRYPT_CONTEXT.hash(password)\n            else:\n                new_hash = None\n            return valid, new_hash\n\n    @classmethod\n    def hash_sha1(cls, password):\n        salt = gen_password()\n        salted_password = password + salt\n        if isinstance(salted_password, str):\n            salted_password = salted_password.encode('utf-8')\n        hash_ = hashlib.sha1(salted_password).hexdigest()\n        return '$'.join(['sha1', hash_, salt])\n\n    @classmethod\n    def check_sha1(cls, password, hash_):\n        if isinstance(password, str):\n            password = password.encode('utf-8')\n        hash_method, hash_, salt = hash_.split('$', 2)\n        salt = salt or ''\n        if isinstance(salt, str):\n            salt = salt.encode('utf-8')\n        assert hash_method == 'sha1'\n        return hash_ == hashlib.sha1(password + salt).hexdigest()\n\n    @classmethod\n    def hash_bcrypt(cls, password):\n        if isinstance(password, str):\n            password = password.encode('utf-8')\n        hash_ = bcrypt.hashpw(password, bcrypt.gensalt()).decode('utf-8')\n        return '$'.join(['bcrypt', hash_])\n\n    @classmethod\n    def check_bcrypt(cls, password, hash_):\n        if isinstance(password, str):\n            password = password.encode('utf-8')\n        hash_method, hash_ = hash_.split('$', 1)\n        if isinstance(hash_, str):\n            hash_ = hash_.encode('utf-8')\n        assert hash_method == 'bcrypt'\n        return hash_ == bcrypt.hashpw(password, hash_)\n\n\nclass LoginAttempt(ModelSQL):\n    \"\"\"Login Attempt\n\n    This class is separated from the res.user one in order to prevent locking\n    the res.user table when in a long running process.\n    \"\"\"\n    __name__ = 'res.user.login.attempt'\n    login = fields.Char('Login', size=512)\n    device_cookie = fields.Char(\"Device Cookie\", strip=False)\n    ip_address = fields.Char(\"IP Address\")\n    ip_network = fields.Char(\"IP Network\")\n\n    @staticmethod\n    def delay():\n        return (datetime.datetime.now()\n            - datetime.timedelta(seconds=config.getint('session', 'timeout')))\n\n    @classmethod\n    def ipaddress(cls):\n        context = Transaction().context\n        ip_address = ''\n        ip_network = ''\n        if context.get('_request') and context['_request'].get('remote_addr'):\n            ip_address = ipaddress.ip_address(\n                str(context['_request']['remote_addr']))\n            prefix = config.getint(\n                'session', 'ip_network_%s' % ip_address.version)\n            ip_network = ipaddress.ip_network(\n                str(context['_request']['remote_addr']))\n            ip_network = ip_network.supernet(new_prefix=prefix)\n        return ip_address, ip_network\n\n    def _login_size(func):\n        @wraps(func)\n        def wrapper(cls, login, *args, **kwargs):\n            return func(cls, login[:cls.login.size], *args, **kwargs)\n        return wrapper\n\n    @classmethod\n    @_login_size\n    def add(cls, login, device_cookie=None):\n        cursor = Transaction().connection.cursor()\n        table = cls.__table__()\n        cursor.execute(*table.delete(where=table.create_date < cls.delay()))\n\n        ip_address, ip_network = cls.ipaddress()\n        cls.create([{\n                    'login': login,\n                    'device_cookie': device_cookie,\n                    'ip_address': str(ip_address),\n                    'ip_network': str(ip_network),\n                    }])\n\n    @classmethod\n    @_login_size\n    def remove(cls, login, device_cookie=None):\n        cursor = Transaction().connection.cursor()\n        table = cls.__table__()\n        cursor.execute(*table.delete(\n                where=(table.login == login)\n                & (table.device_cookie == device_cookie)\n                ))\n\n    @classmethod\n    @_login_size\n    def count(cls, login, device_cookie=None):\n        cursor = Transaction().connection.cursor()\n        table = cls.__table__()\n        cursor.execute(*table.select(Count(Literal('*')),\n                where=(table.login == login)\n                & (table.device_cookie == device_cookie)\n                & (table.create_date >= cls.delay())))\n        return cursor.fetchone()[0]\n\n    @classmethod\n    def count_ip(cls):\n        cursor = Transaction().connection.cursor()\n        table = cls.__table__()\n        _, ip_network = cls.ipaddress()\n        cursor.execute(*table.select(Count(Literal('*')),\n                where=(table.ip_network == str(ip_network))\n                & (table.create_date >= cls.delay())))\n        return cursor.fetchone()[0]\n\n    del _login_size\n\n\nclass UserDevice(ModelSQL):\n    \"User Device\"\n    __name__ = 'res.user.device'\n\n    login = fields.Char(\"Login\", required=True)\n    cookie = fields.Char(\"Cookie\", readonly=True, required=True, strip=False)\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        cls.__rpc__.update({\n                'renew': RPC(readonly=False),\n                })\n\n    @classmethod\n    def get_valid_cookie(cls, login, cookie):\n        try:\n            device, = cls.search([\n                    ('login', '=', login),\n                    ('cookie', '=', cookie),\n                    ], limit=1)\n        except ValueError:\n            return None\n\n        return device.cookie\n\n    @classmethod\n    def renew(cls, current_cookie):\n        pool = Pool()\n        User = pool.get('res.user')\n\n        user = User(Transaction().user)\n        new_cookie = uuid.uuid4().hex\n        current_devices = cls.search([\n                    ('login', '=', user.login),\n                    ('cookie', '=', current_cookie),\n                    ])\n        if current_devices:\n            cls.write(current_devices, {\n                    'cookie': new_cookie\n                    })\n        else:\n            cls.create([{\n                        'login': user.login,\n                        'cookie': new_cookie,\n                        }])\n        return new_cookie\n\n    @classmethod\n    def clear(cls, logins):\n        for sub_logins in grouped_slice(logins):\n            cls.delete(cls.search([\n                        ('login', 'in', list(sub_logins)),\n                        ]))\n\n\nclass UserAction(ModelSQL):\n    'User - Action'\n    __name__ = 'res.user-ir.action'\n    user = fields.Many2One('res.user', 'User', ondelete='CASCADE',\n        required=True)\n    action = fields.Many2One('ir.action', 'Action', ondelete='CASCADE',\n        required=True)\n\n    @staticmethod\n    def _convert_values(values):\n        pool = Pool()\n        Action = pool.get('ir.action')\n        values = values.copy()\n        if values.get('action'):\n            values['action'] = Action.get_action_id(values['action'])\n        return values\n\n    @classmethod\n    def create(cls, vlist):\n        vlist = [cls._convert_values(values) for values in vlist]\n        return super(UserAction, cls).create(vlist)\n\n    @classmethod\n    def write(cls, records, values, *args):\n        actions = iter((records, values) + args)\n        args = []\n        for records, values in zip(actions, actions):\n            args.extend((records, cls._convert_values(values)))\n        super(UserAction, cls).write(*args)\n\n\nclass UserGroup(ModelSQL):\n    'User - Group'\n    __name__ = 'res.user-res.group'\n    user = fields.Many2One('res.user', 'User', ondelete='CASCADE',\n        required=True)\n    group = fields.Many2One('res.group', 'Group', ondelete='CASCADE',\n        required=True)\n\n    @classmethod\n    def create(cls, vlist):\n        records = super().create(vlist)\n        pool = Pool()\n        # Restart the cache on the domain_get method\n        pool.get('ir.rule')._domain_get_cache.clear()\n        # Restart the cache for get_groups\n        pool.get('res.user')._get_groups_cache.clear()\n        # Restart the cache for model access and view\n        pool.get('ir.model.access')._get_access_cache.clear()\n        pool.get('ir.model.field.access')._get_access_cache.clear()\n        ModelView._fields_view_get_cache.clear()\n        return records\n\n    @classmethod\n    def write(cls, groups, values, *args):\n        super().write(groups, values, *args)\n        pool = Pool()\n        # Restart the cache on the domain_get method\n        pool.get('ir.rule')._domain_get_cache.clear()\n        # Restart the cache for get_groups\n        pool.get('res.user')._get_groups_cache.clear()\n        # Restart the cache for model access and view\n        pool.get('ir.model.access')._get_access_cache.clear()\n        pool.get('ir.model.field.access')._get_access_cache.clear()\n        ModelView._fields_view_get_cache.clear()\n\n    @classmethod\n    def delete(cls, groups):\n        super().delete(groups)\n        pool = Pool()\n        # Restart the cache on the domain_get method\n        pool.get('ir.rule')._domain_get_cache.clear()\n        # Restart the cache for get_groups\n        pool.get('res.user')._get_groups_cache.clear()\n        # Restart the cache for model access and view\n        pool.get('ir.model.access')._get_access_cache.clear()\n        pool.get('ir.model.field.access')._get_access_cache.clear()\n        ModelView._fields_view_get_cache.clear()\n\n    @classmethod\n    def user_group_all_table(cls):\n        pool = Pool()\n        Group = pool.get('res.group')\n        user_group = cls.__table__()\n        group_parents = Group.group_parent_all_cte()\n\n        return (user_group\n            .join(group_parents,\n                condition=user_group.group == group_parents.id)\n            .select(\n                user_group.user.as_('user'),\n                group_parents.parent.as_('group'),\n                where=group_parents.parent != Null,\n                with_=group_parents))\n\n\nclass Warning_(ModelSQL, ModelView):\n    'User Warning'\n    __name__ = 'res.user.warning'\n\n    user = fields.Many2One('res.user', 'User', required=True)\n    name = fields.Char('Name', required=True)\n    always = fields.Boolean('Always')\n\n    @classmethod\n    def format(cls, name, records):\n        key = '|'.join(map(str, records)).encode('utf-8')\n        return '%s.%s' % (hashlib.md5(key).hexdigest(), name)\n\n    @classmethod\n    def check(cls, warning_name):\n        transaction = Transaction()\n        user = transaction.user\n        context = transaction.context\n        if not user or context.get('_skip_warnings'):\n            return False\n        key = (user, warning_name)\n        if key in transaction.check_warnings:\n            return False\n        warnings = cls.search([\n            ('user', '=', user),\n            ('name', '=', warning_name),\n            ])\n        if not warnings:\n            return True\n        transaction.check_warnings.add(key)\n        cls.delete([x for x in warnings if not x.always])\n        return False\n\n\nclass UserApplication(Workflow, ModelSQL, ModelView):\n    \"User Application\"\n    __name__ = 'res.user.application'\n    _rec_name = 'key'\n\n    key = fields.Char(\"Key\", required=True, strip=False)\n    user = fields.Many2One('res.user', \"User\")\n    application = fields.Selection([], \"Application\")\n    state = fields.Selection([\n            ('requested', \"Requested\"),\n            ('validated', \"Validated\"),\n            ('cancelled', \"Cancelled\"),\n            ], \"State\", readonly=True, sort=False)\n\n    @classmethod\n    def __setup__(cls):\n        super(UserApplication, cls).__setup__()\n        cls._transitions |= set((\n                ('requested', 'validated'),\n                ('requested', 'cancelled'),\n                ('validated', 'cancelled'),\n                ))\n        cls._buttons.update({\n                'validate_': {\n                    'invisible': Eval('state') != 'requested',\n                    'depends': ['state'],\n                    },\n                'cancel': {\n                    'invisible': Eval('state') == 'cancelled',\n                    'depends': ['state'],\n                    },\n                })\n        # Do not cache default_key as it depends on time\n        cls.__rpc__['default_get'].cache = None\n\n        table = cls.__table__()\n        cls._sql_indexes.update({\n                Index(table, (table.key, Index.Equality())),\n                Index(\n                    table,\n                    (table.user, Index.Equality()),\n                    (table.state, Index.Equality())),\n                Index(\n                    table,\n                    (table.key, Index.Equality()),\n                    (table.application, Index.Equality()),\n                    (table.state, Index.Equality())),\n                })\n\n    @classmethod\n    def default_key(cls):\n        return ''.join(uuid.uuid4().hex for _ in range(4))\n\n    @classmethod\n    def default_state(cls):\n        return 'requested'\n\n    @classmethod\n    @ModelView.button\n    @Workflow.transition('validated')\n    def validate_(cls, applications):\n        pass\n\n    @classmethod\n    @ModelView.button\n    @Workflow.transition('cancelled')\n    def cancel(cls, applications):\n        pass\n\n    @classmethod\n    def count(cls, user_id):\n        return cls.search([\n                ('user', '=', user_id),\n                ('state', '=', 'requested'),\n                ], count=True)\n\n    @classmethod\n    def check(cls, key, application):\n        records = cls.search([\n                ('key', '=', key),\n                ('application', '=', application),\n                ('state', '=', 'validated'),\n                ], limit=1)\n        if not records:\n            return\n        record, = records\n        return record\n\n    @classmethod\n    def create(cls, vlist):\n        vlist = [v.copy() for v in vlist]\n        for values in vlist:\n            # Ensure we get a different key for each record\n            # default methods are called only once\n            values.setdefault('key', cls.default_key())\n        applications = super(UserApplication, cls).create(vlist)\n        return applications\n\n\nclass EmailResetPassword(Report):\n    __name__ = 'res.user.email_reset_password'\n\n    @classmethod\n    def get_context(cls, records, header, data):\n        context = super().get_context(records, header, data)\n        context['host'] = host()\n        context['http_host'] = http_host()\n        context['database'] = Transaction().database.name\n        expire_delay = (\n            records[0].password_reset_expire - datetime.datetime.now())\n        # Use a precision of minutes\n        expire_delay = datetime.timedelta(\n            days=expire_delay.days,\n            minutes=round(expire_delay.seconds / 60))\n        context['expire_delay'] = expire_delay\n        return context\n\n\nclass UserConfigStart(ModelView):\n    'User Config Init'\n    __name__ = 'res.user.config.start'\n\n\nclass UserConfig(Wizard):\n    'Configure users'\n    __name__ = 'res.user.config'\n\n    start = StateView('res.user.config.start',\n        'res.user_config_start_view_form', [\n            Button('Cancel', 'end', 'tryton-cancel'),\n            Button('OK', 'user', 'tryton-ok', default=True),\n            ])\n    user = StateView('res.user',\n        'res.user_view_form', [\n            Button('End', 'end', 'tryton-cancel'),\n            Button('Add', 'add', 'tryton-ok'),\n            ])\n    add = StateTransition()\n\n    def transition_add(self):\n        pool = Pool()\n        User = pool.get('res.user')\n        self.user.save()\n        self.user = User()\n        return 'user'\n"
  },
  {
    "path": "trytond/res/user.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data noupdate=\"1\">\n        <record model=\"res.user\" id=\"user_admin\">\n            <field name=\"login\">admin</field>\n            <field name=\"name\">Administrator</field>\n            <field name=\"menu\" ref=\"ir.act_menu_tree\"/>\n        </record>\n    </data>\n    <data>\n        <record model=\"res.user-res.group\" id=\"user_admin_group_admin\">\n            <field name=\"user\" ref=\"user_admin\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n        <record model=\"ir.ui.view\" id=\"user_view_form\">\n            <field name=\"model\">res.user</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">user_form</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"user_view_form_preferences\">\n            <field name=\"model\">res.user</field>\n            <field name=\"type\">form</field>\n            <field name=\"priority\" eval=\"20\"/>\n            <field name=\"name\">user_form_preferences</field>\n        </record>\n        <record model=\"ir.ui.view\" id=\"user_view_tree\">\n            <field name=\"model\">res.user</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">user_list</field>\n        </record>\n        <record model=\"ir.action.act_window\" id=\"act_user_form\">\n            <field name=\"name\">Users</field>\n            <field name=\"type\">ir.action.act_window</field>\n            <field name=\"res_model\">res.user</field>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_user_form_view1\">\n            <field name=\"sequence\" eval=\"1\"/>\n            <field name=\"view\" ref=\"user_view_tree\"/>\n            <field name=\"act_window\" ref=\"act_user_form\"/>\n        </record>\n        <record model=\"ir.action.act_window.view\"\n            id=\"act_user_form_view2\">\n            <field name=\"sequence\" eval=\"2\"/>\n            <field name=\"view\" ref=\"user_view_form\"/>\n            <field name=\"act_window\" ref=\"act_user_form\"/>\n        </record>\n        <menuitem\n            parent=\"res.menu_res\"\n            action=\"act_user_form\"\n            sequence=\"10\"\n            id=\"menu_user_form\"/>\n        <record model=\"ir.ui.menu-res.group\" id=\"menu_user_form_group_admin\">\n            <field name=\"menu\" ref=\"menu_user_form\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n\n        <record model=\"ir.model.access\" id=\"access_user\">\n            <field name=\"model\" search=\"[('model', '=', 'res.user')]\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"False\"/>\n            <field name=\"perm_create\" eval=\"False\"/>\n            <field name=\"perm_delete\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.model.access\" id=\"access_user_admin\">\n            <field name=\"model\" search=\"[('model', '=', 'res.user')]\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n            <field name=\"perm_read\" eval=\"True\"/>\n            <field name=\"perm_write\" eval=\"True\"/>\n            <field name=\"perm_create\" eval=\"True\"/>\n            <field name=\"perm_delete\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.model.button\" id=\"user_reset_password_button\">\n            <field name=\"name\">reset_password</field>\n            <field name=\"string\">Reset Password</field>\n            <field name=\"help\">Send by email a new temporary password to the user</field>\n            <field name=\"model\"\n                search=\"[('model', '=', 'res.user')]\"/>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"user_config_start_view_form\">\n            <field name=\"model\">res.user.config.start</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">user_config_start_form</field>\n        </record>\n\n        <record model=\"ir.action.wizard\" id=\"act_user_config\">\n            <field name=\"name\">Configure Users</field>\n            <field name=\"wiz_name\">res.user.config</field>\n            <field name=\"window\" eval=\"True\"/>\n        </record>\n\n        <record model=\"ir.module.config_wizard.item\"\n            id=\"config_wizard_item_user\">\n            <field name=\"action\" ref=\"act_user_config\"/>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"user_warning_view_form\">\n            <field name=\"model\">res.user.warning</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">user_warning_form</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"user_warning_view_tree\">\n            <field name=\"model\">res.user.warning</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">user_warning_tree</field>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_user_warning\">\n            <field name=\"name\">Own warning</field>\n            <field name=\"model\" search=\"[('model', '=', 'res.user.warning')]\"/>\n            <field name=\"global_p\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_user_warning1\">\n            <field name=\"domain\"\n                eval=\"[('user', '=', Eval('user', {}).get('id', -1))]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_user_warning\"/>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"user_application_view_form\">\n            <field name=\"model\">res.user.application</field>\n            <field name=\"type\">form</field>\n            <field name=\"name\">user_application_form</field>\n        </record>\n\n        <record model=\"ir.ui.view\" id=\"user_application_view_list\">\n            <field name=\"model\">res.user.application</field>\n            <field name=\"type\">tree</field>\n            <field name=\"name\">user_application_list</field>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_user_application\">\n            <field name=\"name\">Own user application</field>\n            <field name=\"model\"\n                search=\"[('model', '=', 'res.user.application')]\"/>\n            <field name=\"global_p\" eval=\"False\"/>\n            <field name=\"default_p\" eval=\"True\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_user_application1\">\n            <field name=\"domain\"\n                eval=\"[('user', '=', Eval('user', {}).get('id', -1))]\"\n                pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_user_application\"/>\n        </record>\n\n        <record model=\"ir.rule.group\" id=\"rule_group_user_application_admin\">\n            <field name=\"name\">Any user application</field>\n            <field name=\"model\"\n                search=\"[('model', '=', 'res.user.application')]\"/>\n            <field name=\"global_p\" eval=\"False\"/>\n            <field name=\"default_p\" eval=\"False\"/>\n        </record>\n        <record model=\"ir.rule\" id=\"rule_user_application_admin1\">\n            <field name=\"domain\" eval=\"[]\" pyson=\"1\"/>\n            <field name=\"rule_group\" ref=\"rule_group_user_application_admin\"/>\n        </record>\n        <record model=\"ir.rule.group-res.group\"\n            id=\"rule_user_application_admin_admin\">\n            <field name=\"rule_group\" ref=\"rule_group_user_application_admin\"/>\n            <field name=\"group\" ref=\"group_admin\"/>\n        </record>\n\n        <record model=\"ir.action.report\" id=\"report_email_reset_password\">\n            <field name=\"name\">Reset Password</field>\n            <field name=\"model\">res.user</field>\n            <field name=\"report_name\">res.user.email_reset_password</field>\n            <field name=\"report\">res/email_reset_password.html</field>\n            <field name=\"template_extension\">html</field>\n        </record>\n\n        <record model=\"ir.model.button\" id=\"user_application_validate_button\">\n            <field name=\"name\">validate_</field>\n            <field name=\"string\">Validate</field>\n            <field name=\"model\"\n                search=\"[('model', '=', 'res.user.application')]\"/>\n        </record>\n        <record model=\"ir.model.button\" id=\"user_application_cancel_button\">\n            <field name=\"name\">cancel</field>\n            <field name=\"string\">Cancel</field>\n            <field name=\"model\"\n                search=\"[('model', '=', 'res.user.application')]\"/>\n        </record>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/res/view/export_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<data>\n    <xpath expr=\"//field[@name='export_fields']\" position=\"after\">\n        <field name=\"groups\" colspan=\"4\"/>\n        <field name=\"write_groups\" colspan=\"4\"/>\n    </xpath>\n</data>\n"
  },
  {
    "path": "trytond/res/view/export_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<data>\n    <xpath expr=\"//field[@name='create_uid']\" position=\"after\">\n        <field name=\"groups\"/>\n        <field name=\"write_groups\"/>\n    </xpath>\n</data>\n"
  },
  {
    "path": "trytond/res/view/group_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <label name=\"active\"/>\n    <field name=\"active\"/>\n\n    <label name=\"parent\"/>\n    <field name=\"parent\"/>\n    <notebook>\n        <page string=\"Members\" col=\"2\" id=\"members\">\n            <field name=\"users\" colspan=\"2\"/>\n        </page>\n        <page string=\"Access Permissions\" col=\"1\" id=\"permissions\">\n            <notebook>\n                <page name=\"model_access\" col=\"2\">\n                    <field name=\"model_access\"/>\n                    <field name=\"field_access\"/>\n                </page>\n                <page name=\"rule_groups\" col=\"1\">\n                    <field name=\"rule_groups\"/>\n                </page>\n                <page name=\"buttons\" col=\"1\">\n                    <field name=\"buttons\"/>\n                </page>\n                <page name=\"menu_access\" col=\"1\">\n                    <field name=\"menu_access\"/>\n                </page>\n            </notebook>\n        </page>\n    </notebook>\n</form>\n"
  },
  {
    "path": "trytond/res/view/group_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"name\" expand=\"2\"/>\n    <field name=\"parent\" expand=\"1\"/>\n</tree>\n"
  },
  {
    "path": "trytond/res/view/sequence_type_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<data>\n    <xpath expr=\"/form\" position=\"inside\">\n      <field name=\"groups\" colspan=\"4\"/>\n    </xpath>\n</data>\n"
  },
  {
    "path": "trytond/res/view/user_application_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"user\"/>\n    <field name=\"user\"/>\n    <newline/>\n    <label name=\"key\"/>\n    <field name=\"key\"/>\n    <label name=\"application\"/>\n    <field name=\"application\"/>\n    <label name=\"state\"/>\n    <field name=\"state\"/>\n    <group id=\"buttons\" colspan=\"2\" col=\"-1\">\n        <button name=\"cancel\" icon=\"tryton-cancel\"/>\n        <button name=\"validate_\" icon=\"tryton-ok\"/>\n    </group>\n</form>\n"
  },
  {
    "path": "trytond/res/view/user_application_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"user\" expand=\"1\"/>\n    <field name=\"key\" expand=\"1\"/>\n    <field name=\"application\" expand=\"1\"/>\n    <field name=\"state\"/>\n    <button name=\"cancel\"/>\n    <button name=\"validate_\"/>\n</tree>\n"
  },
  {
    "path": "trytond/res/view/user_config_start_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form col=\"2\">\n    <image name=\"tryton-info\" xexpand=\"0\" xfill=\"0\"/>\n    <group col=\"1\" id=\"labels\">\n        <label string=\"You can now add some users into the system.\"\n            id=\"add\"\n            yalign=\"0.0\" xalign=\"0.0\" xexpand=\"1\"/>\n        <label string=\"Be careful that the login must be unique.\"\n            id=\"carefull\"\n            yalign=\"0.0\" xalign=\"0.0\" xexpand=\"1\"/>\n    </group>\n</form>\n"
  },
  {
    "path": "trytond/res/view/user_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <group col=\"4\" colspan=\"3\" yalign=\"0\" id=\"header\">\n        <label name=\"name\"/>\n        <field name=\"name\"/>\n        <label name=\"active\"/>\n        <field name=\"active\"/>\n\n        <label name=\"login\"/>\n        <field name=\"login\"/>\n        <label name=\"email\"/>\n        <field name=\"email\" widget=\"email\"/>\n\n        <label name=\"password\"/>\n        <field name=\"password\" widget=\"password\"/>\n        <button name=\"reset_password\" colspan=\"2\" />\n    </group>\n    <field name=\"avatar\" widget=\"image\" height=\"100\" width=\"100\" xexpand=\"0\"/>\n    <notebook colspan=\"4\">\n        <page string=\"User\" id=\"user\">\n            <separator name=\"signature\" colspan=\"4\"/>\n            <field name=\"signature\" colspan=\"4\" widget=\"richtext\"/>\n        </page>\n        <page string=\"Actions\" id=\"actions\">\n            <label name=\"menu\"/>\n            <field name=\"menu\"/>\n            <field name=\"actions\" colspan=\"4\"/>\n        </page>\n        <page string=\"Access Permissions\" col=\"1\" id=\"permissions\">\n            <field name=\"groups\"/>\n        </page>\n        <page name=\"applications\" col=\"1\">\n            <field name=\"applications\"/>\n        </page>\n        <page string=\"Preferences\" col=\"2\" id=\"preferences\">\n            <label name=\"language\"/>\n            <field name=\"language\" widget=\"selection\"/>\n        </page>\n    </notebook>\n</form>\n"
  },
  {
    "path": "trytond/res/view/user_form_preferences.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <group col=\"4\" colspan=\"3\" yalign=\"0\" id=\"header\">\n        <label name=\"name\"/>\n        <field name=\"name\"/>\n        <newline/>\n\n        <label name=\"email\"/>\n        <field name=\"email\" widget=\"email\"/>\n        <label name=\"password\"/>\n        <field name=\"password\" widget=\"password\"/>\n    </group>\n    <field name=\"avatar\" widget=\"image\" height=\"100\" width=\"100\" xexpand=\"0\"/>\n    <notebook colspan=\"4\">\n        <page string=\"User\" id=\"user\">\n            <separator name=\"signature\" colspan=\"4\"/>\n            <field name=\"signature\" colspan=\"4\" widget=\"richtext\"/>\n        </page>\n        <page string=\"Actions\" id=\"actions\">\n            <label name=\"menu\"/>\n            <field name=\"menu\" widget=\"selection\"/>\n            <field name=\"actions\" colspan=\"4\"/>\n        </page>\n        <page string=\"Group Membership\" col=\"1\" id=\"membership\">\n            <field name=\"groups\"/>\n        </page>\n        <page name=\"applications\" col=\"1\">\n            <field name=\"applications\"/>\n        </page>\n        <page string=\"Preferences\" col=\"2\" id=\"preferences\">\n            <label name=\"language\"/>\n            <field name=\"language\" widget=\"selection\"/>\n        </page>\n    </notebook>\n</form>\n"
  },
  {
    "path": "trytond/res/view/user_list.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"name\" expand=\"2\">\n        <prefix id=\"avatar\" icon=\"avatar_url\" icon_type=\"url\" url_size=\"s\"/>\n    </field>\n    <field name=\"login\" expand=\"1\"/>\n    <field name=\"sessions\"/>\n</tree>\n"
  },
  {
    "path": "trytond/res/view/user_warning_form.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<form>\n    <label name=\"user\"/>\n    <field name=\"user\"/>\n    <newline/>\n    <label name=\"name\"/>\n    <field name=\"name\"/>\n    <label name=\"always\"/>\n    <field name=\"always\"/>\n</form>\n"
  },
  {
    "path": "trytond/res/view/user_warning_tree.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tree>\n    <field name=\"user\"/>\n    <field name=\"name\"/>\n    <field name=\"always\"/>\n</tree>\n"
  },
  {
    "path": "trytond/rpc.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport copy\nimport datetime as dt\n\nfrom trytond.transaction import Transaction\n\n__all__ = ['RPC']\n\n\nclass RPC(object):\n    '''Define RPC behavior\n\n    readonly: The transaction mode\n    instantiate: The position or the slice of the arguments to be instanciated\n    result: The function to transform the result\n    check_access: If access right must be checked\n    fresh_session: If a fresh session is required\n    unique: Check instances are unique\n    '''\n\n    __slots__ = ('readonly', 'instantiate', 'result', 'check_access',\n        'fresh_session', 'unique', 'cache')\n\n    def __init__(self, readonly=True, instantiate=None, result=None,\n            check_access=True, fresh_session=False, unique=True, cache=None):\n        self.readonly = readonly\n        self.instantiate = instantiate\n        if result is None:\n            def result(r):\n                return r\n        self.result = result\n        self.check_access = check_access\n        self.fresh_session = fresh_session\n        self.unique = unique\n        if cache:\n            if not isinstance(cache, RPCCache):\n                cache = RPCCache(**cache)\n        self.cache = cache\n\n    def convert(self, obj, *args, **kwargs):\n        args = list(args)\n        kwargs = kwargs.copy()\n        if 'context' in kwargs:\n            context = kwargs.pop('context')\n            if not isinstance(context, dict):\n                raise TypeError(\"context must be a dictionary\")\n        else:\n            try:\n                context = args.pop()\n            except IndexError:\n                context = None\n            if not isinstance(context, dict):\n                raise ValueError(\"Missing context argument\")\n        context = copy.deepcopy(context)\n        timestamp = None\n        for key in list(context.keys()):\n            if key == '_timestamp':\n                timestamp = context[key]\n            # Remove all private keyword but _datetime for history\n            if key.startswith('_') and key != '_datetime':\n                del context[key]\n        if self.instantiate is not None:\n\n            def instance(data):\n                with Transaction().set_context(context):\n                    if isinstance(data, int):\n                        return obj(data)\n                    elif isinstance(data, dict):\n                        return obj(**data)\n                    else:\n                        if self.unique and len(data) != len(set(data)):\n                            raise ValueError(\"Duplicate ids\")\n                        return obj.browse(data)\n            if isinstance(self.instantiate, slice):\n                for i, data in enumerate(args[self.instantiate]):\n                    start, _, step = self.instantiate.indices(len(args))\n                    i = i * step + start\n                    args[i] = instance(data)\n            else:\n                data = args[self.instantiate]\n                args[self.instantiate] = instance(data)\n        if self.check_access:\n            context['_check_access'] = True\n        return args, kwargs, context, timestamp\n\n\nclass RPCCache:\n    __slots__ = ('duration',)\n\n    def __init__(self, days=0, seconds=0):\n        self.duration = dt.timedelta(days=days, seconds=seconds)\n\n    def headers(self):\n        return {\n            'X-Tryton-Cache': int(self.duration.total_seconds()),\n            }\n"
  },
  {
    "path": "trytond/security.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport logging\n\nfrom trytond import backend\nfrom trytond.config import config\nfrom trytond.exceptions import LoginException, RateLimitException\nfrom trytond.pool import Pool\nfrom trytond.transaction import Transaction\n\nlogger = logging.getLogger(__name__)\n\n\ndef _get_pool(dbname):\n    database_list = Pool.database_list()\n    pool = Pool(dbname)\n    if dbname not in database_list:\n        pool.init()\n    return pool\n\n\ndef _get_remote_addr(context):\n    if context and '_request' in context:\n        return context['_request'].get('remote_addr')\n\n\ndef login(dbname, loginname, parameters, cache=True, context=None):\n    for count in range(config.getint('database', 'retry'), -1, -1):\n        with Transaction().start(dbname, 0, context=context) as transaction:\n            pool = _get_pool(dbname)\n            User = pool.get('res.user')\n            try:\n                user_id = User.get_login(loginname, parameters)\n                break\n            except backend.DatabaseOperationalError:\n                if count:\n                    continue\n                raise\n            except (LoginException, RateLimitException):\n                # Let's store any changes done\n                transaction.commit()\n                raise\n    session = None\n    if user_id:\n        if not cache:\n            session = user_id\n        else:\n            with Transaction().start(dbname, user_id):\n                Session = pool.get('ir.session')\n                session = user_id, Session.new()\n        logger.info(\"login succeeded for '%s' from '%s' on database '%s'\",\n            loginname, _get_remote_addr(context), dbname)\n    else:\n        logger.error(\"login failed for '%s' from '%s' on database '%s'\",\n            loginname, _get_remote_addr(context), dbname)\n    return session\n\n\ndef logout(dbname, user, session, context=None):\n    for count in range(config.getint('database', 'retry'), -1, -1):\n        with Transaction().start(dbname, 0, context=context):\n            pool = _get_pool(dbname)\n            Session = pool.get('ir.session')\n            try:\n                name = Session.remove(session)\n                break\n            except backend.DatabaseOperationalError:\n                if count:\n                    continue\n                raise\n    if name:\n        logger.info(\"logout for '%s' from '%s' on database '%s'\",\n            name, _get_remote_addr(context), dbname)\n    else:\n        logger.error(\"logout failed for '%s' from '%s' on database '%s'\",\n            user, _get_remote_addr(context), dbname)\n\n\ndef check(dbname, user, session, context=None):\n    for count in range(config.getint('database', 'retry'), -1, -1):\n        with Transaction().start(dbname, user, context=context) as transaction:\n            pool = _get_pool(dbname)\n            Session = pool.get('ir.session')\n            try:\n                find = Session.check(user, session)\n                break\n            except backend.DatabaseOperationalError:\n                if count:\n                    continue\n                raise\n            finally:\n                transaction.commit()\n    if find is None:\n        logger.error(\"session failed for '%s' from '%s' on database '%s'\",\n            user, _get_remote_addr(context), dbname)\n        return\n    elif not find:\n        logger.info(\"session expired for '%s' from '%s' on database '%s'\",\n            user, _get_remote_addr(context), dbname)\n        return\n    else:\n        logger.debug(\"session valid for '%s' from '%s' on database '%s'\",\n            user, _get_remote_addr(context), dbname)\n        return user\n\n\ndef check_timeout(dbname, user, session, context=None):\n    for count in range(config.getint('database', 'retry'), -1, -1):\n        with Transaction().start(dbname, user, context=context) as transaction:\n            pool = _get_pool(dbname)\n            Session = pool.get('ir.session')\n            try:\n                valid = Session.check_timeout(user, session)\n                break\n            except backend.DatabaseOperationalError:\n                if count:\n                    continue\n                raise\n            finally:\n                transaction.commit()\n    if not valid:\n        logger.info(\"session timeout for '%s' from '%s' on database '%s'\",\n            user, _get_remote_addr(context), dbname)\n    return valid\n\n\ndef reset(dbname, session, context):\n    try:\n        with Transaction().start(dbname, 0, context=context, autocommit=True):\n            pool = _get_pool(dbname)\n            Session = pool.get('ir.session')\n            Session.reset(session)\n    except backend.DatabaseOperationalError:\n        logger.debug('Reset session failed', exc_info=True)\n"
  },
  {
    "path": "trytond/sendmail.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport logging\nimport smtplib\nimport ssl\nimport time\nfrom email.message import Message\nfrom email.mime.text import MIMEText\nfrom email.utils import formatdate\nfrom urllib.parse import parse_qs, unquote_plus\n\nfrom trytond.config import config, parse_uri\nfrom trytond.transaction import Transaction\n\n__all__ = ['sendmail_transactional', 'sendmail', 'SMTPDataManager']\nlogger = logging.getLogger(__name__)\nretry = config.getint('email', 'retry', default=5)\n\n\ndef sendmail_transactional(\n        from_addr, to_addrs, msg, transaction=None, datamanager=None,\n        strict=False):\n    if transaction is None:\n        transaction = Transaction()\n    assert isinstance(transaction, Transaction), transaction\n    if datamanager is None:\n        datamanager = SMTPDataManager(strict=strict)\n    datamanager = transaction.join(datamanager)\n    datamanager.put(from_addr, to_addrs, msg)\n\n\ndef sendmail(from_addr, to_addrs, msg, server=None, strict=False):\n    if server is None:\n        server = get_smtp_server(strict=strict)\n        if not server:\n            return\n        quit = True\n    else:\n        assert server.uri\n        quit = False\n    if 'Date' not in msg:\n        msg['Date'] = formatdate()\n    for count in range(retry, -1, -1):\n        if count != retry:\n            time.sleep(0.02 * (retry - count))\n        try:\n            senderrs = server.sendmail(from_addr, to_addrs, msg.as_string())\n        except smtplib.SMTPResponseException as e:\n            if count and 400 <= e.smtp_code <= 499 and hasattr(server, 'uri'):\n                server.quit()\n                server = get_smtp_server(server.uri, strict=strict)\n                if server:\n                    continue\n            if strict:\n                raise\n            logger.error('fail to send email', exc_info=True)\n        except Exception:\n            if strict:\n                raise\n            logger.error('fail to send email', exc_info=True)\n        else:\n            if senderrs:\n                logger.warning('fail to send email to %s', senderrs)\n        break\n    if quit:\n        server.quit()\n    else:\n        return server\n\n\ndef send_test_email(to_addrs, server=None):\n    from_ = config.get('email', 'from')\n    msg = MIMEText('Success!\\nYour email settings work correctly.')\n    msg['From'] = from_\n    msg['To'] = to_addrs\n    msg['Subject'] = 'Tryton test email'\n    sendmail(\n        config.get('email', 'from'), to_addrs, msg, server=server, strict=True)\n\n\ndef get_smtp_server(uri=None, strict=False):\n    if uri is None:\n        uri = config.get('email', 'uri')\n    ini_uri = uri\n    uri = parse_uri(uri)\n    extra = {}\n    if uri.query:\n        cast = {'timeout': int}\n        for key, value in parse_qs(uri.query, strict_parsing=True).items():\n            extra[key] = cast.get(key, lambda a: a)(value[0])\n    if uri.scheme.startswith('smtps'):\n        connector = smtplib.SMTP_SSL\n        extra['context'] = ssl.create_default_context()\n    else:\n        connector = smtplib.SMTP\n    try:\n        server = connector(uri.hostname, uri.port, **extra)\n    except Exception:\n        if strict:\n            raise\n        logger.error('fail to connect to %s', uri, exc_info=True)\n        return\n\n    if 'tls' in uri.scheme:\n        server.starttls(context=ssl.create_default_context())\n\n    if uri.username and uri.password:\n        server.login(\n            unquote_plus(uri.username),\n            unquote_plus(uri.password))\n    server.uri = ini_uri\n    return server\n\n\nclass SMTPDataManager(object):\n\n    def __init__(self, uri=None, strict=False):\n        self.uri = uri\n        self.strict = strict\n        self.queue = []\n        self._server = None\n\n    def put(self, from_addr, to_addrs, msg):\n        assert isinstance(msg, Message), msg\n        self.queue.append((from_addr, to_addrs, msg))\n\n    def __eq__(self, other):\n        if not isinstance(other, SMTPDataManager):\n            return NotImplemented\n        return (self.uri == other.uri) and (self.strict == other.strict)\n\n    def abort(self, trans):\n        self._finish()\n\n    def tpc_begin(self, trans):\n        pass\n\n    def commit(self, trans):\n        pass\n\n    def tpc_vote(self, trans):\n        if self._server is None:\n            self._server = get_smtp_server(self.uri, strict=self.strict)\n\n    def tpc_finish(self, trans):\n        if self._server is not None:\n            for from_addr, to_addrs, msg in self.queue:\n                new_server = sendmail(\n                    from_addr, to_addrs, msg, server=self._server)\n                if new_server:\n                    self._server = new_server\n            self._server.quit()\n            self._finish()\n\n    def tpc_abort(self, trans):\n        if self._server:\n            self._server.close()\n        self._finish()\n\n    def _finish(self):\n        self._server = None\n        self.queue = []\n"
  },
  {
    "path": "trytond/status.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport json\nimport logging\nimport os\nimport platform\nimport socket\nimport threading\nimport time\nfrom collections import namedtuple\nfrom contextlib import contextmanager\n\nstatus = dict()\nlogger = logging.getLogger(__name__)\naddress = 'trytond-stat.socket'\n\nProcess = namedtuple('Process', ['start_time', 'request'])\n\n_PID = None\n_PATH = None\n_LOCK = threading.Lock()\n\n\n@contextmanager\ndef processing(request):\n    start(_PATH)  # check if running thread\n    process = Process(time.perf_counter(), request)\n    status[id(process)] = process\n    try:\n        yield\n    finally:\n        status.pop(id(process), None)\n\n\ndef log():\n    from trytond.cache import Cache\n    msg = []\n    now = time.perf_counter()\n    for process in sorted(status.copy().values(), key=lambda p: p.start_time):\n        msg.append({\n                'since': now - process.start_time,\n                'request': str(process.request),\n                })\n    return {\n        'id': '%s@%s' % (os.getpid(), platform.node()),\n        'status': msg,\n        'caches': list(Cache.stats()),\n        }\n\n\ndef dump(path):\n    if not hasattr(socket, 'AF_UNIX'):\n        return False\n    sock = socket.socket(socket.AF_UNIX)\n    try:\n        try:\n            sock.connect(os.path.join(path, address))\n        except socket.error:\n            return False\n        try:\n            sock.sendall(json.dumps(log()).encode('utf-8'))\n        except socket.error:\n            pass\n    finally:\n        sock.close()\n    return True\n\n\ndef dumper(path):\n    while True:\n        if dump(path):\n            time.sleep(5)\n        else:\n            time.sleep(60)\n\n\ndef start(path):\n    global _PID, _PATH\n    if not hasattr(socket, 'AF_UNIX'):\n        return\n    if _PID != os.getpid() and path:  # Quick test without lock\n        with _LOCK:\n            if _PID != os.getpid():\n                threading.Thread(\n                    target=dumper, args=(path,), daemon=True).start()\n                _PID = os.getpid()\n                _PATH = path\n\n\ndef listen(path, callback=None):\n    if not hasattr(socket, 'AF_UNIX'):\n        return False\n    sock = socket.socket(socket.AF_UNIX)\n    socket_file = os.path.join(path, address)\n    try:\n        sock.bind(socket_file)\n        sock.listen(1)\n        sock.settimeout(5)\n        while True:\n            try:\n                connection, client_address = sock.accept()\n            except socket.timeout:\n                if callback:\n                    callback()\n                continue\n            try:\n                data = b''\n                while True:\n                    chunk = connection.recv(1024)\n                    if not chunk:\n                        break\n                    else:\n                        data += chunk\n                try:\n                    data = json.loads(data)\n                except ValueError:\n                    continue\n                if callback:\n                    callback(data)\n            finally:\n                connection.close()\n    finally:\n        sock.close()\n        os.unlink(socket_file)\n    return True\n"
  },
  {
    "path": "trytond/tests/__init__.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\ntry:\n    import pkg_resources\nexcept ImportError:\n    pkg_resources = None\n\n\ndef register():\n    from . import (\n        access, copy_, export_data, field_binary, field_boolean, field_char,\n        field_context, field_date, field_datetime, field_dict, field_float,\n        field_function, field_integer, field_many2many, field_many2one,\n        field_multiselection, field_numeric, field_one2many, field_one2one,\n        field_reference, field_selection, field_text, field_time,\n        field_timedelta, history, import_data, mixin, model, modelsql,\n        modelstorage, modelview, mptt, multivalue, path, resource, rule, tree,\n        trigger, wizard, workflow)\n\n    access.register('tests')\n    copy_.register('tests')\n    export_data.register('tests')\n    field_binary.register('tests')\n    field_boolean.register('tests')\n    field_char.register('tests')\n    field_context.register('tests')\n    field_date.register('tests')\n    field_datetime.register('tests')\n    field_dict.register('tests')\n    field_float.register('tests')\n    field_function.register('tests')\n    field_integer.register('tests')\n    field_many2many.register('tests')\n    field_many2one.register('tests')\n    field_multiselection.register('tests')\n    field_numeric.register('tests')\n    field_one2many.register('tests')\n    field_one2one.register('tests')\n    field_reference.register('tests')\n    field_selection.register('tests')\n    field_text.register('tests')\n    field_time.register('tests')\n    field_timedelta.register('tests')\n    history.register('tests')\n    import_data.register('tests')\n    mixin.register('tests')\n    model.register('tests')\n    modelsql.register('tests')\n    modelstorage.register('tests')\n    modelview.register('tests')\n    mptt.register('tests')\n    multivalue.register('tests')\n    path.register('tests')\n    resource.register('tests')\n    rule.register('tests')\n    tree.register('tests')\n    trigger.register('tests')\n    wizard.register('tests')\n    workflow.register('tests')\n\n    if pkg_resources is not None:\n        entry_points = pkg_resources.iter_entry_points('trytond.tests')\n        for test_ep in entry_points:\n            test_module = test_ep.load()\n            if hasattr(test_module, 'register'):\n                test_module.register('tests')\n"
  },
  {
    "path": "trytond/tests/access.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\n\n\nclass TestAccess(ModelSQL):\n    'Test Access'\n    __name__ = 'test.access'\n    field1 = fields.Char('Field 1')\n    field2 = fields.Char('Field 2')\n    relate = fields.Many2One('test.access.relate', \"Relate\")\n    reference = fields.Reference(\"Reference\", [\n            (None, \"\"),\n            ('test.access.relate', \"Reference\"),\n            ])\n    dict_ = fields.Dict(None, \"Dict\")\n\n\nclass TestAccessRelate(ModelSQL):\n    \"Test Access\"\n    __name__ = 'test.access.relate'\n    value = fields.Integer(\"Value\")\n    parent = fields.Many2One('test.access.relate', \"Parent\")\n\n\nclass TestAccessModel(TestAccess):\n    \"Test Access from Model\"\n    __name__ = 'test.access.model'\n    access = fields.Many2One('test.access', \"Access\")\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        cls.__access__.add('access')\n\n\ndef register(module):\n    Pool.register(\n        TestAccess,\n        TestAccessRelate,\n        TestAccessModel,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/copy_.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\"Test for copy\"\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\n\n\nclass Copy(ModelSQL):\n    \"Copy\"\n    __name__ = 'test.copy'\n    name = fields.Char(\"Name\")\n\n\nclass CopyOne2Many(ModelSQL):\n    \"Copy One2Many\"\n    __name__ = 'test.copy.one2many'\n    name = fields.Char('Name')\n    one2many = fields.One2Many('test.copy.one2many.target', 'one2many',\n        'One2Many')\n\n\nclass CopyOne2ManyTarget(ModelSQL):\n    \"Copy One2Many Target\"\n    __name__ = 'test.copy.one2many.target'\n    name = fields.Char('Name')\n    one2many = fields.Many2One('test.copy.one2many', 'One2Many')\n\n\nclass CopyOne2ManyReference(ModelSQL):\n    \"Copy One2Many Reference\"\n    __name__ = 'test.copy.one2many_reference'\n    name = fields.Char('Name')\n    one2many = fields.One2Many('test.copy.one2many_reference.target',\n        'one2many', 'One2Many')\n\n\nclass CopyOne2ManyReferenceTarget(ModelSQL):\n    \"Copy One2Many ReferenceTarget\"\n    __name__ = 'test.copy.one2many_reference.target'\n    name = fields.Char('Name')\n    one2many = fields.Reference('One2Many', [\n            (None, ''),\n            ('test.copy.one2many_reference', 'One2Many'),\n            ])\n\n\nclass CopyMany2Many(ModelSQL):\n    \"Copy Many2Many\"\n    __name__ = 'test.copy.many2many'\n    name = fields.Char('Name')\n    many2many = fields.Many2Many('test.copy.many2many.rel', 'many2many',\n        'many2many_target', 'Many2Many')\n\n\nclass CopyMany2ManyTarget(ModelSQL):\n    \"Copy Many2Many Target\"\n    __name__ = 'test.copy.many2many.target'\n    name = fields.Char('Name')\n\n\nclass CopyMany2ManyRelation(ModelSQL):\n    \"Copy Many2Many Relation\"\n    __name__ = 'test.copy.many2many.rel'\n    name = fields.Char('Name')\n    many2many = fields.Many2One('test.copy.many2many', 'Many2Many')\n    many2many_target = fields.Many2One('test.copy.many2many.target',\n        'Many2Many Target')\n\n\nclass CopyMany2ManyReference(ModelSQL):\n    \"Copy Many2ManyReference\"\n    __name__ = 'test.copy.many2many_reference'\n    name = fields.Char('Name')\n    many2many = fields.Many2Many('test.copy.many2many_reference.rel',\n        'many2many', 'many2many_target', 'Many2Many')\n\n\nclass CopyMany2ManyReferenceTarget(ModelSQL):\n    \"Copy Many2ManyReference Target\"\n    __name__ = 'test.copy.many2many_reference.target'\n    name = fields.Char('Name')\n\n\nclass CopyMany2ManyReferenceRelation(ModelSQL):\n    \"Copy Many2ManyReference Relation\"\n    __name__ = 'test.copy.many2many_reference.rel'\n    name = fields.Char('Name')\n    many2many = fields.Reference('Many2Many', [\n            (None, ''),\n            ('test.copy.many2many_reference', 'Many2Many'),\n            ])\n    many2many_target = fields.Many2One('test.copy.many2many_reference.target',\n        'Many2ManyReference Target')\n\n\nclass CopyBinary(ModelSQL):\n    \"Copy Binary\"\n    __name__ = 'test.copy.binary'\n    binary = fields.Binary(\"Binary\")\n    binary_id = fields.Binary(\"Binary with ID\", file_id='file_id')\n    file_id = fields.Char(\"Binary ID\")\n\n\nclass CopyAccess(ModelSQL):\n    \"Copy with Access\"\n    __name__ = 'test.copy.access'\n    name = fields.Char(\"Name\")\n\n    @classmethod\n    def default_name(cls):\n        return \"Default\"\n\n\nclass CopyTranslate(ModelSQL):\n    \"Copy Translate\"\n    __name__ = 'test.copy.translate'\n    name = fields.Char(\"Name\", translate=True)\n\n\ndef register(module):\n    Pool.register(\n        Copy,\n        CopyOne2Many,\n        CopyOne2ManyTarget,\n        CopyOne2ManyReference,\n        CopyOne2ManyReferenceTarget,\n        CopyMany2Many,\n        CopyMany2ManyTarget,\n        CopyMany2ManyRelation,\n        CopyMany2ManyReference,\n        CopyMany2ManyReferenceTarget,\n        CopyMany2ManyReferenceRelation,\n        CopyBinary,\n        CopyAccess,\n        CopyTranslate,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/export_data.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\"Test for export_data\"\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool, PoolMeta\n\n\nclass ExportDataTarget(ModelSQL):\n    \"Export Data Target\"\n    __name__ = 'test.export_data.target'\n    name = fields.Char('Name')\n\n\nclass ExportData(ModelSQL):\n    \"Export Data\"\n    __name__ = 'test.export_data'\n    boolean = fields.Boolean('Boolean')\n    integer = fields.Integer('Integer')\n    float = fields.Float('Float')\n    numeric = fields.Numeric('Numeric')\n    char = fields.Char('Char')\n    text = fields.Text('Text')\n    date = fields.Date('Date')\n    datetime = fields.DateTime('DateTime')\n    timedelta = fields.TimeDelta('TimeDelta')\n    selection = fields.Selection([\n            (None, ''),\n            ('select1', 'Select 1'),\n            ('select2', 'Select 2'),\n            ], 'Selection')\n    many2one = fields.Many2One('test.export_data.target',\n            'Many2One')\n    many2many = fields.Many2Many('test.export_data.relation',\n            'many2many', 'target', 'Many2Many')\n    one2many = fields.One2Many('test.export_data.target', 'one2many',\n            'One2Many')\n    reference = fields.Reference('Reference', [\n            (None, ''),\n            ('test.export_data.target', 'Target'),\n            ])\n\n\nclass ExportDataTarget2(metaclass=PoolMeta):\n    'Export Date Target'\n    __name__ = 'test.export_data.target'\n    one2many = fields.Many2One('test.export_data', 'Export Data')\n\n\nclass ExportDataRelation(ModelSQL):\n    \"Export Data Many2Many\"\n    __name__ = 'test.export_data.relation'\n    many2many = fields.Many2One('test.export_data', 'Export Data')\n    target = fields.Many2One('test.export_data.target', 'Target')\n\n\ndef register(module):\n    Pool.register(\n        ExportDataTarget,\n        ExportData,\n        ExportDataTarget2,\n        ExportDataRelation,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_binary.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\n\n\nclass Binary(ModelSQL):\n    'Binary'\n    __name__ = 'test.binary'\n    binary = fields.Binary('Binary')\n\n\nclass BinaryDefault(ModelSQL):\n    'Binary Default'\n    __name__ = 'test.binary_default'\n    binary = fields.Binary('Binary Default')\n\n    @staticmethod\n    def default_binary():\n        return b'default'\n\n\nclass BinaryRequired(ModelSQL):\n    'Binary Required'\n    __name__ = 'test.binary_required'\n    binary = fields.Binary('Binary Required', required=True)\n\n\nclass BinaryFileStorage(ModelSQL):\n    \"Binary in FileStorage\"\n    __name__ = 'test.binary_filestorage'\n    binary = fields.Binary('Binary', file_id='binary_id')\n    binary_id = fields.Char('Binary ID')\n\n\ndef register(module):\n    Pool.register(\n        Binary,\n        BinaryDefault,\n        BinaryRequired,\n        BinaryFileStorage,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_boolean.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\n\n\nclass Boolean(ModelSQL):\n    'Boolean'\n    __name__ = 'test.boolean'\n    boolean = fields.Boolean(string='Boolean', help='Test boolean')\n\n\nclass BooleanDefault(ModelSQL):\n    'Boolean Default'\n    __name__ = 'test.boolean_default'\n    boolean = fields.Boolean(string='Boolean', help='Test boolean')\n\n    @staticmethod\n    def default_boolean():\n        return True\n\n\ndef register(module):\n    Pool.register(\n        Boolean,\n        BooleanDefault,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_char.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval\n\n\nclass Char(ModelSQL):\n    'Char'\n    __name__ = 'test.char'\n    char = fields.Char(\"Char\")\n    char_lstripped = fields.Char(\"Char\", strip='leading')\n    char_rstripped = fields.Char(\"Char\", strip='trailing')\n    char_unstripped = fields.Char(\"Char\", strip=False)\n\n\nclass CharDefault(ModelSQL):\n    'Char Default'\n    __name__ = 'test.char_default'\n    char = fields.Char(\"Char\")\n\n    @staticmethod\n    def default_char():\n        return 'Test'\n\n\nclass CharRequired(ModelSQL):\n    'Char Required'\n    __name__ = 'test.char_required'\n    char = fields.Char(\"Char\", required=True)\n\n\nclass CharSize(ModelSQL):\n    'Char Size'\n    __name__ = 'test.char_size'\n    char = fields.Char(\"Char\", size=5)\n\n\nclass CharSizePYSON(ModelSQL):\n    \"Char PYSON Size\"\n    __name__ = 'test.char_size_pyson'\n    char = fields.Char(\n        \"Char\", size=Eval('size', 0),\n        depends=['size'])\n    size = fields.Integer(\"Size\")\n\n\nclass CharTranslate(ModelSQL):\n    'Char Translate'\n    __name__ = 'test.char_translate'\n    char = fields.Char(\"Char\", translate=True)\n    char_lstripped = fields.Char(\"Char\", strip='leading', translate=True)\n    char_rstripped = fields.Char(\"Char\", strip='trailing', translate=True)\n    char_unstripped = fields.Char(\"Char\", strip=False, translate=True)\n\n\nclass CharUnaccentedOn(ModelSQL):\n    'Char Unaccented'\n    __name__ = 'test.char_unaccented_on'\n    char = fields.Char(\"Char\")\n\n\nclass CharUnaccentedOff(ModelSQL):\n    'Char Unaccented'\n    __name__ = 'test.char_unaccented_off'\n    char = fields.Char(\"Char\")\n\n    @classmethod\n    def __setup__(cls):\n        super(CharUnaccentedOff, cls).__setup__()\n        cls.char.search_unaccented = False\n\n\nclass CharUnaccentedTranslate(ModelSQL):\n    'Char Unaccented Translate'\n    __name__ = 'test.char_unaccented_translate'\n    char = fields.Char(\"Char\", translate=True)\n\n\ndef register(module):\n    Pool.register(\n        Char,\n        CharDefault,\n        CharRequired,\n        CharSize,\n        CharSizePYSON,\n        CharTranslate,\n        CharUnaccentedOn,\n        CharUnaccentedOff,\n        CharUnaccentedTranslate,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_context.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval\n\n\nclass FieldContextParent(ModelSQL):\n    'Field Context Parent'\n    __name__ = 'test.field_context.parent'\n    name = fields.Char('Name')\n    child = fields.Many2One('test.field_context.child', 'Child',\n        context={\n            'name': Eval('name'),\n            'rec_name': Eval('rec_name'),\n            },\n        depends=['name'])\n\n\nclass FieldContextChild(ModelSQL):\n    'Field Context Child'\n    __name__ = 'test.field_context.child'\n\n\ndef register(module):\n    Pool.register(\n        FieldContextParent,\n        FieldContextChild,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_date.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport datetime\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\n\n\nclass Date(ModelSQL):\n    'Date'\n    __name__ = 'test.date'\n    date = fields.Date(string='Date', help='Test date',\n            required=False)\n\n\nclass DateDefault(ModelSQL):\n    'Date Default'\n    __name__ = 'test.date_default'\n    date = fields.Date(string='Date', help='Test date',\n            required=False)\n\n    @staticmethod\n    def default_date():\n        return datetime.date(2000, 1, 1)\n\n\nclass DateRequired(ModelSQL):\n    'Date Required'\n    __name__ = 'test.date_required'\n    date = fields.Date(string='Date', help='Test date',\n            required=True)\n\n\ndef register(module):\n    Pool.register(\n        Date,\n        DateDefault,\n        DateRequired,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_datetime.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport datetime\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\n\n\nclass DateTime(ModelSQL):\n    'DateTime'\n    __name__ = 'test.datetime'\n    datetime = fields.DateTime(string='DateTime', help='Test datetime',\n            required=False)\n\n\nclass DateTimeDefault(ModelSQL):\n    'DateTime Default'\n    __name__ = 'test.datetime_default'\n    datetime = fields.DateTime(string='DateTime', help='Test datetime',\n            required=False)\n\n    @staticmethod\n    def default_datetime():\n        return datetime.datetime(2000, 1, 1, 12, 0, 0, 0)\n\n\nclass DateTimeRequired(ModelSQL):\n    'DateTime Required'\n    __name__ = 'test.datetime_required'\n    datetime = fields.DateTime(string='DateTime', help='Test datetime',\n            required=True)\n\n\nclass DateTimeFormat(ModelSQL):\n    'DateTime Format'\n    __name__ = 'test.datetime_format'\n    datetime = fields.DateTime(string='DateTime', format='%H:%M')\n\n\ndef register(module):\n    Pool.register(\n        DateTime,\n        DateTimeDefault,\n        DateTimeRequired,\n        DateTimeFormat,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_dict.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import DictSchemaMixin, ModelSQL, fields\nfrom trytond.pool import Pool\n\n\nclass DictSchema(DictSchemaMixin, ModelSQL):\n    'Dict Schema'\n    __name__ = 'test.dict.schema'\n\n\nclass Dict(ModelSQL):\n    'Dict'\n    __name__ = 'test.dict'\n    dico = fields.Dict('test.dict.schema', 'Test Dict')\n    dico_string = dico.translated('dico')\n    dico_string_keys = dico.translated('dico', 'keys')\n\n\nclass DictDefault(ModelSQL):\n    'Dict Default'\n    __name__ = 'test.dict_default'\n    dico = fields.Dict(None, 'Test Dict')\n\n    @staticmethod\n    def default_dico():\n        return dict(a=1)\n\n\nclass DictRequired(ModelSQL):\n    'Dict Required'\n    __name__ = 'test.dict_required'\n    dico = fields.Dict(None, 'Test Dict', required=True)\n\n\nclass DictText(ModelSQL):\n    'Dict TEXT'\n    __name__ = 'test.dict_text'\n    dico = fields.Dict('test.dict.schema', 'Test Dict')\n    dico._sql_type = 'TEXT'\n\n\nclass DictNoSchema(ModelSQL):\n    \"Dict No Schema\"\n    __name__ = 'test.dict_noschema'\n    dico = fields.Dict(None, \"Dict\")\n\n\nclass DictUnaccentedOn(ModelSQL):\n    \"Dict Unaccented On\"\n    __name__ = 'test.dict_unaccented_on'\n    dico = fields.Dict(None, \"Dict\")\n\n\nclass DictUnaccentedOff(ModelSQL):\n    \"Dict Unaccented Off\"\n    __name__ = 'test.dict_unaccented_off'\n    dico = fields.Dict(None, \"Dict\")\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        cls.dico.search_unaccented = False\n\n\ndef register(module):\n    Pool.register(\n        DictSchema,\n        Dict,\n        DictDefault,\n        DictRequired,\n        DictText,\n        DictNoSchema,\n        DictUnaccentedOn,\n        DictUnaccentedOff,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_float.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval\n\n\nclass Float(ModelSQL):\n    'Float'\n    __name__ = 'test.float'\n    float = fields.Float(string='Float', help='Test float',\n            required=False)\n\n\nclass FloatDefault(ModelSQL):\n    'Float Default'\n    __name__ = 'test.float_default'\n    float = fields.Float(string='Float', help='Test float',\n            required=False)\n\n    @staticmethod\n    def default_float():\n        return 5.5\n\n\nclass FloatRequired(ModelSQL):\n    'Float Required'\n    __name__ = 'test.float_required'\n    float = fields.Float(string='Float', help='Test float',\n            required=True)\n\n\nclass FloatDigits(ModelSQL):\n    'Float Digits'\n    __name__ = 'test.float_digits'\n    digits = fields.Integer('Digits')\n    float = fields.Float(string='Float', help='Test float',\n        required=False, digits=(16, Eval('digits', 2)),\n        depends=['digits'])\n\n\ndef register(module):\n    Pool.register(\n        Float,\n        FloatDefault,\n        FloatRequired,\n        FloatDigits,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_function.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\nfrom trytond.transaction import Transaction\n\n\nclass FunctionAccessor(ModelSQL):\n    \"Function Accessor\"\n    __name__ = 'test.function.accessor'\n\n    target = fields.Many2One('test.function.accessor.target', \"Target\")\n    function = fields.Function(\n        fields.Many2One('test.function.accessor.target', \"Function\"),\n        'on_change_with_function')\n\n    @fields.depends('target')\n    def on_change_with_function(self, name=None):\n        if self.target:\n            return self.target.id\n\n\nclass FunctionAccessorTarget(ModelSQL):\n    \"Function Accessor Target\"\n    __name__ = 'test.function.accessor.target'\n\n\nclass FunctionGetterContext(ModelSQL):\n    \"Function Getter Context\"\n    __name__ = 'test.function.getter_context'\n\n    function_with_context = fields.Function(\n        fields.Char(\"Function\"),\n        'getter', getter_with_context=True)\n    function_without_context = fields.Function(\n        fields.Char(\"Function\"),\n        'getter', getter_with_context=False)\n\n    def getter(self, name):\n        context = Transaction().context\n        return '%s - %s' % (\n            context.get('language', 'empty'), context.get('test', 'empty'))\n\n\nclass FunctionGetterLocalCache(ModelSQL):\n    \"Function Getter with local cache\"\n    __name__ = 'test.function.getter_local_cache'\n\n    function1 = fields.Function(\n        fields.Char(\"Char 1\"), 'get_function1')\n    function2 = fields.Function(\n        fields.Char(\"Char 2\"), 'get_function2')\n\n    def get_function1(self, name):\n        return \"test\"\n\n    def get_function2(self, name):\n        return self.function1.upper()\n\n    @classmethod\n    def index_get_field(cls, name):\n        index = super().index_get_field(name)\n        if name == 'function2':\n            index = cls.index_get_field('function1') + 1\n        return index\n\n\ndef register(module):\n    Pool.register(\n        FunctionAccessor,\n        FunctionAccessorTarget,\n        FunctionGetterContext,\n        FunctionGetterLocalCache,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_function.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <record model=\"test.function.getter_context\" id=\"field_function_getter_context\">\n        </record>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/tests/field_integer.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\n\n\nclass Integer(ModelSQL):\n    'Integer'\n    __name__ = 'test.integer'\n    integer = fields.Integer(string='Integer', help='Test integer',\n            required=False)\n\n\nclass IntegerDefault(ModelSQL):\n    'Integer Default'\n    __name__ = 'test.integer_default'\n    integer = fields.Integer(string='Integer', help='Test integer',\n            required=False)\n\n    @staticmethod\n    def default_integer():\n        return 5\n\n\nclass IntegerRequired(ModelSQL):\n    'Integer Required'\n    __name__ = 'test.integer_required'\n    integer = fields.Integer(string='Integer', help='Test integer',\n            required=True)\n\n\nclass IntegerDomain(ModelSQL):\n    'Integer Domain'\n    __name__ = 'test.integer_domain'\n    integer = fields.Integer('Integer', domain=[('integer', '>', 42)])\n\n\ndef register(module):\n    Pool.register(\n        Integer,\n        IntegerDefault,\n        IntegerRequired,\n        IntegerDomain,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_many2many.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\nfrom trytond.transaction import Transaction\n\n\nclass Many2Many(ModelSQL):\n    'Many2Many'\n    __name__ = 'test.many2many'\n    targets = fields.Many2Many('test.many2many.relation', 'origin', 'target',\n        'Targets')\n\n\nclass Many2ManyTarget(ModelSQL):\n    'Many2Many Target'\n    __name__ = 'test.many2many.target'\n    name = fields.Char('Name')\n\n\nclass Many2ManyRelation(ModelSQL):\n    'Many2Many Relation'\n    __name__ = 'test.many2many.relation'\n    origin = fields.Many2One('test.many2many', 'Origin')\n    target = fields.Many2One('test.many2many.target', 'Target')\n\n\nclass Many2ManyRequired(ModelSQL):\n    'Many2Many Required'\n    __name__ = 'test.many2many_required'\n    targets = fields.Many2Many('test.many2many_required.relation', 'origin',\n        'target', 'Targets', required=True)\n\n\nclass Many2ManyRequiredTarget(ModelSQL):\n    'Many2Many Required Target'\n    __name__ = 'test.many2many_required.target'\n    name = fields.Char('Name')\n\n\nclass Many2ManyRequiredRelation(ModelSQL):\n    'Many2Many Required Relation'\n    __name__ = 'test.many2many_required.relation'\n    origin = fields.Many2One('test.many2many_required', 'Origin')\n    target = fields.Many2One('test.many2many_required.target', 'Target')\n\n\nclass Many2ManyReference(ModelSQL):\n    'Many2Many Reference'\n    __name__ = 'test.many2many_reference'\n    targets = fields.Many2Many('test.many2many_reference.relation', 'origin',\n        'target', 'Targets')\n\n\nclass Many2ManyReferenceTarget(ModelSQL):\n    'Many2Many Reference Target'\n    __name__ = 'test.many2many_reference.target'\n    name = fields.Char('Name')\n\n\nclass Many2ManyReferenceRelation(ModelSQL):\n    'Many2Many Relation'\n    __name__ = 'test.many2many_reference.relation'\n    origin = fields.Reference('Origin', [\n            (None, ''),\n            ('test.many2many_reference', 'Many2Many Reference'),\n            ])\n    target = fields.Many2One('test.many2many_reference.target',\n        'Reference Target')\n\n\nclass Many2ManySize(ModelSQL):\n    'Many2Many Size Relation'\n    __name__ = 'test.many2many_size'\n    targets = fields.Many2Many('test.many2many_size.relation', 'origin',\n        'target', 'Targets', size=3)\n\n\nclass Many2ManySizeTarget(ModelSQL):\n    'Many2Many Size Target'\n    __name__ = 'test.many2many_size.target'\n    name = fields.Char('Name')\n\n\nclass Many2ManySizeRelation(ModelSQL):\n    'Many2Many Size Relation'\n    __name__ = 'test.many2many_size.relation'\n    origin = fields.Many2One('test.many2many_size', 'Origin')\n    target = fields.Many2One('test.many2many_size.target', 'Target')\n\n\nclass Many2ManyFilter(ModelSQL):\n    'Many2Many Filter Relation'\n    __name__ = 'test.many2many_filter'\n    targets = fields.Many2Many('test.many2many_filter.relation', 'origin',\n        'target', 'Targets')\n    filtered_targets = fields.Many2Many('test.many2many_filter.relation',\n        'origin', 'target', 'Targets',\n        filter=[('value', '>', 2)])\n    or_filtered_targets = fields.Many2Many('test.many2many_filter.relation',\n        'origin', 'target', 'Targets',\n        filter=['OR', ('value', '>', 2), ('value', '<', 0)])\n\n\nclass Many2ManyFilterTarget(ModelSQL):\n    'Many2Many Filter Target'\n    __name__ = 'test.many2many_filter.target'\n    value = fields.Integer('Value')\n\n\nclass Many2ManyFilterRelation(ModelSQL):\n    'Many2Many Filter Relation'\n    __name__ = 'test.many2many_filter.relation'\n    origin = fields.Many2One('test.many2many_filter', 'Origin')\n    target = fields.Many2One('test.many2many_filter.target', 'Target')\n\n\nclass Many2ManyFilterDomain(ModelSQL):\n    'Many2Many Filter Domain Relation'\n    __name__ = 'test.many2many_filter_domain'\n    targets = fields.Many2Many('test.many2many_filter_domain.relation',\n        'origin', 'target', 'Targets', domain=[('value', '<', 10)])\n    filtered_targets = fields.Many2Many(\n        'test.many2many_filter_domain.relation', 'origin', 'target', 'Targets',\n        domain=[('value', '<', 10)], filter=[('value', '>', 2)])\n\n\nclass Many2ManyFilterDomainTarget(ModelSQL):\n    'Many2Many Filter Domain Target'\n    __name__ = 'test.many2many_filter_domain.target'\n    value = fields.Integer('Value')\n\n\nclass Many2ManyFilterDomainRelation(ModelSQL):\n    'Many2Many Filter Domain Relation'\n    __name__ = 'test.many2many_filter_domain.relation'\n    origin = fields.Many2One('test.many2many_filter_domain', 'Origin')\n    target = fields.Many2One('test.many2many_filter.target', 'Target')\n\n\nclass Many2ManyTree(ModelSQL):\n    'Many2Many Tree'\n    __name__ = 'test.many2many_tree'\n    parents = fields.Many2Many('test.many2many_tree.relation',\n        'child', 'parent', 'Parents')\n    children = fields.Many2Many('test.many2many_tree.relation',\n        'parent', 'child', 'Children')\n\n\nclass Many2ManyTreeRelation(ModelSQL):\n    'Many2Many Tree Relation'\n    __name__ = 'test.many2many_tree.relation'\n    parent = fields.Many2One('test.many2many_tree', 'Parent')\n    child = fields.Many2One('test.many2many_tree', 'Child')\n\n\nclass Many2ManyContext(ModelSQL):\n    \"Many2Many Context\"\n    __name__ = 'test.many2many_context'\n    targets = fields.Many2Many(\n        'test.many2many_context.relation', 'origin', 'target', \"Targets\",\n        context={'test': 'foo'})\n\n\nclass Many2ManyContextRelation(ModelSQL):\n    \"Many2Many Context Relation\"\n    __name__ = 'test.many2many_context.relation'\n    origin = fields.Many2One('test.many2many_context', \"Origin\")\n    target = fields.Many2One('test.many2many_context.target', \"Target\")\n\n\nclass Many2ManyContextTarget(ModelSQL):\n    \"Many2Many Context Target\"\n    __name__ = 'test.many2many_context.target'\n    context = fields.Function(fields.Char(\"context\"), 'get_context')\n\n    def get_context(self, name):\n        context = Transaction().context\n        return context.get('test')\n\n\ndef register(module):\n    Pool.register(\n        Many2Many,\n        Many2ManyTarget,\n        Many2ManyRelation,\n        Many2ManyRequired,\n        Many2ManyRequiredTarget,\n        Many2ManyRequiredRelation,\n        Many2ManyReference,\n        Many2ManyReferenceTarget,\n        Many2ManyReferenceRelation,\n        Many2ManySize,\n        Many2ManySizeTarget,\n        Many2ManySizeRelation,\n        Many2ManyFilter,\n        Many2ManyFilterTarget,\n        Many2ManyFilterRelation,\n        Many2ManyFilterDomain,\n        Many2ManyFilterDomainTarget,\n        Many2ManyFilterDomainRelation,\n        Many2ManyTree,\n        Many2ManyTreeRelation,\n        Many2ManyContext,\n        Many2ManyContextTarget,\n        Many2ManyContextRelation,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_many2one.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import DeactivableMixin, ModelSQL, ModelStorage, fields\nfrom trytond.pool import Pool\nfrom trytond.transaction import Transaction\n\n\nclass Many2OneTarget(DeactivableMixin, ModelSQL):\n    \"Many2One Domain Validation Target\"\n    __name__ = 'test.many2one_target'\n    _order_name = 'value'\n\n    value = fields.Integer('Value')\n\n\nclass Many2One(ModelSQL):\n    \"Many2One\"\n    __name__ = 'test.many2one'\n    many2one = fields.Many2One('test.many2one_target', 'many2one')\n\n\nclass Many2OneDomainValidation(ModelSQL):\n    \"Many2One Domain Validation\"\n    __name__ = 'test.many2one_domainvalidation'\n    many2one = fields.Many2One('test.many2one_target',\n        'many2one',\n        domain=[\n            ('value', '>', 5),\n            ])\n    dummy = fields.Char('Dummy')\n\n\nclass Many2OneNoForeignKey(ModelSQL):\n    \"Many2One No Foreign Key\"\n    __name__ = 'test.many2one_no_foreign_key'\n    many2one = fields.Many2One('test.many2one_target_storage', 'many2one')\n\n\nclass Many2OneTargetStorage(ModelStorage):\n    \"Many2One Target Storage\"\n    __name__ = 'test.many2one_target_storage'\n\n\nclass Many2OneTree(ModelSQL):\n    'Many2One Tree'\n    __name__ = 'test.many2one_tree'\n    many2one = fields.Many2One('test.many2one_tree', 'many2one')\n\n\nclass Many2OneMPTT(ModelSQL):\n    'Many2One MPTT'\n    __name__ = 'test.many2one_mptt'\n    many2one = fields.Many2One('test.many2one_mptt', 'many2one',\n        left='left', right='right')\n    left = fields.Integer('Left', required=True)\n    right = fields.Integer('Right', required=True)\n\n    @classmethod\n    def default_left(cls):\n        return 0\n\n    @classmethod\n    def default_right(cls):\n        return 0\n\n\nclass Many2OnePath(ModelSQL):\n    \"Many2One Path\"\n    __name__ = 'test.many2one_path'\n    many2one = fields.Many2One('test.many2one_path', 'many2one', path='path')\n    path = fields.Char(\"Path\")\n\n\nclass Many2OneContext(ModelSQL):\n    \"Many2One Context\"\n    __name__ = 'test.many2one_context'\n    target = fields.Many2One(\n        'test.many2one_context.target', \"target\",\n        context={'test': 'foo'})\n\n\nclass Many2OneTargetContext(ModelSQL):\n    \"Many2One Target Context\"\n    __name__ = 'test.many2one_context.target'\n    context = fields.Function(fields.Char(\"context\"), 'get_context')\n\n    def get_context(self, name):\n        context = Transaction().context\n        return context.get('test')\n\n\ndef register(module):\n    Pool.register(\n        Many2OneTarget,\n        Many2One,\n        Many2OneDomainValidation,\n        Many2OneNoForeignKey,\n        Many2OneTargetStorage,\n        Many2OneTree,\n        Many2OneMPTT,\n        Many2OnePath,\n        Many2OneContext,\n        Many2OneTargetContext,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_multiselection.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\n\n\nclass MultiSelection(ModelSQL):\n    'MultiSelection'\n    __name__ = 'test.multi_selection'\n    selects = fields.MultiSelection([\n            ('foo', \"Foo\"),\n            ('bar', \"Bar\"),\n            ('foobar', \"FooBar\"),\n            ], \"Selections\")\n    selects_string = selects.translated('selects')\n    dyn_selects = fields.MultiSelection('get_dyn_selection',\n        \"Dynamic Selections\")\n    static_selects = fields.MultiSelection('get_static_selection',\n        \"Static Selectsions\")\n\n    @fields.depends('selects')\n    def get_dyn_selection(self):\n        if self.selects and 'foo' in self.selects:\n            return [('foo', \"Foo\"), ('foobar', \"FooBar\")]\n        else:\n            return [('bar', \"Bar\"), ('baz', \"Baz\")]\n\n    @classmethod\n    def get_static_selection(cls):\n        return cls.selects.selection\n\n\nclass MultiSelectionRequired(ModelSQL):\n    \"MultiSelection Required\"\n    __name__ = 'test.multi_selection_required'\n    selects = fields.MultiSelection(\n        [('foo', \"Foo\"), ('bar', \"Bar\")], \"Selects\", required=True)\n\n\ndef register(module):\n    Pool.register(\n        MultiSelection,\n        MultiSelectionRequired,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_numeric.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom decimal import Decimal\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval\n\n\nclass Numeric(ModelSQL):\n    'Numeric'\n    __name__ = 'test.numeric'\n    numeric = fields.Numeric(string='Numeric', help='Test numeric',\n            required=False)\n\n\nclass NumericDefault(ModelSQL):\n    'Numeric Default'\n    __name__ = 'test.numeric_default'\n    numeric = fields.Numeric(string='Numeric', help='Test numeric',\n            required=False)\n\n    @staticmethod\n    def default_numeric():\n        return Decimal('5.5')\n\n\nclass NumericRequired(ModelSQL):\n    'Numeric Required'\n    __name__ = 'test.numeric_required'\n    numeric = fields.Numeric(string='Numeric', help='Test numeric',\n            required=True)\n\n\nclass NumericDigits(ModelSQL):\n    'Numeric Digits'\n    __name__ = 'test.numeric_digits'\n    digits = fields.Integer('Digits')\n    numeric = fields.Numeric(string='Numeric', help='Test numeric',\n        required=False, digits=(16, Eval('digits', 2)),\n        depends=['digits'])\n\n\ndef register(module):\n    Pool.register(\n        Numeric,\n        NumericDefault,\n        NumericRequired,\n        NumericDigits,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_one2many.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval\nfrom trytond.transaction import Transaction\n\n\nclass One2Many(ModelSQL):\n    'One2Many Relation'\n    __name__ = 'test.one2many'\n    targets = fields.One2Many('test.one2many.target', 'origin', 'Targets')\n\n\nclass One2ManyTarget(ModelSQL):\n    'One2Many Target'\n    __name__ = 'test.one2many.target'\n    name = fields.Char('Name')\n    origin = fields.Many2One('test.one2many', 'Origin')\n\n\nclass One2ManyRequired(ModelSQL):\n    'One2Many Required'\n    __name__ = 'test.one2many_required'\n    targets = fields.One2Many('test.one2many_required.target', 'origin',\n        'Targets', required=True)\n\n\nclass One2ManyRequiredTarget(ModelSQL):\n    'One2Many Required Target'\n    __name__ = 'test.one2many_required.target'\n    name = fields.Char('Name')\n    origin = fields.Many2One('test.one2many_required', 'Origin')\n\n\nclass One2ManyReference(ModelSQL):\n    'One2Many Reference Relation'\n    __name__ = 'test.one2many_reference'\n    targets = fields.One2Many('test.one2many_reference.target', 'origin',\n        'Targets')\n\n\nclass One2ManyReferenceTarget(ModelSQL):\n    'One2Many Reference Target'\n    __name__ = 'test.one2many_reference.target'\n    name = fields.Char('Name')\n    origin = fields.Reference('Origin', [\n            (None, ''),\n            ('test.one2many_reference', 'One2Many Reference'),\n            ])\n\n\nclass One2ManySize(ModelSQL):\n    'One2Many Size Relation'\n    __name__ = 'test.one2many_size'\n    targets = fields.One2Many('test.one2many_size.target', 'origin', 'Targets',\n        size=3)\n\n\nclass One2ManySizeTarget(ModelSQL):\n    'One2Many Size Target'\n    __name__ = 'test.one2many_size.target'\n    origin = fields.Many2One('test.one2many_size', 'Origin')\n\n\nclass One2ManySizePYSON(ModelSQL):\n    'One2Many Size PYSON Relation'\n    __name__ = 'test.one2many_size_pyson'\n    limit = fields.Integer('Limit')\n    targets = fields.One2Many('test.one2many_size_pyson.target', 'origin',\n        'Targets', size=Eval('limit', 0))\n\n\nclass One2ManySizePYSONTarget(ModelSQL):\n    'One2Many Size PYSON Target'\n    __name__ = 'test.one2many_size_pyson.target'\n    origin = fields.Many2One('test.one2many_size_pyson', 'Origin')\n\n\nclass One2ManyFilter(ModelSQL):\n    'One2Many Filter Relation'\n    __name__ = 'test.one2many_filter'\n    targets = fields.One2Many('test.one2many_filter.target', 'origin',\n        'Targets')\n    filtered_targets = fields.One2Many('test.one2many_filter.target', 'origin',\n        'Filtered Targets', filter=[('value', '>', 2)])\n\n\nclass One2ManyFilterTarget(ModelSQL):\n    'One2Many Filter Target'\n    __name__ = 'test.one2many_filter.target'\n    origin = fields.Many2One('test.one2many_filter', 'Origin')\n    value = fields.Integer('Value')\n\n\nclass One2ManyFilterDomain(ModelSQL):\n    'One2Many Filter Relation'\n    __name__ = 'test.one2many_filter_domain'\n    targets = fields.One2Many('test.one2many_filter_domain.target', 'origin',\n        'Targets', domain=[('value', '<', 10)])\n    filtered_targets = fields.One2Many('test.one2many_filter_domain.target',\n        'origin', 'Filtered Targets', domain=[('value', '<', 10)],\n        filter=[('value', '>', 2)])\n\n\nclass One2ManyFilterDomainTarget(ModelSQL):\n    'One2Many Filter Domain Target'\n    __name__ = 'test.one2many_filter_domain.target'\n    origin = fields.Many2One('test.one2many_filter_domain', 'Origin')\n    value = fields.Integer('Value')\n\n\nclass One2ManyContext(ModelSQL):\n    \"One2Many Context\"\n    __name__ = 'test.one2many_context'\n    targets = fields.One2Many(\n        'test.one2many_context.target', 'origin', \"Targets\",\n        context={'test': Eval('id')})\n\n\nclass One2ManyContextTarget(ModelSQL):\n    \"One2Many Context Target\"\n    __name__ = 'test.one2many_context.target'\n    origin = fields.Many2One('test.one2many_context', \"Origin\")\n    context = fields.Function(fields.Char(\"context\"), 'get_context')\n\n    def get_context(self, name):\n        context = Transaction().context\n        return context.get('test')\n\n\ndef register(module):\n    Pool.register(\n        One2Many,\n        One2ManyTarget,\n        One2ManyRequired,\n        One2ManyRequiredTarget,\n        One2ManyReference,\n        One2ManyReferenceTarget,\n        One2ManySize,\n        One2ManySizeTarget,\n        One2ManySizePYSON,\n        One2ManySizePYSONTarget,\n        One2ManyFilter,\n        One2ManyFilterTarget,\n        One2ManyFilterDomain,\n        One2ManyFilterDomainTarget,\n        One2ManyContext,\n        One2ManyContextTarget,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_one2one.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import ModelSQL, Unique, fields\nfrom trytond.pool import Pool\n\n\nclass One2One(ModelSQL):\n    'One2One'\n    __name__ = 'test.one2one'\n    one2one = fields.One2One('test.one2one.relation', 'origin', 'target',\n            string='One2One', help='Test one2one', required=False)\n\n\nclass One2OneTarget(ModelSQL):\n    'One2One Target'\n    __name__ = 'test.one2one.target'\n    name = fields.Char('Name')\n\n\nclass One2OneRelation(ModelSQL):\n    'One2One Relation'\n    __name__ = 'test.one2one.relation'\n    origin = fields.Many2One('test.one2one', 'Origin')\n    target = fields.Many2One('test.one2one.target', 'Target')\n\n    @classmethod\n    def __setup__(cls):\n        super(One2OneRelation, cls).__setup__()\n        table = cls.__table__()\n        cls._sql_constraints += [\n            ('origin_unique', Unique(table, table.origin),\n                'Origin must be unique'),\n            ('target_unique', Unique(table, table.target),\n                'Target must be unique'),\n            ]\n\n\nclass One2OneRequired(ModelSQL):\n    'One2One'\n    __name__ = 'test.one2one_required'\n    one2one = fields.One2One('test.one2one_required.relation', 'origin',\n        'target', string='One2One', help='Test one2one', required=True)\n\n\nclass One2OneRequiredRelation(ModelSQL):\n    'One2One Relation'\n    __name__ = 'test.one2one_required.relation'\n    origin = fields.Many2One('test.one2one_required', 'Origin')\n    target = fields.Many2One('test.one2one.target', 'Target')\n\n    @classmethod\n    def __setup__(cls):\n        super(One2OneRequiredRelation, cls).__setup__()\n        table = cls.__table__()\n        cls._sql_constraints += [\n            ('origin_unique', Unique(table, table.origin),\n                'Origin must be unique'),\n            ('target_unique', Unique(table, table.target),\n                'Target must be unique'),\n            ]\n\n\nclass One2OneDomain(ModelSQL):\n    'One2One'\n    __name__ = 'test.one2one_domain'\n    one2one = fields.One2One('test.one2one_domain.relation', 'origin',\n        'target', string='One2One', help='Test one2one',\n        domain=[('name', '=', 'domain')])\n\n\nclass One2OneDomainRelation(ModelSQL):\n    'One2One Relation'\n    __name__ = 'test.one2one_domain.relation'\n    origin = fields.Many2One('test.one2one_domain', 'Origin')\n    target = fields.Many2One('test.one2one.target', 'Target')\n\n    @classmethod\n    def __setup__(cls):\n        super(One2OneDomainRelation, cls).__setup__()\n        table = cls.__table__()\n        cls._sql_constraints += [\n            ('origin_unique', Unique(table, table.origin),\n                'Origin must be unique'),\n            ('target_unique', Unique(table, table.target),\n                'Target must be unique'),\n            ]\n\n\ndef register(module):\n    Pool.register(\n        One2One,\n        One2OneTarget,\n        One2OneRelation,\n        One2OneRequired,\n        One2OneRequiredRelation,\n        One2OneDomain,\n        One2OneDomainRelation,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_reference.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval\nfrom trytond.transaction import Transaction\n\n\nclass Reference(ModelSQL):\n    'Reference'\n    __name__ = 'test.reference'\n    reference = fields.Reference('Reference', selection=[\n            (None, ''),\n            ('test.reference.target', 'Target'),\n            ])\n\n\nclass ReferenceTarget(ModelSQL):\n    'Reference Target'\n    __name__ = 'test.reference.target'\n    name = fields.Char('Name', required=True)\n\n\nclass ReferenceRequired(ModelSQL):\n    'Reference Required'\n    __name__ = 'test.reference_required'\n    reference = fields.Reference('Reference', selection=[\n            (None, ''),\n            ('test.reference.target', 'Target'),\n            ], required=True)\n\n\nclass ReferenceContext(ModelSQL):\n    \"Reference Context\"\n    __name__ = 'test.reference_context'\n    target = fields.Reference(\"Reference\", selection=[\n            (None, ''),\n            ('test.reference_context.target', \"Target\"),\n            ], context={'test': 'foo'})\n\n\nclass ReferenceContextTarget(ModelSQL):\n    \"Reference Context Target\"\n    __name__ = 'test.reference_context.target'\n    context = fields.Function(fields.Char(\"context\"), 'get_context')\n\n    def get_context(self, name):\n        context = Transaction().context\n        return context.get('test')\n\n\nclass ReferenceDomainValidation(ModelSQL):\n    \"Reference Domain Validation\"\n    __name__ = 'test.reference_domainvalidation'\n    reference = fields.Reference(\"Reference\", selection=[\n            (None, ''),\n            ('test.reference.target', \"Target\"),\n            ('test.reference_domainvalidation.target', \"Domain Target\"),\n            ],\n        domain={\n            'test.reference_domainvalidation.target': [\n                ('value', '>', 5),\n                ],\n            })\n\n\nclass ReferenceDomainValidationTarget(ModelSQL):\n    \"Reference Domain Validation Target\"\n    __name__ = 'test.reference_domainvalidation.target'\n    value = fields.Integer(\"Value\")\n\n\nclass ReferenceDomainValidationPYSON(ModelSQL):\n    \"Reference Domain Validation\"\n    __name__ = 'test.reference_domainvalidation_pyson'\n    reference = fields.Reference(\"Reference\", selection=[\n            (None, ''),\n            ('test.reference.target', \"Target\"),\n            ('test.reference_domainvalidation.target', \"Domain Target\"),\n            ],\n        domain={\n            'test.reference_domainvalidation.target': [\n                ('value', '>', Eval('value')),\n                ],\n            },\n        depends=['value'])\n    value = fields.Integer(\"Value\")\n\n\ndef register(module):\n    Pool.register(\n        Reference,\n        ReferenceTarget,\n        ReferenceRequired,\n        ReferenceContext,\n        ReferenceContextTarget,\n        ReferenceDomainValidation,\n        ReferenceDomainValidationTarget,\n        ReferenceDomainValidationPYSON,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_selection.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\n\n\nclass Selection(ModelSQL):\n    'Selection'\n    __name__ = 'test.selection'\n    select = fields.Selection([\n            ('', ''), ('arabic', 'Arabic'), ('hexa', 'Hexadecimal')],\n        'Selection')\n    select_string = select.translated('select')\n    dyn_select = fields.Selection('get_selection',\n        'Instance Dynamic Selection')\n    dyn_select_string = dyn_select.translated('dyn_select')\n    dyn_select_static = fields.Selection('static_selection',\n        'Static Selection')\n    dyn_select_static_string = dyn_select_static.translated(\n        'dyn_select_static')\n    unsorted_select = fields.Selection([\n            (None, \"\"),\n            ('first', \"First\"),\n            ('second', \"Second\"),\n            ('last', \"Last\"),\n            ], \"Unsorted Selection\", sort=False)\n\n    @fields.depends('select')\n    def get_selection(self):\n        if self.select == 'arabic':\n            return [('', '')] + [(str(i), str(i)) for i in range(1, 11)]\n        else:\n            return [('', '')] + [(hex(i), hex(i)) for i in range(1, 11)]\n\n    @staticmethod\n    def static_selection():\n        return [('', '')] + [(str(i), str(i)) for i in range(1, 11)]\n\n\nclass SelectionRequired(ModelSQL):\n    'Selection Required'\n    __name__ = 'test.selection_required'\n    select = fields.Selection([('arabic', 'Arabic'), ('latin', 'Latin')],\n        'Selection', required=True)\n\n\nclass SelectionLabel(ModelSQL):\n    \"Selection with different label\"\n    __name__ = 'test.selection_label'\n    select = fields.Selection([\n            ('a', \"Z\"),\n            ('b', \"Y\"),\n            ('c', \"X\"),\n            ], \"Selection\")\n\n\ndef register(module):\n    Pool.register(\n        Selection,\n        SelectionRequired,\n        SelectionLabel,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_text.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\n\n\nclass Text(ModelSQL):\n    'Text'\n    __name__ = 'test.text'\n    text = fields.Text(string='Text', size=None, help='Test text',\n            required=False)\n\n\nclass TextDefault(ModelSQL):\n    'Text Default'\n    __name__ = 'test.text_default'\n    text = fields.Text(string='Text', size=None, help='Test text',\n            required=False)\n\n    @staticmethod\n    def default_text():\n        return 'Test'\n\n\nclass TextRequired(ModelSQL):\n    'Text Required'\n    __name__ = 'test.text_required'\n    text = fields.Text(string='Text', size=None, help='Test text',\n            required=True)\n\n\nclass TextSize(ModelSQL):\n    'Text Size'\n    __name__ = 'test.text_size'\n    text = fields.Text(string='Text', size=5, help='Test text',\n            required=False)\n\n\nclass TextTranslate(ModelSQL):\n    'Text Translate'\n    __name__ = 'test.text_translate'\n    text = fields.Text(string='Text', size=None, help='Test text',\n            required=False, translate=True)\n\n\nclass FullText(ModelSQL):\n    \"FullText\"\n    __name__ = 'test.text_full'\n    full_text = fields.FullText(\"Full Text\")\n\n\ndef register(module):\n    Pool.register(\n        Text,\n        TextDefault,\n        TextRequired,\n        TextSize,\n        TextTranslate,\n        FullText,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_time.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport datetime\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\n\n\nclass Time(ModelSQL):\n    'Time'\n    __name__ = 'test.time'\n    time = fields.Time(string='Time', help='Test time', required=False)\n\n\nclass TimeDefault(ModelSQL):\n    'Time Default'\n    __name__ = 'test.time_default'\n    time = fields.Time(string='Time', help='Test time', required=False)\n\n    @staticmethod\n    def default_time():\n        return datetime.time(16, 30)\n\n\nclass TimeRequired(ModelSQL):\n    'Time'\n    __name__ = 'test.time_required'\n    time = fields.Time(string='Time', help='Test time', required=True)\n\n\nclass TimeFormat(ModelSQL):\n    'Time Format'\n    __name__ = 'test.time_format'\n    time = fields.Time(string='Time', format='%H:%M')\n\n\nclass TimePrecision(ModelSQL):\n    \"Time precision\"\n    __name__ = 'test.time_precision'\n    time = fields.Time(string=\"Time\", format=\"%H:%M:%S.%f\")\n\n\ndef register(module):\n    Pool.register(\n        Time,\n        TimeDefault,\n        TimeRequired,\n        TimeFormat,\n        TimePrecision,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/field_timedelta.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport datetime\n\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\n\n\nclass TimeDelta(ModelSQL):\n    'TimeDelta'\n    __name__ = 'test.timedelta'\n    timedelta = fields.TimeDelta(string='TimeDelta', help='Test timedelta',\n        required=False)\n\n\nclass TimeDeltaDefault(ModelSQL):\n    'TimeDelta Default'\n    __name__ = 'test.timedelta_default'\n    timedelta = fields.TimeDelta(string='TimeDelta', help='Test timedelta',\n        required=False)\n\n    @staticmethod\n    def default_timedelta():\n        return datetime.timedelta(seconds=3600)\n\n\nclass TimeDeltaRequired(ModelSQL):\n    'TimeDelta Required'\n    __name__ = 'test.timedelta_required'\n    timedelta = fields.TimeDelta(string='TimeDelta', help='Test timedelta',\n        required=True)\n\n\ndef register(module):\n    Pool.register(\n        TimeDelta,\n        TimeDeltaDefault,\n        TimeDeltaRequired,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/forbidden.txt",
    "content": "password\n"
  },
  {
    "path": "trytond/tests/history.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\n\n\nclass TestHistory(ModelSQL):\n    'Test History'\n    __name__ = 'test.history'\n    _history = True\n    value = fields.Integer('Value')\n    lines = fields.One2Many('test.history.line', 'history', 'Lines')\n    lines_at_stamp = fields.One2Many(\n        'test.history.line', 'history', 'Lines at Stamp',\n        datetime_field='stamp')\n    stamp = fields.Timestamp('Stamp')\n\n\nclass TestHistoryLine(ModelSQL):\n    'Test History Line'\n    __name__ = 'test.history.line'\n    _history = True\n    history = fields.Many2One('test.history', 'History')\n    name = fields.Char('Name')\n\n\ndef register(module):\n    Pool.register(\n        TestHistory,\n        TestHistoryLine,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/import_data.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\"Test for import_data\"\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\n\n\nclass ImportDataBoolean(ModelSQL):\n    \"Import Data Boolean\"\n    __name__ = 'test.import_data.boolean'\n    boolean = fields.Boolean('Boolean')\n\n\nclass ImportDataInteger(ModelSQL):\n    \"Import Data Integer\"\n    __name__ = 'test.import_data.integer'\n    integer = fields.Integer('Integer')\n\n\nclass ImportDataFloat(ModelSQL):\n    \"Import Data Float\"\n    __name__ = 'test.import_data.float'\n    float = fields.Float('Float')\n\n\nclass ImportDataNumeric(ModelSQL):\n    \"Import Data Numeric\"\n    __name__ = 'test.import_data.numeric'\n    numeric = fields.Numeric('Numeric')\n\n\nclass ImportDataChar(ModelSQL):\n    \"Import Data Char\"\n    __name__ = 'test.import_data.char'\n    char = fields.Char('Char')\n\n\nclass ImportDataText(ModelSQL):\n    \"Import Data Text\"\n    __name__ = 'test.import_data.text'\n    text = fields.Text('Text')\n\n\nclass ImportDataDate(ModelSQL):\n    \"Import Data Date\"\n    __name__ = 'test.import_data.date'\n    date = fields.Date('Date')\n\n\nclass ImportDataDateTime(ModelSQL):\n    \"Import Data DateTime\"\n    __name__ = 'test.import_data.datetime'\n    datetime = fields.DateTime('DateTime')\n\n\nclass ImportDataTimeDelta(ModelSQL):\n    \"Import Data TimeDelta\"\n    __name__ = 'test.import_data.timedelta'\n    timedelta = fields.TimeDelta('TimeDelta')\n\n\nclass ImportDataSelection(ModelSQL):\n    \"Import Data Selection\"\n    __name__ = 'test.import_data.selection'\n    selection = fields.Selection([\n            (None, ''),\n            ('select1', 'Select 1'),\n            ('select2', 'Select 2'),\n            ], 'Selection')\n\n\nclass ImportDataMany2OneTarget(ModelSQL):\n    \"Import Data Many2One Target\"\n    __name__ = 'test.import_data.many2one.target'\n    name = fields.Char('Name')\n\n\nclass ImportDataMany2One(ModelSQL):\n    \"Import Data Many2One\"\n    __name__ = 'test.import_data.many2one'\n    many2one = fields.Many2One('test.import_data.many2one.target',\n            'Many2One')\n\n\nclass ImportDataMany2ManyTarget(ModelSQL):\n    \"Import Data Many2Many Target\"\n    __name__ = 'test.import_data.many2many.target'\n    name = fields.Char('Name')\n\n\nclass ImportDataMany2Many(ModelSQL):\n    \"Import Data Many2Many\"\n    __name__ = 'test.import_data.many2many'\n    many2many = fields.Many2Many('test.import_data.many2many.relation',\n            'many2many', 'target', 'Many2Many')\n\n\nclass ImportDataMany2ManyRelation(ModelSQL):\n    \"Import Data Many2Many Relation\"\n    __name__ = 'test.import_data.many2many.relation'\n    many2many = fields.Many2One('test.import_data.many2many', 'Many2One')\n    target = fields.Many2One('test.import_data.many2many.target', 'Target')\n\n\nclass ImportDataOne2Many(ModelSQL):\n    \"Import Data One2Many\"\n    __name__ = 'test.import_data.one2many'\n    name = fields.Char('Name')\n    one2many = fields.One2Many('test.import_data.one2many.target', 'one2many',\n            'One2Many')\n\n\nclass ImportDataOne2ManyTarget(ModelSQL):\n    \"Import Data One2Many Target\"\n    __name__ = 'test.import_data.one2many.target'\n    name = fields.Char('Name')\n    one2many = fields.Many2One('test.import_data.one2many', 'One2Many')\n\n\nclass ImportDataOne2Manies(ModelSQL):\n    \"Import Data One2Manies\"\n    __name__ = 'test.import_data.one2manies'\n    name = fields.Char(\"Name\")\n    one2many1 = fields.One2Many(\n        'test.import_data.one2many1.target', 'one2many', \"One2Many 1\")\n    one2many2 = fields.One2Many(\n        'test.import_data.one2many2.target', 'one2many', \"One2Many 2\")\n\n\nclass ImportDataOne2Many1Target(ModelSQL):\n    \"Import Data One2Many 1 Target\"\n    __name__ = 'test.import_data.one2many1.target'\n    name = fields.Char(\"Name\")\n    one2many = fields.Many2One('test.import_data.one2manies', \"One2Many\")\n\n\nclass ImportDataOne2Many2Target(ModelSQL):\n    \"Import Data One2Many 2 Target\"\n    __name__ = 'test.import_data.one2many2.target'\n    name = fields.Char(\"Name\")\n    one2many = fields.Many2One('test.import_data.one2manies', \"One2Many\")\n\n\nclass ImportDataBinary(ModelSQL):\n    \"Import Data Binary\"\n    __name__ = 'test.import_data.binary'\n    data = fields.Binary(\"Data\")\n\n\nclass ImportDataReferenceSelection(ModelSQL):\n    \"Import Data Reference Selection\"\n    __name__ = 'test.import_data.reference.selection'\n    name = fields.Char('Name')\n\n\nclass ImportDataReference(ModelSQL):\n    \"Import Data Reference\"\n    __name__ = 'test.import_data.reference'\n    reference = fields.Reference('Reference', [\n            (None, ''),\n            ('test.import_data.reference.selection', 'Test'),\n            ])\n\n\nclass ImportDataUpdate(ModelSQL):\n    \"Import Data for Update\"\n    __name__ = 'test.import_data.update'\n    name = fields.Char(\"Name\")\n\n\ndef register(module):\n    Pool.register(\n        ImportDataBoolean,\n        ImportDataInteger,\n        ImportDataFloat,\n        ImportDataNumeric,\n        ImportDataChar,\n        ImportDataText,\n        ImportDataDate,\n        ImportDataDateTime,\n        ImportDataTimeDelta,\n        ImportDataSelection,\n        ImportDataMany2OneTarget,\n        ImportDataMany2One,\n        ImportDataMany2ManyTarget,\n        ImportDataMany2Many,\n        ImportDataMany2ManyRelation,\n        ImportDataOne2Many,\n        ImportDataOne2ManyTarget,\n        ImportDataOne2Manies,\n        ImportDataOne2Many1Target,\n        ImportDataOne2Many2Target,\n        ImportDataReferenceSelection,\n        ImportDataReference,\n        ImportDataBinary,\n        ImportDataUpdate,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/import_data.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n\n        <record model=\"test.import_data.many2one.target\"\n            id=\"import_data_many2one_target_test\">\n            <field name=\"name\">Test</field>\n        </record>\n\n        <record model=\"test.import_data.many2one.target\"\n            id=\"import_data_many2one_target_duplicate1\">\n            <field name=\"name\">Duplicate</field>\n        </record>\n\n        <record model=\"test.import_data.many2one.target\"\n            id=\"import_data_many2one_target_duplicate2\">\n            <field name=\"name\">Duplicate</field>\n        </record>\n\n        <record model=\"test.import_data.many2many.target\"\n            id=\"import_data_many2many_target_test1\">\n            <field name=\"name\">Test 1</field>\n        </record>\n\n        <record model=\"test.import_data.many2many.target\"\n            id=\"import_data_many2many_target_test2\">\n            <field name=\"name\">Test 2</field>\n        </record>\n\n        <record model=\"test.import_data.many2many.target\"\n            id=\"import_data_many2many_target_test_comma\">\n            <field name=\"name\">Test, comma</field>\n        </record>\n\n        <record model=\"test.import_data.many2many.target\"\n            id=\"import_data_many2many_target_duplicate1\">\n            <field name=\"name\">Duplicate</field>\n        </record>\n\n        <record model=\"test.import_data.many2many.target\"\n            id=\"import_data_many2many_target_duplicate2\">\n            <field name=\"name\">Duplicate</field>\n        </record>\n\n        <record model=\"test.import_data.reference.selection\"\n            id=\"import_data_reference_selection_test\">\n            <field name=\"name\">Test</field>\n        </record>\n\n        <record model=\"test.import_data.reference.selection\"\n            id=\"import_data_reference_selection_duplicate1\">\n            <field name=\"name\">Duplicate</field>\n        </record>\n\n        <record model=\"test.import_data.reference.selection\"\n            id=\"import_data_reference_selection_duplicate2\">\n            <field name=\"name\">Duplicate</field>\n        </record>\n\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/tests/message.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <record model=\"ir.message\" id=\"msg_test\">\n            <field name=\"text\">Message</field>\n        </record>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/tests/mixin.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.model import DeactivableMixin, ModelSQL, ModelView\nfrom trytond.pool import Pool\nfrom trytond.report import Report\n\n\nclass TestMixin:\n    __slots__ = ()\n\n\nclass TestSecondMixin:\n    __slots__ = ()\n\n\nclass NotMixin:\n    __slots__ = ()\n\n\nclass ReportMixin:\n    __slots__ = ()\n\n\nclass DeactivableModelView(DeactivableMixin, ModelView):\n    'Deactivable ModelView'\n    __name__ = 'test.deactivable.modelview'\n\n\nclass DeactivableModelSQL(DeactivableMixin, ModelSQL):\n    'Deactivable ModelView'\n    __name__ = 'test.deactivable.modelsql'\n\n\ndef register(module):\n    Pool.register(\n        DeactivableModelView,\n        DeactivableModelSQL,\n        module=module, type_='model')\n    Pool.register_mixin(TestMixin, ModelView, module=module)\n    Pool.register_mixin(TestSecondMixin, ModelView, module=module)\n    Pool.register_mixin(NotMixin, ModelView, module='__wrong__')\n    Pool.register_mixin(ReportMixin, Report, module=module)\n"
  },
  {
    "path": "trytond/tests/model.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.model import (\n    ModelSingleton, ModelSQL, UnionMixin, fields, sequence_ordered)\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval\n\n\nclass Model(ModelSQL):\n    'Model'\n    __name__ = 'test.model'\n    name = fields.Char('Name')\n\n\nclass ModelParent(Model):\n    \"Model Parent\"\n    __name__ = 'test.model_parent'\n    name = fields.Char(\"Name\")\n\n\nclass ModelChild(Model):\n    \"Model Child\"\n    __name__ = 'test.model_child'\n    name = fields.Char(\"Name\")\n    parent = fields.Many2One('test.model_parent', \"Parent\")\n\n\nclass ModelChildChild(Model):\n    \"Model Child Child\"\n    __name__ = 'test.model_child_child'\n    name = fields.Char(\"Name\")\n    parent = fields.Many2One('test.model_child', \"Parent\")\n\n\nclass ModelContext(Model):\n    \"Model with contextual field\"\n    __name__ = 'test.model_context'\n    name = fields.Char(\"Name\")\n    target = fields.Many2One(\n        'test.model', \"Target\",\n        context={\n            'name': Eval('name'),\n            })\n\n\nclass ModelContextParent(Model):\n    \"Model with contextual field from _parent\"\n    __name__ = 'test.model_context_parent'\n    parent = fields.Many2One('test.model', \"Parent\")\n    target = fields.Many2One(\n        'test.model', \"Target\",\n        context={\n            'name': Eval('_parent_parent', {}).get('name'),\n            })\n\n\nclass Singleton(ModelSingleton, ModelSQL):\n    'Singleton'\n    __name__ = 'test.singleton'\n    name = fields.Char('Name')\n\n    @staticmethod\n    def default_name():\n        return 'test'\n\n\nclass URLObject(ModelSQL):\n    'URLObject'\n    __name__ = 'test.urlobject'\n    name = fields.Char('Name')\n\n\nclass Model4Union1(ModelSQL):\n    'Model for union 1'\n    __name__ = 'test.model.union1'\n    name = fields.Char('Name')\n    optional = fields.Char('Optional')\n\n\nclass Model4Union2(ModelSQL):\n    'Model for union 2'\n    __name__ = 'test.model.union2'\n    name = fields.Char('Name')\n\n\nclass Model4Union3(ModelSQL):\n    'Model for union 3'\n    __name__ = 'test.model.union3'\n    name = fields.Char('Name')\n\n\nclass Model4Union4(ModelSQL):\n    'Model for union 4'\n    __name__ = 'test.model.union4'\n    name = fields.Char('Name')\n\n\nclass Union(UnionMixin, ModelSQL):\n    'Union'\n    __name__ = 'test.union'\n    name = fields.Char('Name')\n    optional = fields.Char('Optional')\n\n    @staticmethod\n    def union_models():\n        return ['test.model.union%s' % i for i in range(1, 4)]\n\n\nclass UnionUnion(UnionMixin, ModelSQL):\n    'Union of union'\n    __name__ = 'test.union.union'\n    name = fields.Char('Name')\n\n    @staticmethod\n    def union_models():\n        return ['test.union', 'test.model.union4']\n\n\nclass Model4UnionTree1(ModelSQL):\n    'Model for union tree 1'\n    __name__ = 'test.model.union.tree1'\n    name = fields.Char('Name')\n\n\nclass Model4UnionTree2(ModelSQL):\n    'Model for union tree 2'\n    __name__ = 'test.model.union.tree2'\n    name = fields.Char('Name')\n    parent = fields.Many2One('test.model.union.tree1', 'Parent')\n\n\nclass UnionTree(UnionMixin, ModelSQL):\n    'Union tree'\n    __name__ = 'test.union.tree'\n    name = fields.Char('Name')\n    parent = fields.Many2One('test.union.tree', 'Parent')\n    childs = fields.One2Many('test.union.tree', 'parent', 'Childs')\n\n    @staticmethod\n    def union_models():\n        return ['test.model.union.tree1', 'test.model.union.tree2']\n\n\nclass SequenceOrderedModel(sequence_ordered(), ModelSQL):\n    'Sequence Ordered Model'\n    __name__ = 'test.order.sequence'\n\n\ndef register(module):\n    Pool.register(\n        Model,\n        ModelParent,\n        ModelChild,\n        ModelChildChild,\n        ModelContext,\n        ModelContextParent,\n        Singleton,\n        URLObject,\n        Model4Union1,\n        Model4Union2,\n        Model4Union3,\n        Model4Union4,\n        Union,\n        UnionUnion,\n        Model4UnionTree1,\n        Model4UnionTree2,\n        UnionTree,\n        SequenceOrderedModel,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/modelsql.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom sql import Literal\nfrom sql.operators import Equal\n\nfrom trytond.model import (\n    Check, DeactivableMixin, Exclude, ModelSQL, Unique, fields)\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval\n\n\nclass ModelSQLRead(ModelSQL):\n    \"ModelSQL to test read\"\n    __name__ = 'test.modelsql.read'\n    name = fields.Char(\"Name\")\n    target = fields.Many2One('test.modelsql.read.target', \"Target\")\n    targets = fields.One2Many('test.modelsql.read.target', 'parent', \"Targets\")\n    reference = fields.Reference(\n        \"Reference\", [(None, \"\"), ('test.modelsql.read.target', \"Target\")])\n\n\nclass ModelSQLReadTarget(ModelSQL):\n    \"ModelSQL Target to test read\"\n    __name__ = 'test.modelsql.read.target'\n    name = fields.Char(\"Name\")\n    parent = fields.Many2One('test.modelsql.read', \"Parent\")\n    target = fields.Many2One('test.modelsql.read.target', \"Target\")\n\n\nclass ModelSQLReadContextID(ModelSQL):\n    \"ModelSQL to test read with ID in context\"\n    __name__ = 'test.modelsql.read.context_id'\n    name = fields.Char(\"Name\", context={\n            'test': Eval('id'),\n            })\n\n\nclass ModelSQLRequiredField(ModelSQL):\n    'model with a required field'\n    __name__ = 'test.modelsql'\n\n    integer = fields.Integer(string=\"integer\", required=True)\n    desc = fields.Char(string=\"desc\", required=True)\n\n\nclass ModelSQLTimestamp(ModelSQL):\n    'Model to test timestamp'\n    __name__ = 'test.modelsql.timestamp'\n\n\nclass ModelSQLFieldSet(ModelSQL):\n    'Model to test field set'\n    __name__ = 'test.modelsql.field_set'\n\n    field = fields.Function(fields.Integer('Field'),\n        'get_field', setter='set_field')\n\n    def get_field(self, name=None):\n        return\n\n    @classmethod\n    def set_field(cls, records, name, value):\n        pass\n\n\nclass ModelSQLOne2Many(ModelSQL):\n    \"ModelSQL One2Many\"\n    __name__ = 'test.modelsql.one2many'\n    targets = fields.One2Many(\n        'test.modelsql.one2many.target', 'origin', \"Targets\")\n\n\nclass ModelSQLOne2ManyTarget(ModelSQL):\n    \"ModelSQL One2Many Target\"\n    __name__ = 'test.modelsql.one2many.target'\n    name = fields.Char(\"Name\", required=True)\n    origin = fields.Many2One('test.modelsql.one2many', \"Origin\")\n\n\nclass ModelSQLSearch(ModelSQL):\n    \"ModelSQL Search\"\n    __name__ = 'test.modelsql.search'\n    name = fields.Char(\"Name\")\n\n\nclass ModelSQLSearchOR2Union(ModelSQL):\n    \"ModelSQL Search OR to UNION optimization\"\n    __name__ = 'test.modelsql.search.or2union'\n    name = fields.Char(\"Name\")\n    target = fields.Many2One('test.modelsql.search.or2union.target', \"Target\")\n    targets = fields.One2Many(\n        'test.modelsql.search.or2union.target', 'parent', \"Targets\")\n    reference = fields.Reference(\n        \"Reference\",\n        [\n            (None, \"\"),\n            ('test.modelsql.search.or2union.target', \"Target\"),\n            ])\n    integer = fields.Integer(\"Integer\")\n\n    @classmethod\n    def order_integer(cls, tables):\n        table, _ = tables[None]\n        return [table.integer + 1]\n\n\nclass ModelSQLSearchOR2UnionTarget(ModelSQL):\n    \"ModelSQL Target to test read\"\n    __name__ = 'test.modelsql.search.or2union.target'\n    name = fields.Char(\"Name\")\n    parent = fields.Many2One('test.modelsql.search.or2union', \"Parent\")\n\n\nclass ModelSQLSearchOR2UnionOrder(ModelSQL):\n    \"ModelSQL Search OR to UNION optimization with class order\"\n    __name__ = 'test.modelsql.search.or2union.class_order'\n    name = fields.Char(\"Name\")\n    reference = fields.Reference(\"Reference\", [\n            (None, ''),\n            ('test.modelsql.search.or2union.class_order.target', \"Target\"),\n            ])\n    targets = fields.One2Many(\n        'test.modelsql.search.or2union.class_order.target', 'parent',\n        \"Targets\")\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        cls._order = [('reference', 'DESC')]\n\n\nclass ModelSQLSearchOR2UnionOrderTarget(ModelSQL):\n    \"ModelSQL Target to test read\"\n    __name__ = 'test.modelsql.search.or2union.class_order.target'\n    name = fields.Char(\"Name\")\n    parent = fields.Many2One(\n        'test.modelsql.search.or2union.class_order', \"Parent\")\n\n\nclass ModelSQLForeignKey(DeactivableMixin, ModelSQL):\n    \"ModelSQL Foreign Key\"\n    __name__ = 'test.modelsql.fk'\n\n    target_cascade = fields.Many2One(\n        'test.modelsql.fk.target', \"Target\", ondelete='CASCADE')\n    target_null = fields.Many2One(\n        'test.modelsql.fk.target', \"Target\", ondelete='SET NULL')\n    target_restrict = fields.Many2One(\n        'test.modelsql.fk.target', \"Target\", ondelete='RESTRICT')\n\n\nclass ModelSQLForeignKeyTarget(ModelSQL):\n    \"ModelSQL Foreign Key Target\"\n    __name__ = 'test.modelsql.fk.target'\n\n\nclass NullOrder(ModelSQL):\n    \"Null Order\"\n    __name__ = 'test.modelsql.null_order'\n    integer = fields.Integer('Integer')\n\n\nclass ModelTranslation(ModelSQL):\n    \"ModelSQL with translated field\"\n    __name__ = 'test.modelsql.translation'\n    name = fields.Char(\"Name\", translate=True)\n\n\nclass ModelCheck(ModelSQL):\n    \"ModelSQL with check constraint\"\n    __name__ = 'test.modelsql.check'\n    value = fields.Integer(\"Value\")\n\n    @classmethod\n    def __setup__(cls):\n        super(ModelCheck, cls).__setup__()\n        t = cls.__table__()\n        cls._sql_constraints = [\n            ('check', Check(t, (t.value > 42)),\n                \"Value must be greater than 42.\"),\n            ]\n\n\nclass ModelUnique(ModelSQL):\n    \"ModelSQL with unique constraint\"\n    __name__ = 'test.modelsql.unique'\n    value = fields.Integer(\"Value\")\n\n    @classmethod\n    def __setup__(cls):\n        super(ModelUnique, cls).__setup__()\n        t = cls.__table__()\n        cls._sql_constraints = [\n            ('unique', Unique(t, t.value), \"Value must be unique.\"),\n            ]\n\n\nclass ModelExclude(ModelSQL):\n    \"ModelSQL with exclude constraint\"\n    __name__ = 'test.modelsql.exclude'\n    value = fields.Integer(\"Value\")\n    condition = fields.Boolean(\"Condition\")\n\n    @classmethod\n    def default_condition(cls):\n        return True\n\n    @classmethod\n    def __setup__(cls):\n        super(ModelExclude, cls).__setup__()\n        t = cls.__table__()\n        cls._sql_constraints = [\n            ('exclude', Exclude(t, (t.value, Equal),\n                    where=t.condition == Literal(True)),\n                \"Value must be unique.\"),\n            ]\n\n\nclass ModelLock(ModelSQL):\n    'Model to test lock'\n    __name__ = 'test.modelsql.lock'\n\n\ndef register(module):\n    Pool.register(\n        ModelSQLRead,\n        ModelSQLReadTarget,\n        ModelSQLReadContextID,\n        ModelSQLRequiredField,\n        ModelSQLTimestamp,\n        ModelSQLFieldSet,\n        ModelSQLOne2Many,\n        ModelSQLOne2ManyTarget,\n        ModelSQLSearch,\n        ModelSQLSearchOR2Union,\n        ModelSQLSearchOR2UnionTarget,\n        ModelSQLSearchOR2UnionOrder,\n        ModelSQLSearchOR2UnionOrderTarget,\n        ModelSQLForeignKey,\n        ModelSQLForeignKeyTarget,\n        NullOrder,\n        ModelTranslation,\n        ModelCheck,\n        ModelUnique,\n        ModelExclude,\n        ModelLock,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/modelstorage.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.model import ModelSQL\nfrom trytond.model import ModelStorage as ModelStorage_\nfrom trytond.model import fields\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval, If\nfrom trytond.transaction import Transaction\n\n\nclass ModelStorage(ModelSQL):\n    'Model stored'\n    __name__ = 'test.modelstorage'\n    name = fields.Char('Name')\n\n\nclass ModelStorageRequired(ModelSQL):\n    'Model stored'\n    __name__ = 'test.modelstorage.required'\n    name = fields.Char('Name', required=True)\n\n\nclass ModelStorageSave2Many(ModelSQL):\n    \"Model Storage to test save with xxx2many\"\n    __name__ = 'test.modelstorage.save2many'\n    targets = fields.One2Many(\n        'test.modelstorage.save2many.target', 'parent', \"Targets\")\n    m2m_targets = fields.Many2Many(\n        'test.modelstorage.save2many.relation', 'parent', 'target', \"Targets\")\n\n\nclass ModelStorageSave2ManyTarget(ModelSQL):\n    \"Model Storage to test save with xxx2many\"\n    __name__ = 'test.modelstorage.save2many.target'\n    parent = fields.Many2One('test.modelstorage.save2many', \"Parent\")\n\n\nclass ModelStorageSave2ManyRelation(ModelSQL):\n    \"Model Storage to test save with xxx2many\"\n    __name__ = 'test.modelstorage.save2many.relation'\n    parent = fields.Many2One('test.modelstorage.save2many', \"Parent\")\n    target = fields.Many2One('test.modelstorage.save2many.target', \"Target\")\n\n\nclass ModelStorageContext(ModelSQL):\n    'Model Storage to test Context'\n    __name__ = 'test.modelstorage.context'\n    context = fields.Function(fields.Binary('Context'), 'get_context')\n\n    def get_context(self, name):\n        return Transaction().context\n\n\nclass ModelStoragePYSONDomain(ModelSQL):\n    \"Model stored with PYSON domain\"\n    __name__ = 'test.modelstorage.pyson_domain'\n    constraint = fields.Char(\"Constraint\")\n    value = fields.Char(\n        \"Value\",\n        domain=[\n            ('value', '=', Eval('constraint')),\n            ],\n        depends=['constraint'])\n\n\nclass ModelStorageRelationDomain(ModelSQL):\n    \"Model stored containing a relation field with a domain\"\n    __name__ = 'test.modelstorage.relation_domain'\n    relation = fields.Many2One(\n        'test.modelstorage.relation_domain.target', \"Value\",\n        domain=[\n            ('value', '=', 'valid'),\n            ])\n    relation_valid = fields.Boolean(\"Relation Valid\")\n    relation_pyson = fields.Many2One(\n        'test.modelstorage.relation_domain.target', \"Value\",\n        domain=[\n            If(Eval('relation_valid', True),\n                ('value', '=', 'valid'),\n                ('value', '!=', 'valid')),\n            ],\n        depends=['relation_valid'])\n    relation_context = fields.Many2One(\n        'test.modelstorage.relation_domain.target', \"Value\",\n        domain=[\n            ('valid', '=', True),\n            ],\n        context={\n            'valid': Eval('relation_valid', True),\n            })\n    relation_pyson_context = fields.Many2One(\n        'test.modelstorage.relation_domain.target', \"Value\",\n        domain=[\n            If(Eval('relation_valid', True),\n                ('valid', '=', True),\n                ('valid', '=', None)),\n            ],\n        context={\n            'valid': Eval('relation_valid', True),\n            },\n        depends=['relation_valid'])\n\n\nclass ModelStorageRelationDomainTarget(ModelSQL):\n    \"Target of Model stored containing a relation field with a domain\"\n    __name__ = 'test.modelstorage.relation_domain.target'\n    value = fields.Char(\"Value\")\n    valid = fields.Function(\n        fields.Boolean(\"Valid\"), 'get_valid', searcher='search_valid')\n\n    def get_valid(self, name):\n        return Transaction().context.get('valid')\n\n    @classmethod\n    def search_valid(cls, name, domain):\n        if Transaction().context.get('valid') == domain[2]:\n            return []\n        else:\n            return [('id', '=', -1)]\n\n\nclass ModelStorageRelationMultiDomain(ModelSQL):\n    \"Model stored containing a relation fields with multi domain\"\n    __name__ = 'test.modelstorage.relation_multi_domain'\n    relation = fields.Many2One(\n        'test.modelstorage.relation_multi_domain.target', \"Value\",\n        domain=[\n            ('test1', '=', True),\n            ('test2', '=', True),\n            ])\n\n\nclass ModelStorageRelationMultiDomainTarget(ModelSQL):\n    \"Target of Model stored containing a relation field with multi domain\"\n    __name__ = 'test.modelstorage.relation_multi_domain.target'\n    test1 = fields.Boolean(\"Test 1\")\n    test2 = fields.Boolean(\"Test 2\")\n\n\nclass ModelStorageRelationDomain2(ModelSQL):\n    \"Model stored containing a relation field with a domain with 2 level\"\n    __name__ = 'test.modelstorage.relation_domain2'\n    relation = fields.Many2One(\n        'test.modelstorage.relation_domain2.target', \"Relation\",\n        domain=[\n            ('relation2.value', '=', 'valid'),\n            ])\n\n\nclass ModelStorageRelationDomain2Target(ModelSQL):\n    \"First Target of Model stored containing a relation field with a domain\"\n    __name__ = 'test.modelstorage.relation_domain2.target'\n    relation2 = fields.Many2One(\n        'test.modelstorage.relation_domain.target', \"Relation 2\")\n\n\nclass ModelStorageEvalEnvironment(ModelStorage_):\n    \"Model for EvalEnvironment\"\n    __name__ = 'test.modelstorage.eval_environment'\n    char = fields.Char(\"Name\")\n    reference = fields.Reference(\n        \"Reference\", [\n            ('test.modelstorage.eval_environment', \"Reference\"),\n            ])\n    multiselection = fields.MultiSelection([\n            ('value1', \"Value1\"),\n            ('value2', \"Value2\"),\n            ], \"MultiSelection\")\n    many2one = fields.Many2One(\n        'test.modelstorage.eval_environment', \"Many2One\")\n    one2many = fields.One2Many(\n        'test.modelstorage.eval_environment', 'many2one', \"One2Many\")\n\n\ndef register(module):\n    Pool.register(\n        ModelStorage,\n        ModelStorageRequired,\n        ModelStorageSave2Many,\n        ModelStorageSave2ManyTarget,\n        ModelStorageSave2ManyRelation,\n        ModelStorageContext,\n        ModelStoragePYSONDomain,\n        ModelStorageRelationDomain,\n        ModelStorageRelationDomainTarget,\n        ModelStorageRelationMultiDomain,\n        ModelStorageRelationMultiDomainTarget,\n        ModelStorageRelationDomain2,\n        ModelStorageRelationDomain2Target,\n        ModelStorageEvalEnvironment,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/modelview.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import DictSchemaMixin, ModelSQL, ModelView, fields\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval, If\n\n\nclass ModelViewChangedValues(ModelView):\n    'ModelView Changed Values'\n    __name__ = 'test.modelview.changed_values'\n    name = fields.Char('Name')\n    target = fields.Many2One('test.modelview.changed_values.target', 'Target')\n    stored_target = fields.Many2One(\n        'test.modelview.changed_values.stored_target', \"Stored Target\")\n    ref_target = fields.Reference('Target Reference', [\n            ('test.modelview.changed_values.target', 'Target'),\n            ])\n    targets = fields.One2Many('test.modelview.changed_values.target', 'parent',\n        'Targets')\n    m2m_targets = fields.Many2Many('test.modelview.changed_values.target',\n        None, None, 'Targets')\n    multiselection = fields.MultiSelection([\n            ('a', 'A'), ('b', 'B'),\n            ], \"MultiSelection\")\n    dictionary = fields.Dict(\n        'test.modelview.changed_values.dictionary', \"Dictionary\")\n\n\nclass ModelViewChangedValuesDictSchema(DictSchemaMixin, ModelSQL):\n    'ModelView Changed Values Dict Schema'\n    __name__ = 'test.modelview.changed_values.dictionary'\n\n\nclass ModelViewChangedValuesTarget(ModelView):\n    'ModelView Changed Values Target'\n    __name__ = 'test.modelview.changed_values.target'\n    name = fields.Char('Name')\n    parent = fields.Many2One('test.modelview.changed_values', 'Parent')\n\n\nclass ModelViewChangedValuesStoredTarget(ModelSQL):\n    \"ModelSQL Changed Values Target\"\n    __name__ = 'test.modelview.changed_values.stored_target'\n    name = fields.Char(\"Name\")\n\n\nclass ModelViewStoredChangedValues(ModelSQL, ModelView):\n    \"ModelView Stored Changed Values Stored\"\n    __name__ = 'test.modelview.stored.changed_values'\n    targets = fields.One2Many(\n        'test.modelview.stored.changed_values.target', 'parent', \"Targets\")\n\n\nclass ModelViewStoredChangedValuesTarget(ModelSQL, ModelView):\n    \"ModelSQL Stored Changed Values Target\"\n    __name__ = 'test.modelview.stored.changed_values.target'\n    name = fields.Char(\"Name\")\n    parent = fields.Many2One('test.modelview.stored.changed_values', \"Parent\")\n\n\nclass ModelViewButton(ModelView):\n    'ModelView Button'\n    __name__ = 'test.modelview.button'\n    value = fields.Integer(\"Value\")\n\n    @classmethod\n    def __setup__(cls):\n        super(ModelViewButton, cls).__setup__()\n        cls._buttons = {\n            'test': {},\n            }\n\n    @classmethod\n    @ModelView.button\n    def test(cls, records):\n        cls.test_non_decorated(records)\n\n    @classmethod\n    def test_non_decorated(cls, records):\n        pass\n\n\nclass ModelViewButtonDepends(ModelView):\n    'ModelView Button Depends'\n    __name__ = 'test.modelview.button_depends'\n    value = fields.Integer(\"Value\")\n\n    @classmethod\n    def __setup__(cls):\n        super(ModelViewButtonDepends, cls).__setup__()\n        cls._buttons = {\n            'test': {\n                'depends': ['value'],\n                },\n            }\n\n    @classmethod\n    @ModelView.button\n    def test(cls, records):\n        pass\n\n\nclass ModelViewButtonAction(ModelView):\n    'ModelView Button Action'\n    __name__ = 'test.modelview.button_action'\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        cls._buttons = {\n            'test': {},\n            }\n\n    @classmethod\n    @ModelView.button_action('tests.test_modelview_button_action')\n    def test(cls, records):\n        pass\n\n    @classmethod\n    @ModelView.button_action('tests.test_modelview_button_action')\n    def test_update(cls, records):\n        return {'url': 'http://www.tryton.org/'}\n\n\nclass ModelViewButtonChange(ModelView):\n    \"ModelView Button Change\"\n    __name__ = 'test.modelview.button_change'\n\n    name = fields.Char(\"Name\")\n    extra = fields.Char(\"Extra\")\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        cls._buttons = {\n            'test': {}\n            }\n\n    @ModelView.button_change('name', methods=['extra_method'])\n    def test(self):\n        self.extra_method()\n\n    @fields.depends('extra')\n    def extra_method(self):\n        pass\n\n\nclass ModelViewLink(ModelView):\n    \"ModelView Link\"\n    __name__ = 'test.modelview.link'\n\n\nclass ModelViewLinkTarget(ModelSQL):\n    \"ModelView Link Target\"\n    __name__ = 'test.modelview.link.target'\n\n\nclass ModelViewRPC(ModelView):\n    'ModelView RPC'\n    __name__ = 'test.modelview.rpc'\n\n    selection = fields.Selection([('a', 'A')], 'Selection')\n    computed_selection = fields.Selection(\n        'get_selection', 'Computed Selection')\n    function_selection = fields.Function(\n        fields.Selection('get_function_selection', 'Function Selection'),\n        'function_selection_getter')\n\n    reference = fields.Reference('Reference', selection=[('a', 'A')])\n    computed_reference = fields.Reference(\n        'Computed reference', selection='get_reference')\n    function_reference = fields.Function(\n        fields.Reference('Function Reference',\n            selection='get_function_reference'),\n        'function_reference_getter')\n\n    integer = fields.Integer('Integer')\n    float = fields.Float('Float')\n    char = fields.Char('Char')\n\n    @fields.depends('selection')\n    def on_change_with_integer(self):\n        pass\n\n    @fields.depends('reference')\n    def on_change_float(self):\n        pass\n\n    @fields.depends('integer')\n    def autocomplete_char(self):\n        pass\n\n    @classmethod\n    def get_selection(cls):\n        pass\n\n    @classmethod\n    def get_function_selection(cls):\n        pass\n\n    @classmethod\n    def get_reference(cls):\n        pass\n\n    @classmethod\n    def get_function_reference(cls):\n        pass\n\n\nclass ModelViewEmptyPage(ModelView):\n    'ModelView Empty Page'\n    __name__ = 'test.modelview.empty_page'\n\n\nclass ModelViewCircularDepends(ModelView):\n    'ModelView Circular Depends'\n    __name__ = 'test.modelview.circular_depends'\n\n    foo = fields.Char(\"Char\", depends=['bar'])\n    bar = fields.Char(\"Char\", depends=['foobar'])\n    foobar = fields.Char(\"Char\", depends=['foo'])\n\n\nclass ModeViewDependsDepends(ModelView):\n    \"ModelView depends of depends\"\n    __name__ = 'test.modelview.depends_depends'\n\n    foo = fields.Char(\"Foo\", depends=['bar'])\n    bar = fields.Char(\"Bar\", depends=['baz'])\n    baz = fields.Char(\"Baz\")\n\n\nclass ModelViewViewAttributes(ModelView):\n    'ModelView View Attributes'\n    __name__ = 'test.modelview.view_attributes'\n\n    foo = fields.Char(\"Char\")\n\n    @classmethod\n    def view_attributes(cls):\n        return super().view_attributes() + [\n            ('//field[@name=\"foo\"]',\n                'visual', If(Eval('foo') == 'foo', 'danger', '')),\n            ]\n\n\nclass ModelViewViewAttributesDepends(ModelView):\n    'ModelView View Attributes Depends'\n    __name__ = 'test.modelview.view_attributes_depends'\n\n    foo = fields.Char(\"Char\")\n    bar = fields.Char(\"Char\")\n\n    @classmethod\n    def view_attributes(cls):\n        return super().view_attributes() + [\n            ('//field[@name=\"foo\"]',\n                'visual', If(Eval('bar') == 'foo', 'danger', ''), ['bar']),\n            ]\n\n\nclass ModelViewStatesDepends(ModelView):\n    \"ModelView States Depends\"\n    __name__ = 'test.modelview.states_depends'\n\n    foo = fields.Char(\"Foo\",\n        states={\n            'invisible': Eval('bar', True),\n            'readonly': Eval('baz', True),\n            },\n        depends=['quux'])\n    bar = fields.Boolean(\"Bar\")\n    baz = fields.Boolean(\"Baz\")\n    quux = fields.Char(\"Quux\")\n\n\ndef register(module):\n    Pool.register(\n        ModelViewChangedValues,\n        ModelViewChangedValuesDictSchema,\n        ModelViewChangedValuesTarget,\n        ModelViewChangedValuesStoredTarget,\n        ModelViewStoredChangedValues,\n        ModelViewStoredChangedValuesTarget,\n        ModelViewButton,\n        ModelViewButtonDepends,\n        ModelViewButtonAction,\n        ModelViewButtonChange,\n        ModelViewLink,\n        ModelViewLinkTarget,\n        ModelViewRPC,\n        ModelViewEmptyPage,\n        ModelViewCircularDepends,\n        ModeViewDependsDepends,\n        ModelViewViewAttributes,\n        ModelViewViewAttributesDepends,\n        ModelViewStatesDepends,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/modelview.xml",
    "content": "<?xml version=\"1.0\"?>\n<tryton>\n    <record model=\"ir.ui.view\" id=\"test_modelview_empty_page_view_form\">\n        <field name=\"model\">test.modelview.empty_page</field>\n        <field name=\"type\">form</field>\n        <field name=\"arch\" type=\"xml\">\n            <![CDATA[\n            <form>\n                <notebook>\n                    <page id=\"empty\"></page>\n                    <page id=\"non-empty\">\n                        <label id=\"foo\"/>\n                    </page>\n                </notebook>\n            </form>\n            ]]>\n        </field>\n    </record>\n    <record model=\"ir.ui.view\" id=\"test_modelview_depends_depends_form\">\n        <field name=\"model\">test.modelview.depends_depends</field>\n        <field name=\"type\">form</field>\n        <field name=\"arch\" type=\"xml\">\n            <![CDATA[\n            <form>\n                <field name=\"foo\"/>\n            </form>\n            ]]>\n        </field>\n    </record>\n    <record model=\"ir.ui.view\" id=\"test_modelview_button_view_form\">\n        <field name=\"model\">test.modelview.button_depends</field>\n        <field name=\"type\">form</field>\n        <field name=\"arch\" type=\"xml\">\n            <![CDATA[\n            <form>\n                <label name=\"value\"/>\n                <field name=\"value\"/>\n                <button name=\"test\"/>\n            </form>\n            ]]>\n        </field>\n    </record>\n\n    <record model=\"ir.action.url\" id=\"test_modelview_button_action\">\n        <field name=\"name\">Test Button Action</field>\n        <field name=\"url\">http://www.example.com/</field>\n    </record>\n\n    <record model=\"ir.ui.view\" id=\"test_modelview_link\">\n        <field name=\"model\">test.modelview.link</field>\n        <field name=\"type\">form</field>\n        <field name=\"arch\" type=\"xml\">\n            <![CDATA[\n            <form>\n                <link name=\"tests.test_modelview_link_action\"/>\n            </form>\n            ]]>\n        </field>\n    </record>\n\n    <record model=\"ir.action.act_window\" id=\"test_modelview_link_action\">\n        <field name=\"name\">Link</field>\n        <field name=\"res_model\">test.modelview.link.target</field>\n    </record>\n\n    <record model=\"ir.ui.view\" id=\"test_modelview_view_attributes\">\n        <field name=\"model\">test.modelview.view_attributes</field>\n        <field name=\"type\">form</field>\n        <field name=\"arch\" type=\"xml\">\n            <![CDATA[\n            <form>\n                <label name=\"foo\"/>\n                <field name=\"foo\"/>\n            </form>\n            ]]>\n        </field>\n    </record>\n    <record model=\"ir.ui.view\" id=\"test_modelview_view_attributes_depends\">\n        <field name=\"model\">test.modelview.view_attributes_depends</field>\n        <field name=\"type\">form</field>\n        <field name=\"arch\" type=\"xml\">\n            <![CDATA[\n            <form>\n                <label name=\"foo\"/>\n                <field name=\"foo\"/>\n            </form>\n            ]]>\n        </field>\n    </record>\n\n    <record model=\"ir.ui.view\" id=\"test_modelview_states_depends_tree\">\n        <field name=\"model\">test.modelview.states_depends</field>\n        <field name=\"type\">tree</field>\n        <field name=\"arch\" type=\"xml\">\n            <![CDATA[\n            <tree>\n                <field name=\"foo\"/>\n            </tree>\n            ]]>\n        </field>\n    </record>\n    <record model=\"ir.ui.view\" id=\"test_modelview_states_depends_form\">\n        <field name=\"model\">test.modelview.states_depends</field>\n        <field name=\"type\">form</field>\n        <field name=\"arch\" type=\"xml\">\n            <![CDATA[\n            <form>\n                <label name=\"foo\"/>\n                <field name=\"foo\"/>\n            </form>\n            ]]>\n        </field>\n    </record>\n</tryton>\n"
  },
  {
    "path": "trytond/tests/mptt.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\"Test for Tree\"\nfrom sql import Null\nfrom sql.conditionals import Case\n\nfrom trytond.model import DeactivableMixin, ModelSQL, ModelView, fields, tree\nfrom trytond.pool import Pool\n\n\nclass MPTT(DeactivableMixin, tree(), ModelSQL, ModelView):\n    'Modified Preorder Tree Traversal'\n    __name__ = 'test.mptt'\n    name = fields.Char('Name', required=True)\n    parent = fields.Many2One('test.mptt', \"Parent\", left=\"left\", right=\"right\")\n    left = fields.Integer('Left', required=True)\n    right = fields.Integer('Right', required=True)\n    childs = fields.One2Many('test.mptt', 'parent', 'Children')\n\n    @staticmethod\n    def order_sequence(tables):\n        table, _ = tables[None]\n        return [Case((table.sequence == Null, 0), else_=1), table.sequence]\n\n    @staticmethod\n    def default_left():\n        return 0\n\n    @staticmethod\n    def default_right():\n        return 0\n\n\ndef register(module):\n    Pool.register(\n        MPTT,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/multivalue.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.model import ModelSQL, MultiValueMixin, ValueMixin, fields\nfrom trytond.pool import Pool\n\n\nclass ModelMultiValue(ModelSQL, MultiValueMixin):\n    \"Model MultiValue\"\n    __name__ = 'test.model_multivalue'\n    value = fields.MultiValue(fields.Char(\"Value\"))\n    value_default = fields.MultiValue(fields.Char(\"Value Default\"))\n    value_many2one = fields.MultiValue(\n        fields.Many2One('test.model_multivalue.target', \"Value Many2One\"))\n    value_multiselection = fields.MultiValue(\n        fields.MultiSelection([\n                ('foo', \"Foo\"),\n                ('bar', \"Bar\"),\n                ], \"Value Multi Selection\"))\n    value_reference = fields.MultiValue(\n        fields.Reference(\n            \"Value Reference\",\n            selection=[\n                (None, \"\"),\n                ('test.model_multivalue.target', \"Target\"),\n                ]))\n    values = fields.One2Many(\n        'test.model_multivalue.value', 'record', \"Values\")\n\n    @classmethod\n    def multivalue_model(cls, field):\n        pool = Pool()\n        multivalue_fields = {\n            'value',\n            'value_default',\n            'value_many2one',\n            'value_multiselection',\n            'value_reference'\n            }\n        if field in multivalue_fields:\n            return pool.get('test.model_multivalue.value')\n        return super().multivalue_model(field)\n\n    @classmethod\n    def default_value(cls, **pattern):\n        return \"default\"\n\n    @classmethod\n    def default_value_default(cls, **pattern):\n        return \"other default\"\n\n    @classmethod\n    def default_value_multiselection(cls, **pattern):\n        return ('foo',)\n\n\nclass ModelValue(ModelSQL, ValueMixin):\n    \"Model Value\"\n    __name__ = 'test.model_multivalue.value'\n    record = fields.Many2One(\n        'test.model_multivalue', \"Record\")\n    condition = fields.Char(\"Condition\")\n    value = fields.Char(\"Value\")\n    value_default = fields.Char(\"Value Default\")\n    value_many2one = fields.Many2One(\n        'test.model_multivalue.target', \"Value Many2One\")\n    value_multiselection = fields.MultiSelection([\n            ('foo', \"Foo\"),\n            ('bar', \"Bar\"),\n            ], \"Value Multi Selection\")\n    value_reference = fields.Reference(\n        \"Value Reference\",\n        selection=[\n            (None, \"\"),\n            ('test.model_multivalue.target', \"Target\"),\n            ])\n\n\nclass ModelMultiValueTarget(ModelSQL):\n    \"Model MultiValue Target\"\n    __name__ = 'test.model_multivalue.target'\n    name = fields.Char(\"Name\")\n\n\ndef register(module):\n    Pool.register(\n        ModelMultiValue,\n        ModelValue,\n        ModelMultiValueTarget,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/path.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.model import DeactivableMixin, ModelSQL, fields, tree\nfrom trytond.pool import Pool\n\n\nclass Path(DeactivableMixin, tree(), ModelSQL):\n    \"Path\"\n    __name__ = 'test.path'\n    name = fields.Char(\"Name\", required=True)\n    parent = fields.Many2One('test.path', \"Parent\", path='path')\n    path = fields.Char(\"Path\")\n    children = fields.One2Many('test.path', 'parent', \"Children\")\n\n\ndef register(module):\n    Pool.register(\n        Path,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/resource.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.ir.note import NoteCopyMixin\nfrom trytond.model import ModelSQL\nfrom trytond.pool import Pool\n\n\nclass TestResource(ModelSQL, NoteCopyMixin):\n    \"Test Resource\"\n    __name__ = 'test.resource'\n\n    @classmethod\n    def get_resources_to_copy(cls, name):\n        return {'test.resource.other'}\n\n\nclass TestResourceOther(ModelSQL):\n    \"Test Resource Other\"\n    __name__ = 'test.resource.other'\n\n\ndef register(module):\n    Pool.register(\n        TestResource,\n        TestResourceOther,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/rule.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool\n\n\nclass TestRule(ModelSQL):\n    \"Test Rule\"\n    __name__ = 'test.rule'\n    field = fields.Char(\"Field\")\n    relation = fields.Many2One('test.rule.relation', \"Relation\")\n\n\nclass TestRuleRelation(ModelSQL):\n    \"Test Rule Relation\"\n    __name__ = 'test.rule.relation'\n    field = fields.Char(\"Field\")\n\n\nclass TestRuleModel(ModelSQL):\n    \"Test Rule from Model\"\n    __name__ = 'test.rule.model'\n    __access__ = 'test.rule'\n\n    name = fields.Char(\"Name\")\n    rule = fields.Many2One('test.rule', \"Rule\")\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        cls.__access__.add('rule')\n\n\ndef register(module):\n    Pool.register(\n        TestRule,\n        TestRuleRelation,\n        TestRuleModel,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/sequence.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n\n        <record model=\"ir.sequence.type\" id=\"sequence_type_test\">\n            <field name=\"name\">Test</field>\n        </record>\n        <record model=\"ir.sequence.type-res.group\"\n            id=\"sequence_type_test_group_admin\">\n            <field name=\"sequence_type\" ref=\"sequence_type_test\"/>\n            <field name=\"group\" ref=\"res.group_admin\"/>\n        </record>\n\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/tests/test_access.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond.model.exceptions import AccessError\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\n_context = {'_check_access': True}\n\n\nclass _ModelAccessTestCase(unittest.TestCase):\n    _perm = None\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    model_name = model_access_name = 'test.access'\n\n    @property\n    def model(self):\n        pool = Pool()\n        Model = pool.get('ir.model')\n        model, = Model.search([('model', '=', self.model_access_name)])\n        return model\n\n    @property\n    def group(self):\n        pool = Pool()\n        Group = pool.get('res.group')\n        group, = Group.search([('users', '=', Transaction().user)])\n        return group\n\n    def _assert(self, record):\n        raise NotImplementedError\n\n    def _assert_raises(self, record):\n        raise NotImplementedError\n\n    @with_transaction(context=_context)\n    def test_access_empty(self):\n        \"Test access without model access\"\n        pool = Pool()\n        TestAccess = pool.get(self.model_name)\n        record, = TestAccess.create([{}])\n\n        self._assert(record)\n\n    @with_transaction(context=_context)\n    def test_access_without_group(self):\n        \"Test access without group\"\n        pool = Pool()\n        ModelAccess = pool.get('ir.model.access')\n        TestAccess = pool.get(self.model_name)\n        record, = TestAccess.create([{}])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': None,\n                    self._perm: True,\n                    }])\n\n        self._assert(record)\n\n    @with_transaction(context=_context)\n    def test_no_access_without_group(self):\n        \"Test no access without group\"\n        pool = Pool()\n        ModelAccess = pool.get('ir.model.access')\n        TestAccess = pool.get(self.model_name)\n        record, = TestAccess.create([{}])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': None,\n                    self._perm: False,\n                    }])\n\n        self._assert_raises(record)\n\n    @with_transaction(context=_context)\n    def test_one_access_with_groups(self):\n        \"Test one access with groups\"\n        pool = Pool()\n        ModelAccess = pool.get('ir.model.access')\n        TestAccess = pool.get(self.model_name)\n        record, = TestAccess.create([{}])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': None,\n                    self._perm: False,\n                    }])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': self.group.id,\n                    self._perm: True,\n                    }])\n\n        self._assert(record)\n\n    @with_transaction(context=_context)\n    def test_one_access_without_group(self):\n        \"Test one access without group\"\n        pool = Pool()\n        ModelAccess = pool.get('ir.model.access')\n        TestAccess = pool.get(self.model_name)\n        record, = TestAccess.create([{}])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': None,\n                    self._perm: True,\n                    }])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': self.group.id,\n                    self._perm: False,\n                    }])\n\n        self._assert(record)\n\n    @with_transaction(context=_context)\n    def test_all_access_with_groups(self):\n        \"Test all access with groups\"\n        pool = Pool()\n        ModelAccess = pool.get('ir.model.access')\n        TestAccess = pool.get(self.model_name)\n        record, = TestAccess.create([{}])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': None,\n                    self._perm: True,\n                    }])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': self.group.id,\n                    self._perm: True,\n                    }])\n\n        self._assert(record)\n\n    @with_transaction(context=_context)\n    def test_no_access_with_groups(self):\n        \"Test no access with groups\"\n        pool = Pool()\n        ModelAccess = pool.get('ir.model.access')\n        TestAccess = pool.get(self.model_name)\n        record, = TestAccess.create([{}])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': None,\n                    self._perm: False,\n                    }])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': self.group.id,\n                    self._perm: False,\n                    }])\n\n        self._assert_raises(record)\n\n    @with_transaction(context=_context)\n    def test_one_access_with_group(self):\n        \"Test one access with group\"\n        pool = Pool()\n        ModelAccess = pool.get('ir.model.access')\n        TestAccess = pool.get(self.model_name)\n        record, = TestAccess.create([{}])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': self.group.id,\n                    self._perm: True,\n                    }])\n\n        self._assert(record)\n\n    @with_transaction(context=_context)\n    def test_no_access_with_group(self):\n        \"Test no access with group\"\n        pool = Pool()\n        ModelAccess = pool.get('ir.model.access')\n        TestAccess = pool.get(self.model_name)\n        record, = TestAccess.create([{}])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': self.group.id,\n                    self._perm: False,\n                    }])\n\n        self._assert_raises(record)\n\n    @with_transaction(context=_context)\n    def test_one_access_with_other_group(self):\n        \"Test one access with other group\"\n        pool = Pool()\n        Group = pool.get('res.group')\n        ModelAccess = pool.get('ir.model.access')\n        TestAccess = pool.get(self.model_name)\n        record, = TestAccess.create([{}])\n        group, = Group.create([{'name': 'Test'}])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': self.group.id,\n                    self._perm: True,\n                    }])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': group.id,\n                    self._perm: True,\n                    }])\n\n        self._assert(record)\n\n    @with_transaction(context=_context)\n    def test_no_access_with_other_group(self):\n        \"Test no access with other group\"\n        pool = Pool()\n        Group = pool.get('res.group')\n        ModelAccess = pool.get('ir.model.access')\n        TestAccess = pool.get(self.model_name)\n        record, = TestAccess.create([{}])\n        group, = Group.create([{'name': 'Test'}])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': self.group.id,\n                    self._perm: False,\n                    }])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': group.id,\n                    self._perm: True,\n                    }])\n\n        self._assert_raises(record)\n\n    @with_transaction(context=_context)\n    def test_one_access_with_other_group_no_perm(self):\n        \"Test one access with other group no perm\"\n        pool = Pool()\n        Group = pool.get('res.group')\n        ModelAccess = pool.get('ir.model.access')\n        TestAccess = pool.get(self.model_name)\n        record, = TestAccess.create([{}])\n        group, = Group.create([{'name': 'Test'}])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': self.group.id,\n                    self._perm: True,\n                    }])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': group.id,\n                    self._perm: False,\n                    }])\n\n        self._assert(record)\n\n    @with_transaction(context=_context)\n    def test_access_inherited_from_parent(self):\n        \"Test access inherited from parent\"\n        pool = Pool()\n        Group = pool.get('res.group')\n        ModelAccess = pool.get('ir.model.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        group, = Group.create([{'name': 'Test'}])\n        Group.write([self.group], {\n                'parent': group.id,\n                })\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': self.group.id,\n                    self._perm: False,\n                    }])\n        ModelAccess.create([{\n                    'model': self.model.id,\n                    'group': group.id,\n                    self._perm: True,\n                    }])\n\n        self._assert(record)\n\n\nclass ModelAccessReadTestCase(_ModelAccessTestCase):\n    _perm = 'perm_read'\n\n    def _assert(self, record):\n        pool = Pool()\n        TestAccess = pool.get(self.model_name)\n        TestAccess.read([record.id], ['field1'])\n        TestAccess.search([])\n\n    def _assert_raises(self, record):\n        pool = Pool()\n        TestAccess = pool.get(self.model_name)\n        with self.assertRaises(AccessError):\n            TestAccess.read([record.id], ['field1'])\n        with self.assertRaises(AccessError):\n            TestAccess.search([])\n\n    @with_transaction(context=_context)\n    def test_access_relate_empty(self):\n        \"Test access on search relate without model access\"\n        pool = Pool()\n        TestAccess = pool.get(self.model_name)\n        record, = TestAccess.create([{}])\n\n        TestAccess.read([record.id], ['relate.value'])\n        TestAccess.search([('relate.value', '=', 42)])\n        TestAccess.search([('reference.value', '=', 42, 'test.access.relate')])\n\n    @with_transaction(context=_context)\n    def test_access_relate(self):\n        \"Test access on search relate\"\n        pool = Pool()\n        TestAccess = pool.get(self.model_name)\n        Model = pool.get('ir.model')\n        ModelAccess = pool.get('ir.model.access')\n        record, = TestAccess.create([{}])\n        model, = Model.search([('model', '=', 'test.access.relate')])\n        ModelAccess.create([{\n                    'model': model.id,\n                    'perm_read': True,\n                    }])\n\n        TestAccess.read([record.id], ['relate.value'])\n        TestAccess.search([('relate.value', '=', 42)])\n        TestAccess.search([('reference.value', '=', 42, 'test.access.relate')])\n        TestAccess.search([('dict_.key', '=', 42)])\n        TestAccess.search([], order=[('relate.value', 'ASC')])\n        TestAccess.search([], order=[('dict_.key', 'ASC')])\n\n    @with_transaction(context=_context)\n    def test_no_access_relate(self):\n        \"Test no access on search relate\"\n        pool = Pool()\n        TestAccess = pool.get(self.model_name)\n        Model = pool.get('ir.model')\n        ModelAccess = pool.get('ir.model.access')\n        record, = TestAccess.create([{}])\n        model, = Model.search([('model', '=', 'test.access.relate')])\n        ModelAccess.create([{\n                    'model': model.id,\n                    'perm_read': False,\n                    }])\n\n        with self.assertRaises(AccessError):\n            TestAccess.read([record.id], ['relate.value'])\n        with self.assertRaises(AccessError):\n            TestAccess.search([('relate.value', '=', 42)])\n        with self.assertRaises(AccessError):\n            TestAccess.search(\n                [('reference.value', '=', 42, 'test.access.relate')])\n        with self.assertRaises(AccessError):\n            TestAccess.search([], order=[('relate.value', 'ASC')])\n\n\nclass ModelAccessWriteTestCase(_ModelAccessTestCase):\n    _perm = 'perm_write'\n\n    def _assert(self, record):\n        pool = Pool()\n        TestAccess = pool.get(self.model_name)\n        TestAccess.write([record], {})\n\n    def _assert_raises(self, record):\n        pool = Pool()\n        TestAccess = pool.get(self.model_name)\n        with self.assertRaises(AccessError):\n            TestAccess.write([record], {})\n\n\nclass ModelAccessCreateTestCase(_ModelAccessTestCase):\n    _perm = 'perm_create'\n\n    def _assert(self, record):\n        pool = Pool()\n        TestAccess = pool.get(self.model_name)\n        TestAccess.create([{}])\n\n    def _assert_raises(self, record):\n        pool = Pool()\n        TestAccess = pool.get(self.model_name)\n        with self.assertRaises(AccessError):\n            TestAccess.create([{}])\n\n\nclass ModelAccessDeleteTestCase(_ModelAccessTestCase):\n    _perm = 'perm_delete'\n\n    def _assert(self, record):\n        pool = Pool()\n        TestAccess = pool.get(self.model_name)\n        TestAccess.delete([record])\n\n    def _assert_raises(self, record):\n        pool = Pool()\n        TestAccess = pool.get(self.model_name)\n        with self.assertRaises(AccessError):\n            TestAccess.delete([record])\n\n\nclass ModelAccessModelTestCase(_ModelAccessTestCase):\n    model_name = 'test.access.model'\n    _perm = 'perm_read'\n\n    def _assert(self, record):\n        pool = Pool()\n        TestAccess = pool.get(self.model_name)\n        TestAccess.read([record.id], ['field1'])\n        TestAccess.search([])\n\n    def _assert_raises(self, record):\n        pool = Pool()\n        TestAccess = pool.get(self.model_name)\n        with self.assertRaises(AccessError):\n            TestAccess.read([record.id], ['field1'])\n        with self.assertRaises(AccessError):\n            TestAccess.search([])\n\n\nclass _ModelFieldAccessTestCase(unittest.TestCase):\n    _perm = None\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    def _field(self, name):\n        pool = Pool()\n        Field = pool.get('ir.model.field')\n        field1, = Field.search([\n                ('model.model', '=', 'test.access'),\n                ('name', '=', name),\n                ])\n        return field1\n\n    @property\n    def field1(self):\n        return self._field('field1')\n\n    @property\n    def field2(self):\n        return self._field('field2')\n\n    @property\n    def group(self):\n        pool = Pool()\n        Group = pool.get('res.group')\n        group, = Group.search([('users', '=', Transaction().user)])\n        return group\n\n    def _assert1(self, record):\n        raise NotImplementedError\n\n    def _assert2(self, record):\n        raise NotImplementedError\n\n    def _assert_raises1(self, record):\n        raise NotImplementedError\n\n    def _assert_raises2(self, record):\n        raise NotImplementedError\n\n    @with_transaction(context=_context)\n    def test_access_empty(self):\n        \"Test access without model field access\"\n        pool = Pool()\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n\n        self._assert1(record)\n        self._assert2(record)\n\n    @with_transaction(context=_context)\n    def test_access_without_group(self):\n        \"Test access without group\"\n        pool = Pool()\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': None,\n                    self._perm: True,\n                    }])\n\n        self._assert1(record)\n        self._assert2(record)\n\n    @with_transaction(context=_context)\n    def test_no_access_without_group(self):\n        \"Test no access without group\"\n        pool = Pool()\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': None,\n                    self._perm: False,\n                    }])\n\n        self._assert_raises1(record)\n        self._assert2(record)\n\n    @with_transaction(context=_context)\n    def test_one_access_with_groups(self):\n        \"Test one access with groups\"\n        pool = Pool()\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': None,\n                    self._perm: False,\n                    }])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': self.group.id,\n                    self._perm: True,\n                    }])\n\n        self._assert1(record)\n        self._assert2(record)\n\n    @with_transaction(context=_context)\n    def test_one_access_without_group(self):\n        \"Test one access without group\"\n        pool = Pool()\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': None,\n                    self._perm: True,\n                    }])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': self.group.id,\n                    self._perm: False,\n                    }])\n\n        self._assert1(record)\n        self._assert2(record)\n\n    @with_transaction(context=_context)\n    def test_all_access_with_groups(self):\n        \"Test all access with groups\"\n        pool = Pool()\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': None,\n                    self._perm: True,\n                    }])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': self.group.id,\n                    self._perm: True,\n                    }])\n\n        self._assert1(record)\n        self._assert2(record)\n\n    @with_transaction(context=_context)\n    def test_no_access_with_groups(self):\n        \"Test no access with groups\"\n        pool = Pool()\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': None,\n                    self._perm: False,\n                    }])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': self.group.id,\n                    self._perm: False,\n                    }])\n\n        self._assert_raises1(record)\n        self._assert2(record)\n\n    @with_transaction(context=_context)\n    def test_one_access_with_group(self):\n        \"Test one access with group\"\n        pool = Pool()\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': self.group.id,\n                    self._perm: True,\n                    }])\n\n        self._assert1(record)\n        self._assert2(record)\n\n    @with_transaction(context=_context)\n    def test_no_access_with_group(self):\n        \"Test no access with group\"\n        pool = Pool()\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': self.group.id,\n                    self._perm: False,\n                    }])\n\n        self._assert_raises1(record)\n        self._assert2(record)\n\n    @with_transaction(context=_context)\n    def test_one_access_with_other_group(self):\n        \"Test no access with other group\"\n        pool = Pool()\n        Group = pool.get('res.group')\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        group, = Group.create([{'name': 'Test'}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': self.group.id,\n                    self._perm: True,\n                    }])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': group.id,\n                    self._perm: True,\n                    }])\n\n        self._assert1(record)\n        self._assert2(record)\n\n    @with_transaction(context=_context)\n    def test_no_access_with_other_group(self):\n        \"Test no access with other group\"\n        pool = Pool()\n        Group = pool.get('res.group')\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        group, = Group.create([{'name': 'Test'}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': self.group.id,\n                    self._perm: False,\n                    }])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': group.id,\n                    self._perm: True,\n                    }])\n\n        self._assert_raises1(record)\n        self._assert2(record)\n\n    @with_transaction(context=_context)\n    def test_one_access_with_other_group_no_perm(self):\n        \"Test one access with other group no perm\"\n        pool = Pool()\n        Group = pool.get('res.group')\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        group, = Group.create([{'name': 'Test'}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': self.group.id,\n                    self._perm: True,\n                    }])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': group.id,\n                    self._perm: False,\n                    }])\n\n        self._assert1(record)\n        self._assert2(record)\n\n    @with_transaction(context=_context)\n    def test_access_inherited_from_parent(self):\n        \"Test no access with other group\"\n        pool = Pool()\n        Group = pool.get('res.group')\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        group, = Group.create([{'name': 'Test'}])\n        Group.write([self.group], {\n                'parent': group.id,\n                })\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': self.group.id,\n                    self._perm: False,\n                    }])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': group.id,\n                    self._perm: True,\n                    }])\n\n        self._assert1(record)\n        self._assert2(record)\n\n    @with_transaction(context=_context)\n    def test_two_access(self):\n        \"Test two access\"\n        pool = Pool()\n        Group = pool.get('res.group')\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        group, = Group.create([{'name': 'Test'}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': None,\n                    self._perm: True,\n                    }])\n        FieldAccess.create([{\n                    'field': self.field2.id,\n                    'group': None,\n                    self._perm: True,\n                    }])\n\n        self._assert1(record)\n        self._assert2(record)\n\n    @with_transaction(context=_context)\n    def test_two_no_access(self):\n        \"Test two no access\"\n        pool = Pool()\n        Group = pool.get('res.group')\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        group, = Group.create([{'name': 'Test'}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': None,\n                    self._perm: False,\n                    }])\n        FieldAccess.create([{\n                    'field': self.field2.id,\n                    'group': None,\n                    self._perm: False,\n                    }])\n\n        self._assert_raises1(record)\n        self._assert_raises2(record)\n\n    @with_transaction(context=_context)\n    def test_two_both_access(self):\n        \"Test two both access\"\n        pool = Pool()\n        Group = pool.get('res.group')\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        group, = Group.create([{'name': 'Test'}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': None,\n                    self._perm: True,\n                    }])\n        FieldAccess.create([{\n                    'field': self.field2.id,\n                    'group': None,\n                    self._perm: False,\n                    }])\n\n        self._assert1(record)\n        self._assert_raises2(record)\n\n    @with_transaction(context=_context)\n    def test_two_access_with_group(self):\n        \"Test two access with group\"\n        pool = Pool()\n        Group = pool.get('res.group')\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        group, = Group.create([{'name': 'Test'}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': self.group.id,\n                    self._perm: True,\n                    }])\n        FieldAccess.create([{\n                    'field': self.field2.id,\n                    'group': None,\n                    self._perm: True,\n                    }])\n\n        self._assert1(record)\n        self._assert2(record)\n\n    @with_transaction(context=_context)\n    def test_two_access_with_groups(self):\n        \"Test two access with groups\"\n        pool = Pool()\n        Group = pool.get('res.group')\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        group, = Group.create([{'name': 'Test'}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': self.group.id,\n                    self._perm: True,\n                    }])\n        FieldAccess.create([{\n                    'field': self.field2.id,\n                    'group': self.group.id,\n                    self._perm: True,\n                    }])\n\n        self._assert1(record)\n        self._assert2(record)\n\n    @with_transaction(context=_context)\n    def test_two_no_access_with_group(self):\n        \"Test two no access with group\"\n        pool = Pool()\n        Group = pool.get('res.group')\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        group, = Group.create([{'name': 'Test'}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': self.group.id,\n                    self._perm: False,\n                    }])\n        FieldAccess.create([{\n                    'field': self.field2.id,\n                    'group': self.group.id,\n                    self._perm: False,\n                    }])\n\n        self._assert_raises1(record)\n        self._assert_raises2(record)\n\n    @with_transaction(context=_context)\n    def test_two_both_access_with_group(self):\n        \"Test two both access with group\"\n        pool = Pool()\n        Group = pool.get('res.group')\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.access')\n        record, = TestAccess.create([{}])\n        group, = Group.create([{'name': 'Test'}])\n        FieldAccess.create([{\n                    'field': self.field1.id,\n                    'group': self.group.id,\n                    self._perm: True,\n                    }])\n        FieldAccess.create([{\n                    'field': self.field2.id,\n                    'group': None,\n                    self._perm: False,\n                    }])\n\n        self._assert1(record)\n        self._assert_raises2(record)\n\n\nclass ModelFieldAccessReadTestCase(_ModelFieldAccessTestCase):\n    _perm = 'perm_read'\n\n    def _assert1(self, record):\n        pool = Pool()\n        TestAccess = pool.get('test.access')\n        TestAccess.read([record.id], ['field1'])\n        TestAccess.search([('field1', '=', 'test')])\n\n    def _assert2(self, record):\n        pool = Pool()\n        TestAccess = pool.get('test.access')\n        TestAccess.read([record.id], ['field2'])\n        TestAccess.search([('field2', '=', 'test')])\n\n    def _assert_raises1(self, record):\n        pool = Pool()\n        TestAccess = pool.get('test.access')\n        with self.assertRaises(AccessError):\n            TestAccess.read([record.id], ['field1'])\n        with self.assertRaises(AccessError):\n            TestAccess.search([('field1', '=', 'test')])\n\n    def _assert_raises2(self, record):\n        pool = Pool()\n        TestAccess = pool.get('test.access')\n        with self.assertRaises(AccessError):\n            TestAccess.read([record.id], ['field2'])\n        with self.assertRaises(AccessError):\n            TestAccess.search([('field2', '=', 'test')])\n\n    @with_transaction(context=_context)\n    def test_access_search_relate_empty(self):\n        \"Test access on search relate\"\n        pool = Pool()\n        TestAccess = pool.get('test.access')\n\n        TestAccess.search([('relate.value', '=', 42)])\n        TestAccess.search([('reference.value', '=', 42, 'test.access.relate')])\n\n    @with_transaction(context=_context)\n    def test_access_search_relate(self):\n        \"Test access on search relate\"\n        pool = Pool()\n        TestAccess = pool.get('test.access')\n        Field = pool.get('ir.model.field')\n        FieldAccess = pool.get('ir.model.field.access')\n        field, = Field.search([\n                ('model.model', '=', 'test.access.relate'),\n                ('name', '=', 'value'),\n                ])\n        FieldAccess.create([{\n                    'field': field.id,\n                    'perm_read': True,\n                    }])\n\n        TestAccess.search([('relate.value', '=', 42)])\n        TestAccess.search([('reference.value', '=', 42, 'test.access.relate')])\n        TestAccess.search([\n                ('reference.parent.value', '=', 42, 'test.access.relate')])\n        TestAccess.search([], order=[('relate.value', 'ASC')])\n\n    @with_transaction(context=_context)\n    def test_no_access_search_relate(self):\n        \"Test access on search relate\"\n        pool = Pool()\n        TestAccess = pool.get('test.access')\n        Field = pool.get('ir.model.field')\n        FieldAccess = pool.get('ir.model.field.access')\n        field, = Field.search([\n                ('model.model', '=', 'test.access.relate'),\n                ('name', '=', 'value'),\n                ])\n        FieldAccess.create([{\n                    'field': field.id,\n                    'perm_read': False,\n                    }])\n\n        with self.assertRaises(AccessError):\n            TestAccess.search([('relate.value', '=', 42)])\n        with self.assertRaises(AccessError):\n            TestAccess.search(\n                [('reference.value', '=', 42, 'test.access.relate')])\n        with self.assertRaises(AccessError):\n            TestAccess.search(\n                [('reference.parent.value', '=', 42, 'test.access.relate')])\n        with self.assertRaises(AccessError):\n            TestAccess.search([], order=[('relate.value', 'ASC')])\n\n    @with_transaction(context=_context)\n    def test_access_search_relate_parent_field(self):\n        \"Test access on search relate with a parent field\"\n        pool = Pool()\n        TestAccess = pool.get('test.access')\n        Field = pool.get('ir.model.field')\n        FieldAccess = pool.get('ir.model.field.access')\n        field, = Field.search([\n                ('model.model', '=', 'test.access.relate'),\n                ('name', '=', 'parent'),\n                ])\n        FieldAccess.create([{\n                    'field': field.id,\n                    'perm_read': True,\n                    }])\n\n        TestAccess.search([('relate', 'child_of', 42, 'parent')])\n\n    @with_transaction(context=_context)\n    def test_no_access_search_relate_parent_field(self):\n        \"Test no access on search relate with a parent field\"\n        pool = Pool()\n        TestAccess = pool.get('test.access')\n        Field = pool.get('ir.model.field')\n        FieldAccess = pool.get('ir.model.field.access')\n        field, = Field.search([\n                ('model.model', '=', 'test.access.relate'),\n                ('name', '=', 'parent'),\n                ])\n        FieldAccess.create([{\n                    'field': field.id,\n                    'perm_read': False,\n                    }])\n\n        with self.assertRaises(AccessError):\n            TestAccess.search([('relate', 'child_of', 42, 'parent')])\n\n\nclass ModelFieldAccessWriteTestCase(_ModelFieldAccessTestCase):\n    _perm = 'perm_write'\n\n    def _assert1(self, record):\n        pool = Pool()\n        TestAccess = pool.get('test.access')\n        TestAccess.write([record], {'field1': 'test'})\n\n    def _assert2(self, record):\n        pool = Pool()\n        TestAccess = pool.get('test.access')\n        TestAccess.write([record], {'field2': 'test'})\n\n    def _assert_raises1(self, record):\n        pool = Pool()\n        TestAccess = pool.get('test.access')\n        with self.assertRaises(AccessError):\n            TestAccess.write([record], {'field1': 'test'})\n\n    def _assert_raises2(self, record):\n        pool = Pool()\n        TestAccess = pool.get('test.access')\n        with self.assertRaises(AccessError):\n            TestAccess.write([record], {'field2': 'test'})\n\n\ndel _ModelAccessTestCase, _ModelFieldAccessTestCase\n"
  },
  {
    "path": "trytond/tests/test_backend.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime as dt\nimport math\nimport unittest\n\nfrom sql import Literal, Select, functions\nfrom sql.functions import CurrentTimestamp, DateTrunc, ToChar\n\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\n\nclass BackendTestCase(unittest.TestCase):\n    \"Test the backend\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_current_timestamp_static_transaction(self):\n        \"Test CURRENT_TIMESTAMP is static during transaction\"\n        query = Select([CurrentTimestamp()])\n        cursor = Transaction().connection.cursor()\n\n        cursor.execute(*query)\n        current, = cursor.fetchone()\n        cursor.execute(*query)\n        second, = cursor.fetchone()\n\n        self.assertEqual(current, second)\n\n    @with_transaction()\n    def test_current_timestamp_reset_after_commit(self):\n        \"Test CURRENT_TIMESTAMP is reset after commit\"\n        query = Select([CurrentTimestamp()])\n        cursor = Transaction().connection.cursor()\n\n        cursor.execute(*query)\n        current, = cursor.fetchone()\n        Transaction().commit()\n        cursor.execute(*query)\n        second, = cursor.fetchone()\n\n        self.assertNotEqual(current, second)\n\n    @with_transaction()\n    def test_current_timestamp_different_transaction(self):\n        \"Test CURRENT_TIMESTAMP is different per transaction\"\n        query = Select([CurrentTimestamp()])\n        cursor = Transaction().connection.cursor()\n\n        cursor.execute(*query)\n        current, = cursor.fetchone()\n\n        with Transaction().new_transaction() as transaction:\n            cursor = transaction.connection.cursor()\n            cursor.execute(*query)\n            second, = cursor.fetchone()\n\n        self.assertNotEqual(current, second)\n\n    @with_transaction()\n    def test_to_char_datetime(self):\n        \"Test TO_CHAR with datetime\"\n        now = dt.datetime.now()\n        query = Select([ToChar(now, 'YYYYMMDD HH24:MI:SS.US')])\n        cursor = Transaction().connection.cursor()\n\n        cursor.execute(*query)\n        text, = cursor.fetchone()\n\n        self.assertEqual(text, now.strftime('%Y%m%d %H:%M:%S.%f'))\n\n    @with_transaction()\n    def test_to_char_date(self):\n        \"Test TO_CHAR with date\"\n        today = dt.date.today()\n        query = Select([ToChar(today, 'YYYY-MM-DD')])\n        cursor = Transaction().connection.cursor()\n\n        cursor.execute(*query)\n        text, = cursor.fetchone()\n\n        self.assertEqual(text, today.strftime('%Y-%m-%d'))\n\n    @with_transaction()\n    def test_functions(self):\n        \"Test functions\"\n        cursor = Transaction().connection.cursor()\n        tests = [\n            (functions.Abs(-1), 1),\n            (functions.Cbrt(27), 3),\n            (functions.Ceil(-42.8), -42),\n            (functions.Degrees(0.5), 28.6478897565412),\n            (functions.Div(9, 4), 2),\n            (functions.Exp(1.), math.e),\n            (functions.Floor(-42.8), -43),\n            (functions.Ln(2.), 0.693147180559945),\n            (functions.Log(100.0), 2),\n            (functions.Mod(9, 4), 1),\n            (functions.Pi(), math.pi),\n            (functions.Power(9, 3), 729),\n            (functions.Radians(45.), math.pi / 4),\n            (functions.Round(42.4), 42),\n            (functions.Round(42.4382, 2), 42.44),\n            (functions.Sign(-8.4), -1),\n            (functions.Sqrt(2.), 1.4142135623731),\n            (functions.Trunc(42.8), 42),\n            (functions.Trunc(42.4348, 2), 42.43),\n            (functions.Acos(0.5), 1.0471975511965979),\n            (functions.Asin(0.5), 0.5235987755982989),\n            (functions.Atan(0.5), 0.4636476090008061),\n            (functions.Atan2(0.5, 0.5), 0.7853981633974483),\n            (functions.Cos(1), 0.5403023058681398),\n            (functions.Cot(0), math.inf),\n            (functions.Cot(1), 0.6420926159343306),\n            (functions.Sin(1), 0.8414709848078965),\n            (functions.Tan(1), 1.5574077246549023),\n            (functions.CharLength('jose'), 4),\n            (functions.Lower('TOM'), 'tom'),\n            (functions.Overlay('Txxxxas', 'hom', 2, 4), 'Thomas'),\n            (functions.Position('om', 'Thomas'), 3),\n            (functions.Substring('Thomas', 2, 3), 'hom'),\n            # (functions.Substring('Thomas', '...$'), 'mas'),\n            # (functions.Substring('Thomas', '%#\"o_a#\"_', '#'), 'oma'),\n            (functions.Trim('yxTomxx', 'BOTH', 'xyz'), 'Tom'),\n            (functions.Trim(Literal('yxTomxxx'), 'BOTH', 'xyz'), \"Tom\"),\n            (functions.Upper('tom'), 'TOM'),\n            ]\n        for func, result in tests:\n            with self.subTest(func=str(func)):\n                cursor.execute(*Select([func]))\n                value, = cursor.fetchone()\n                if isinstance(result, str):\n                    self.assertEqual(value, result)\n                else:\n                    self.assertAlmostEqual(float(value), float(result))\n\n    @with_transaction()\n    def test_function_random(self):\n        \"Test RANDOM function\"\n        cursor = Transaction().connection.cursor()\n        cursor.execute(*Select([functions.Random()]))\n        value, = cursor.fetchone()\n        self.assertGreaterEqual(value, 0)\n        self.assertLessEqual(value, 1)\n\n    @with_transaction()\n    def test_function_setseed(self):\n        \"Test SETSEED function\"\n        cursor = Transaction().connection.cursor()\n        cursor.execute(*Select([functions.SetSeed(1)]))\n\n    @with_transaction()\n    def test_function_date_trunc(self):\n        \"Test DateTrunc function\"\n        cursor = Transaction().connection.cursor()\n        date = dt.datetime(2001, 2, 16, 20, 38, 40, 100)\n        for type_, result in [\n                ('microsecond', dt.datetime(2001, 2, 16, 20, 38, 40, 100)),\n                ('second', dt.datetime(2001, 2, 16, 20, 38, 40)),\n                ('minute', dt.datetime(2001, 2, 16, 20, 38)),\n                ('hour', dt.datetime(2001, 2, 16, 20)),\n                ('day', dt.datetime(2001, 2, 16)),\n                ('month', dt.datetime(2001, 2, 1)),\n                ]:\n            for type_ in [type_.lower(), type_.upper()]:\n                with self.subTest(type_=type_):\n                    cursor.execute(*Select([DateTrunc(type_, date)]))\n                    value, = cursor.fetchone()\n                    self.assertEqual(str(value), str(result))\n"
  },
  {
    "path": "trytond/tests/test_bus.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport os\nimport time\nimport unittest\nfrom unittest.mock import patch\n\nfrom trytond import backend, bus\nfrom trytond.bus import Bus, _MessageQueue, notify\nfrom trytond.tests.test_tryton import (\n    DB_NAME, activate_module, with_transaction)\nfrom trytond.transaction import Transaction\n\n\nclass MessageQueueTestCase(unittest.TestCase):\n\n    def setUp(self):\n        self._timestamp = 0\n\n    def _time(self):\n        _timestamp = self._timestamp\n        self._timestamp += 1\n        return _timestamp\n\n    def test_get_next(self):\n        \"Testing the basic functionality of get_next\"\n        with patch('time.time', self._time):\n            mq = _MessageQueue(5)\n            for x in range(15):\n                mq.append('channel', {'message_id': x})\n            channel, content = mq.get_next({'channel'}, 11)\n\n        self.assertEqual(content, {'message_id': 12})\n\n    def test_get_next_channels(self):\n        \"Testing get_next with multiple channels\"\n        with patch('time.time', self._time):\n            mq = _MessageQueue(5)\n            for x in range(15):\n                mq.append('odd' if x % 2 else 'even', {'message_id': x})\n            channel, content = mq.get_next({'odd'}, 11)\n\n        self.assertEqual(content, {'message_id': 13})\n        self.assertEqual(channel, 'odd')\n\n    def test_get_next_timeout_expired(self):\n        \"Testing get_next when requesting an outdated message\"\n        with patch('time.time', self._time):\n            mq = _MessageQueue(5)\n            for x in range(15):\n                mq.append('channel', {'message_id': x})\n            channel, content = mq.get_next({'channel'}, 0)\n\n        self.assertEqual(content, {'message_id': 10})\n\n    def test_get_next_message_id_missing(self):\n        \"Testing get_next when requesting a missing message\"\n        with patch('time.time', self._time):\n            mq = _MessageQueue(5)\n            for x in range(15):\n                mq.append('channel', {'message_id': x})\n            channel, content = mq.get_next({'channel'}, -5)\n\n        self.assertEqual(content, {'message_id': 10})\n\n    def test_get_next_message_id_None(self):\n        \"Testing get_next when not specifying a message\"\n        with patch('time.time', self._time):\n            mq = _MessageQueue(5)\n            for x in range(15):\n                mq.append('channel', {'message_id': x})\n            channel, content = mq.get_next({'channel'})\n\n        self.assertEqual(content, {'message_id': 10})\n\n\nclass BusTestCase(unittest.TestCase):\n    \"Test Bus\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('ir')\n        super().setUpClass()\n\n    def setUp(self):\n        super().setUp()\n\n        reset_polling_timeout = bus._long_polling_timeout\n        bus._long_polling_timeout = 1\n        self.addCleanup(\n            setattr, bus, '_long_polling_timeout', reset_polling_timeout)\n\n        reset_select_timeout = bus._select_timeout\n        bus._select_timeout = 1\n        self.addCleanup(\n            setattr, bus, '_select_timeout', reset_select_timeout)\n\n    def tearDown(self):\n        pid = os.getpid()\n        if (pid, DB_NAME) in Bus._queues:\n            with Bus._queues_lock[pid]:\n                Bus._queues[pid, DB_NAME]['timeout'] = 0\n                listener = Bus._queues[pid, DB_NAME]['listener']\n            listener.join()\n        Bus._messages.clear()\n\n    @with_transaction()\n    def test_notify(self):\n        \"Test notify\"\n        notify(\"Test\", \"Message\", user=1)\n\n    @unittest.skipIf(backend.name == 'sqlite', 'SQLite has not channel')\n    def test_subscribe_nothing(self):\n        \"Test subscribe with nothing\"\n        response = Bus.subscribe(DB_NAME, ['user:1'])\n\n        self.assertEqual(response, {'message': None, 'channel': None})\n\n    @unittest.skipIf(backend.name == 'sqlite', 'SQLite has not channel')\n    def test_subscribe_message(self):\n        \"Test subscribe with message\"\n        Bus.subscribe(DB_NAME, ['user:1'])\n\n        transaction = Transaction()\n        with transaction.start(DB_NAME, 1):\n            notify(\"Test\", \"Message\", user=1)\n            transaction.commit()\n        # Let the listen thread registers the message\n        time.sleep(1)\n        response = Bus.subscribe(DB_NAME, ['user:1'])\n\n        self.assertTrue(response['message'].pop('message_id'))\n        self.assertEqual(response, {\n                'message': {\n                    'type': 'notification',\n                    'title': \"Test\",\n                    'body': \"Message\",\n                    'priority': 1,\n                    },\n                'channel': 'user:1',\n                })\n"
  },
  {
    "path": "trytond/tests/test_cache.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport datetime as dt\nimport time\nimport unittest\n\nfrom trytond import backend\nfrom trytond import cache as cache_mod\nfrom trytond.cache import (\n    LRUDict, LRUDictTransaction, MemoryCache, freeze, unfreeze)\nfrom trytond.tests.test_tryton import (\n    DB_NAME, USER, activate_module, with_transaction)\nfrom trytond.transaction import Transaction\n\ncache = MemoryCache('test.cache')\ncache_expire = MemoryCache('test.cache_expire', duration=1)\n\n\nclass CacheTestCase(unittest.TestCase):\n    \"Test Cache\"\n\n    def testFreeze(self):\n        \"Test freeze\"\n        self.assertEqual(freeze([1, 2, 3]), (1, 2, 3))\n        self.assertEqual(freeze({\n                    'list': [1, 2, 3],\n                    }),\n            frozenset([('list', (1, 2, 3))]))\n        self.assertEqual(freeze({\n                    'dict': {\n                        'inner dict': {\n                            'list': [1, 2, 3],\n                            'string': 'test',\n                            },\n                        }\n                    }),\n            frozenset([('dict',\n                        frozenset([('inner dict',\n                                    frozenset([\n                                            ('list', (1, 2, 3)),\n                                            ('string', 'test'),\n                                            ]))]))]))\n\n    def testUnfreeze(self):\n        \"Test unfreeze\"\n        for value, result in [\n                (freeze([1, 2, 3]), [1, 2, 3]),\n                (freeze({'dict': {\n                                'inner dict': {\n                                    'list': [1, 2, 3],\n                                    'string': 'test',\n                                    },\n                                },\n                            }),\n                    {'dict': {\n                            'inner dict': {\n                                'list': [1, 2, 3],\n                                'string': 'test',\n                                },\n                            },\n                        }),\n                ]:\n            with self.subTest(value=value):\n                self.assertEqual(unfreeze(value), result)\n\n\nclass MemoryCacheTestCase(unittest.TestCase):\n    \"Test Cache\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    def setUp(self):\n        super().setUp()\n        clear_timeout = cache_mod._clear_timeout\n        cache_mod._clear_timeout = 1\n        self.addCleanup(\n            setattr, cache_mod, '_clear_timeout', clear_timeout)\n\n    def tearDown(self):\n        MemoryCache.drop(DB_NAME)\n\n    def wait_cache_sync(self, after=None):\n        pass\n\n    @with_transaction()\n    def test_memory_cache_set_get(self):\n        \"Test MemoryCache set/get\"\n        cache.set('foo', 'bar')\n\n        self.assertEqual(cache.get('foo'), 'bar')\n\n    @with_transaction()\n    def test_memory_cache_drop(self):\n        \"Test MemoryCache drop\"\n        cache.set('foo', 'bar')\n        MemoryCache.drop(DB_NAME)\n\n        self.assertEqual(cache.get('foo'), None)\n\n    def test_memory_cache_transactions(self):\n        \"Test MemoryCache with concurrent transactions\"\n        transaction1 = Transaction().start(DB_NAME, USER)\n        self.addCleanup(transaction1.stop)\n\n        cache.set('foo', 'bar')\n        self.assertEqual(cache.get('foo'), 'bar')\n\n        transaction2 = transaction1.new_transaction()\n        self.addCleanup(transaction2.stop)\n\n        cache.clear()\n        self.assertEqual(cache.get('foo'), None)\n\n        cache.set('foo', 'baz')\n        self.assertEqual(cache.get('foo'), 'baz')\n\n        with Transaction().set_current_transaction(transaction1):\n            self.assertEqual(cache.get('foo'), 'bar')\n\n        commit_time = dt.datetime.now()\n        transaction2.commit()\n        self.wait_cache_sync(after=commit_time)\n        self.assertEqual(cache.get('foo'), 'baz')\n\n    def test_memory_cache_nested_transactions(self):\n        \"Test MemoryCache with nested transactions\"\n        # Create entry in the cache table to trigger 2 updates\n        with Transaction().start(DB_NAME, USER):\n            cache.clear()\n        # Ensure sync is performed on start\n        time.sleep(cache_mod._clear_timeout)\n\n        with Transaction().start(DB_NAME, USER) as transaction1:\n            cache.clear()\n            with transaction1.new_transaction():\n                cache.clear()\n\n    def test_memory_cache_sync(self):\n        \"Test MemoryCache synchronisation\"\n        with Transaction().start(DB_NAME, USER):\n            cache.clear()\n        time.sleep(cache_mod._clear_timeout)\n        last = cache._clean_last\n\n        with Transaction().start(DB_NAME, USER):\n            self.assertGreater(cache._clean_last, last)\n\n    def test_memory_cache_old_transaction(self):\n        \"Test old transaction does not fill cache\"\n        transaction1 = Transaction().start(DB_NAME, USER)\n        self.addCleanup(transaction1.stop)\n\n        # Clear cache from new transaction\n        transaction2 = transaction1.new_transaction()\n        self.addCleanup(transaction2.stop)\n        cache.clear()\n        commit_time = dt.datetime.now()\n        transaction2.commit()\n        self.wait_cache_sync(after=commit_time)\n\n        # Set value from old transaction\n        Transaction().set_current_transaction(transaction1)\n        self.addCleanup(transaction1.stop)\n        cache.set('foo', 'baz')\n\n        # New transaction has still empty cache\n        transaction3 = transaction1.new_transaction()\n        self.addCleanup(transaction3.stop)\n        self.assertEqual(cache.get('foo'), None)\n\n    @with_transaction()\n    def test_memory_cache_expire(self):\n        \"Test expired cache\"\n        cache_expire.set('foo', \"bar\")\n        time.sleep(cache_expire.duration.total_seconds())\n\n        self.assertEqual(cache_expire.get('foo'), None)\n\n\n@unittest.skipIf(backend.name == 'sqlite', \"SQLite has not channel\")\nclass MemoryCacheChannelTestCase(MemoryCacheTestCase):\n    \"Test Cache with channel\"\n\n    def setUp(self):\n        super().setUp()\n        clear_timeout = cache_mod._clear_timeout\n        cache_mod._clear_timeout = 0\n        self.addCleanup(\n            setattr, cache_mod, '_clear_timeout', clear_timeout)\n\n    def wait_cache_sync(self, after=None):\n        if after is None:\n            after = dt.datetime.now()\n        while MemoryCache._clean_last < after:\n            time.sleep(.01)\n\n    @unittest.skip(\"No cache sync on transaction start with channel\")\n    def test_memory_cache_sync(self):\n        super().test_memory_cache_sync()\n\n\nclass LRUDictTestCase(unittest.TestCase):\n    \"Test LRUDict\"\n\n    def test_setitem(self):\n        lru_dict = LRUDict(1)\n\n        lru_dict['foo'] = 'foo'\n        self.assertEqual(len(lru_dict), 1)\n\n        lru_dict['bar'] = 'bar'\n        self.assertEqual(len(lru_dict), 1)\n        self.assertEqual(lru_dict, {'bar': 'bar'})\n\n    def test_update(self):\n        lru_dict = LRUDict(1)\n\n        lru_dict['foo'] = 'foo'\n        self.assertEqual(len(lru_dict), 1)\n\n        lru_dict.update(bar='bar')\n        lru_dict.update(baz='baz')\n        self.assertEqual(len(lru_dict), 1)\n        self.assertEqual(lru_dict, {'baz': 'baz'})\n\n    def test_setdefault(self):\n        lru_dict = LRUDict(1)\n\n        lru_dict['foo'] = 'foo'\n        self.assertEqual(len(lru_dict), 1)\n\n        lru_dict.setdefault('bar', 'value')\n        self.assertEqual(len(lru_dict), 1)\n        self.assertEqual(lru_dict, {'bar': 'value'})\n\n    def test_default_factory(self):\n        lru_dict = LRUDict(1, default_factory=list)\n\n        self.assertEqual(lru_dict['foo'], [])\n\n        lru_dict['bar'].append('bar')\n        self.assertEqual(lru_dict, {'bar': ['bar']})\n\n    def test_default_factory_with_key(self):\n        lru_dict = LRUDict(\n            1, default_factory=lambda k: k, default_factory_with_key=True)\n\n        self.assertEqual(lru_dict['foo'], 'foo')\n\n\nclass LRUDictTransactionTestCase(unittest.TestCase):\n    \"Test LRUDictTransaction\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_init(self):\n        \"Test init set to transaction counter\"\n        lru_dict = LRUDictTransaction(48)\n\n        self.assertEqual(lru_dict.counter, Transaction().counter)\n\n    @with_transaction()\n    def test_clear(self):\n        \"Test clear reset counter\"\n        lru_dict = LRUDictTransaction(48)\n\n        Transaction().counter += 1\n        lru_dict.clear()\n\n        self.assertEqual(lru_dict.counter, Transaction().counter)\n\n    @with_transaction()\n    def test_refresh(self):\n        \"Test refresh\"\n        lru_dict = LRUDictTransaction(48)\n\n        lru_dict['foo'] = 'foo'\n        lru_dict.refresh()\n\n        self.assertEqual(lru_dict, {'foo': 'foo'})\n\n        Transaction().counter += 1\n        lru_dict.refresh()\n\n        self.assertEqual(lru_dict, {})\n        self.assertEqual(lru_dict.counter, Transaction().counter)\n"
  },
  {
    "path": "trytond/tests/test_copy.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond.model import fields\nfrom trytond.model.exceptions import AccessError\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\nfrom .test_modelsql import TranslationTestCase\n\n\nclass CopyTestCase(unittest.TestCase):\n    'Test copy'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_copy(self):\n        \"Test copy\"\n        pool = Pool()\n        Copy = pool.get('test.copy')\n        record = Copy(name=\"Name\")\n        record.save()\n\n        record_copy, = Copy.copy([record])\n\n        self.assertNotEqual(record_copy.id, record.id)\n        self.assertEqual(record_copy.name, record.name)\n\n    @with_transaction()\n    def test_copy_default(self):\n        \"Test copy with default value\"\n        pool = Pool()\n        Copy = pool.get('test.copy')\n        record = Copy(name=\"Name\")\n        record.save()\n\n        record_copy, = Copy.copy([record], default={'name': \"New name\"})\n\n        self.assertNotEqual(record_copy.id, record.id)\n        self.assertEqual(record_copy.name, \"New name\")\n\n    @with_transaction()\n    def test_copy_default_callable(self):\n        \"Test copy with default callable\"\n        pool = Pool()\n        Copy = pool.get('test.copy')\n        record = Copy(name=\"Name\")\n        record.save()\n\n        def default_name(data):\n            self.assertEqual(data['id'], record.id)\n            return data['name'] + \" bis\"\n\n        record_copy, = Copy.copy([record], default={'name': default_name})\n\n        self.assertNotEqual(record_copy.id, record.id)\n        self.assertEqual(record_copy.name, \"Name bis\")\n\n    @with_transaction()\n    def test_one2many(self):\n        'Test copy one2many'\n        pool = Pool()\n        One2many_ = pool.get('test.copy.one2many')\n        One2manyTarget = pool.get('test.copy.one2many.target')\n        One2manyReference = pool.get('test.copy.one2many_reference')\n        One2manyReferenceTarget = \\\n            pool.get('test.copy.one2many_reference.target')\n\n        for One2many, Target in (\n                (One2many_, One2manyTarget),\n                (One2manyReference, One2manyReferenceTarget),\n                ):\n            one2many = One2many(name='Test')\n            one2many.one2many = [\n                Target(name='Target 1'),\n                Target(name='Target 2'),\n                ]\n            one2many.save()\n\n            one2many_copy, = One2many.copy([one2many])\n\n            self.assertNotEqual(one2many, one2many_copy)\n            self.assertEqual(len(one2many.one2many),\n                len(one2many_copy.one2many))\n            self.assertNotEqual(one2many.one2many, one2many_copy.one2many)\n            self.assertEqual([x.name for x in one2many.one2many],\n                [x.name for x in one2many_copy.one2many])\n\n    @with_transaction()\n    def test_one2many_default(self):\n        \"Test copy one2many with default\"\n        pool = Pool()\n        One2many = pool.get('test.copy.one2many')\n        Target = pool.get('test.copy.one2many.target')\n\n        record = One2many(name=\"Test\")\n        record.save()\n        target = Target(name=\"Target\")\n        target.save()\n\n        record_copy, = One2many.copy(\n            [record], default={'one2many': [target.id]})\n\n        self.assertListEqual(\n            [x.name for x in record_copy.one2many], [target.name])\n\n    @with_transaction()\n    def test_one2many_default_nested(self):\n        \"Test copy one2many with default nested\"\n        pool = Pool()\n        One2many = pool.get('test.copy.one2many')\n        Target = pool.get('test.copy.one2many.target')\n\n        record = One2many(name=\"Test\")\n        record.one2many = [Target(name=\"Target\")]\n        record.save()\n\n        record_copy, = One2many.copy(\n            [record], default={'one2many.name': \"New Target\"})\n\n        self.assertListEqual(\n            [x.name for x in record_copy.one2many], [\"New Target\"])\n\n    @with_transaction()\n    def test_many2many(self):\n        'Test copy many2many'\n        pool = Pool()\n        Many2many_ = pool.get('test.copy.many2many')\n        Many2manyTarget = pool.get('test.copy.many2many.target')\n        Many2manyReference = pool.get('test.copy.many2many_reference')\n        Many2manyReferenceTarget = \\\n            pool.get('test.copy.many2many_reference.target')\n\n        for Many2many, Target in (\n                (Many2many_, Many2manyTarget),\n                (Many2manyReference, Many2manyReferenceTarget),\n                ):\n            many2many = Many2many(name='Test')\n            many2many.many2many = [\n                Target(name='Target 1'),\n                Target(name='Target 2'),\n                ]\n            many2many.save()\n\n            many2many_copy, = Many2many.copy([many2many])\n\n            self.assertNotEqual(many2many, many2many_copy)\n            self.assertEqual(len(many2many.many2many),\n                len(many2many_copy.many2many))\n            self.assertEqual(many2many.many2many, many2many_copy.many2many)\n            self.assertEqual([x.name for x in many2many.many2many],\n                [x.name for x in many2many_copy.many2many])\n\n    @with_transaction()\n    def test_many2many_default(self):\n        \"Test copy many2many with default\"\n        pool = Pool()\n        Many2many = pool.get('test.copy.many2many')\n        Target = pool.get('test.copy.many2many.target')\n\n        record = Many2many(name=\"Test\")\n        record.save()\n        target = Target(name=\"Target\")\n        target.save()\n\n        record_copy, = Many2many.copy(\n            [record], default={'many2many': [target.id]})\n\n        self.assertSequenceEqual(record_copy.many2many, [target])\n\n    @with_transaction()\n    def test_binary(self):\n        \"Test copy binary\"\n        pool = Pool()\n        Binary = pool.get('test.copy.binary')\n        record = Binary(binary=fields.Binary.cast(b'data'))\n        record.save()\n\n        record_copy, = Binary.copy([record])\n\n        self.assertEqual(record_copy.binary, record.binary)\n\n    @with_transaction()\n    def test_binary_file_id(self):\n        \"Test copy binary with file_id\"\n        pool = Pool()\n        Binary = pool.get('test.copy.binary')\n        record = Binary(binary_id=fields.Binary.cast(b'data'))\n        record.save()\n\n        record_copy, = Binary.copy([record])\n\n        self.assertEqual(record_copy.file_id, record.file_id)\n        self.assertEqual(record_copy.binary_id, record.binary_id)\n\n    @with_transaction(context={'_check_access': True})\n    def test_no_acccess_copy_with_custom_value(self):\n        \"Test copying field with no access and custom value\"\n        pool = Pool()\n        Field = pool.get('ir.model.field')\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.copy.access')\n\n        record, = TestAccess.create([{'name': 'foo'}])\n\n        field, = Field.search([\n                ('model.model', '=', 'test.copy.access'),\n                ('name', '=', 'name'),\n                ])\n        FieldAccess.create([{\n                    'field': field.id,\n                    'group': None,\n                    'perm_read': True,\n                    'perm_write': False,\n                    }])\n\n        with self.assertRaises(AccessError):\n            new_record, = TestAccess.copy([record])\n\n    @with_transaction(context={'_check_access': True})\n    def test_no_acccess_copy_with_default(self):\n        \"Test copying field with no access but default value\"\n        pool = Pool()\n        Field = pool.get('ir.model.field')\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.copy.access')\n\n        field, = Field.search([\n                ('model.model', '=', 'test.copy.access'),\n                ('name', '=', 'name'),\n                ])\n        FieldAccess.create([{\n                    'field': field.id,\n                    'group': None,\n                    'perm_read': True,\n                    'perm_write': False,\n                    }])\n\n        record, = TestAccess.create([{}])\n        self.assertEqual(record.name, \"Default\")\n        new_record, = TestAccess.copy([record])\n        self.assertEqual(new_record.name, \"Default\")\n\n    @with_transaction(context={'_check_access': True})\n    def test_no_acccess_copy_with_defaults(self):\n        \"Test copying field with no access and defaults\"\n        pool = Pool()\n        Field = pool.get('ir.model.field')\n        FieldAccess = pool.get('ir.model.field.access')\n        TestAccess = pool.get('test.copy.access')\n\n        record, = TestAccess.create([{}])\n\n        field, = Field.search([\n                ('model.model', '=', 'test.copy.access'),\n                ('name', '=', 'name'),\n                ])\n        FieldAccess.create([{\n                    'field': field.id,\n                    'group': None,\n                    'perm_read': True,\n                    'perm_write': False,\n                    }])\n\n        with self.assertRaises(AccessError):\n            new_record, = TestAccess.copy(\n                [record], default={'name': 'nondefault'})\n\n\nclass CopyTranslationTestCase(TranslationTestCase):\n    \"Test copy translation\"\n\n    @with_transaction()\n    def test_copy(self):\n        \"Test copy\"\n        pool = Pool()\n        Translate = pool.get('test.copy.translate')\n\n        with Transaction().set_context(language=self.default_language):\n            record, = Translate.create([{'name': \"Foo\"}])\n        with Transaction().set_context(language=self.other_language):\n            Translate.write([record], {'name': \"Bar\"})\n\n        record_copy, = Translate.copy([record])\n\n        with Transaction().set_context(language=self.default_language):\n            record_copy = Translate(record_copy.id)\n            self.assertEqual(record_copy.name, \"Foo\")\n        with Transaction().set_context(language=self.other_language):\n            record_copy = Translate(record_copy.id)\n            self.assertEqual(record_copy.name, \"Bar\")\n\n    @with_transaction()\n    def test_copy_multiple(self):\n        \"Test copy multiple\"\n        pool = Pool()\n        Translate = pool.get('test.copy.translate')\n\n        with Transaction().set_context(language=self.default_language):\n            record, = Translate.create([{'name': \"Foo\"}])\n        with Transaction().set_context(language=self.other_language):\n            Translate.write([record], {'name': \"Bar\"})\n\n        record_copies = Translate.copy([record, record])\n\n        with Transaction().set_context(language=self.default_language):\n            record_copies = Translate.browse(record_copies)\n            self.assertEqual({r.name for r in record_copies}, {\"Foo\"})\n        with Transaction().set_context(language=self.other_language):\n            record_copies = Translate.browse(record_copies)\n            self.assertEqual({r.name for r in record_copies}, {\"Bar\"})\n"
  },
  {
    "path": "trytond/tests/test_descriptors.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport doctest\n\nfrom trytond.model import descriptors\n\n\ndef load_tests(loader, tests, pattern):\n    tests.addTest(doctest.DocTestSuite(descriptors))\n    return tests\n"
  },
  {
    "path": "trytond/tests/test_exportdata.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport unittest\nfrom decimal import Decimal\n\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass ExportDataTestCase(unittest.TestCase):\n    'Test export_data'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_boolean(self):\n        'Test export_data boolean'\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n\n        export1, = ExportData.create([{\n                    'boolean': True,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export1], ['boolean']), [[True]])\n\n        export2, = ExportData.create([{\n                    'boolean': False,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export2], ['boolean']),\n            [[False]])\n\n        self.assertEqual(\n            ExportData.export_data([export1, export2],\n                ['boolean']),\n            [[True], [False]])\n\n    @with_transaction()\n    def test_integer(self):\n        'Test export_data integer'\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n\n        export1, = ExportData.create([{\n                    'integer': 2,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export1], ['integer']), [[2]])\n\n        export2, = ExportData.create([{\n                    'integer': 0,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export2], ['integer']), [[0]])\n\n        self.assertEqual(\n            ExportData.export_data([export1, export2], ['integer']),\n            [[2], [0]])\n\n    @with_transaction()\n    def test_float(self):\n        'Test export_data float'\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n\n        export1, = ExportData.create([{\n                    'float': 1.1,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export1], ['float']), [[1.1]])\n\n        export2, = ExportData.create([{\n                    'float': 0,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export2], ['float']), [[0]])\n\n        self.assertEqual(\n            ExportData.export_data([export1, export2], ['float']),\n            [[1.1], [0]])\n\n    @with_transaction()\n    def test_numeric(self):\n        'Test export_data numeric'\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n\n        export1, = ExportData.create([{\n                    'numeric': Decimal('1.1'),\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export1], ['numeric']),\n            [[Decimal('1.1')]])\n\n        export2, = ExportData.create([{\n                    'numeric': Decimal('0'),\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export2], ['numeric']),\n            [[Decimal('0')]])\n\n        self.assertEqual(\n            ExportData.export_data([export1, export2], ['numeric']),\n            [[Decimal('1.1')], [Decimal('0')]])\n\n    @with_transaction()\n    def test_char(self):\n        'Test export_data char'\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n\n        export1, = ExportData.create([{\n                    'char': 'test',\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export1], ['char']), [['test']])\n\n        export2, = ExportData.create([{\n                    'char': None,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export2], ['char']), [['']])\n\n        self.assertEqual(\n            ExportData.export_data([export1, export2], ['char']),\n            [['test'], ['']])\n\n    @with_transaction()\n    def test_text(self):\n        'Test export_data text'\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n\n        export1, = ExportData.create([{\n                    'text': 'test',\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export1], ['text']), [['test']])\n\n        export2, = ExportData.create([{\n                    'text': None,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export2], ['text']), [['']])\n\n        self.assertEqual(\n            ExportData.export_data([export1, export2], ['text']),\n            [['test'], ['']])\n\n    @with_transaction()\n    def test_date(self):\n        'Test export_data date'\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n\n        export1, = ExportData.create([{\n                    'date': datetime.date(2010, 1, 1),\n                    }])\n        self.assertTrue(ExportData.export_data([export1],\n            ['date']) == [[datetime.date(2010, 1, 1)]])\n\n        export2, = ExportData.create([{\n                    'date': None,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export2], ['date']), [['']])\n\n        self.assertEqual(\n            ExportData.export_data([export1, export2], ['date']),\n            [[datetime.date(2010, 1, 1)], ['']])\n\n    @with_transaction()\n    def test_datetime(self):\n        'Test export_data datetime'\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n\n        export1, = ExportData.create([{\n                    'datetime': datetime.datetime(2010, 1, 1, 12, 0, 0),\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export1], ['datetime']),\n            [[datetime.datetime(2010, 1, 1, 12, 0, 0)]])\n\n        export2, = ExportData.create([{\n                    'datetime': None,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export2], ['datetime']),\n            [['']])\n\n        self.assertEqual(\n            ExportData.export_data([export1, export2], ['datetime']),\n            [[datetime.datetime(2010, 1, 1, 12, 0, 0)], ['']])\n\n    @with_transaction()\n    def test_timedelta(self):\n        'Test export_data timedelta'\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n\n        export1, = ExportData.create([{\n                    'timedelta': datetime.timedelta(\n                        hours=1, minutes=20, seconds=30.45),\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export1], ['timedelta']),\n            [[datetime.timedelta(hours=1, minutes=20, seconds=30.45)]])\n\n        export2, = ExportData.create([{\n                    'timedelta': None,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export2], ['timedelta']),\n            [['']])\n\n        self.assertEqual(\n            ExportData.export_data([export1, export2], ['timedelta']), [\n                [datetime.timedelta(hours=1, minutes=20, seconds=30.45)],\n                [''],\n                ])\n\n    @with_transaction()\n    def test_selection(self):\n        'Test export_data selection'\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n\n        export1, = ExportData.create([{\n                    'selection': 'select1',\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export1], ['selection',\n                    'selection.translated']),\n            [['select1', 'Select 1']])\n\n        export2, = ExportData.create([{\n                    'selection': None,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export2], ['selection']), [['']])\n\n        self.assertEqual(\n            ExportData.export_data([export1, export2],\n                ['selection']),\n            [['select1'], ['']])\n\n    @with_transaction()\n    def test_many2one(self):\n        'Test export_data many2one'\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n        ExportDataTarget = pool.get('test.export_data.target')\n\n        target, = ExportDataTarget.create([{\n                    'name': 'Target Test',\n                    }])\n        export1, = ExportData.create([{\n                    'many2one': target.id,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export1], ['many2one/name']),\n            [['Target Test']])\n\n        export2, = ExportData.create([{\n                'many2one': None,\n                }])\n        self.assertEqual(\n            ExportData.export_data([export2], ['many2one/name']),\n            [['']])\n\n        self.assertEqual(\n            ExportData.export_data([export1, export2],\n                ['many2one/name']),\n            [['Target Test'], ['']])\n\n    @with_transaction()\n    def test_many2many(self):\n        'Test export_data many2many'\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n        ExportDataTarget = pool.get('test.export_data.target')\n\n        target1, = ExportDataTarget.create([{\n                    'name': 'Target 1',\n                    }])\n        export1, = ExportData.create([{\n                    'many2many': [('add', [target1])],\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export1], ['many2many/name']),\n            [['Target 1']])\n\n        target2, = ExportDataTarget.create([{\n                    'name': 'Target 2',\n                    }])\n        ExportData.write([export1], {\n                'many2many': [('add', [target1.id, target2.id])],\n                })\n        self.assertEqual(\n            ExportData.export_data([export1], ['id',\n                    'many2many/name']),\n            [[export1.id, 'Target 1'], ['', 'Target 2']])\n\n        export2, = ExportData.create([{\n                    'many2many': None,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export2], ['many2many/name']),\n            [['']])\n\n        self.assertEqual(\n            ExportData.export_data([export1, export2],\n                ['id', 'many2many/name']),\n            [[export1.id, 'Target 1'], ['', 'Target 2'], [export2.id, '']])\n\n    @with_transaction()\n    def test_one2many(self):\n        'Test export_data one2many'\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n        ExportDataTarget = pool.get('test.export_data.target')\n\n        export1, = ExportData.create([{}])\n        ExportDataTarget.create([{\n                    'name': 'Target 1',\n                    'one2many': export1.id,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export1], ['one2many/name']),\n            [['Target 1']])\n\n        ExportDataTarget.create([{\n                    'name': 'Target 2',\n                    'one2many': export1.id,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export1],\n                ['id', 'one2many/name']),\n            [[export1.id, 'Target 1'], ['', 'Target 2']])\n\n        export2, = ExportData.create([{}])\n        self.assertEqual(\n            ExportData.export_data([export2], ['one2many/name']),\n            [['']])\n\n        self.assertEqual(\n            ExportData.export_data([export1, export2], ['id',\n                    'one2many/name']),\n            [[export1.id, 'Target 1'], ['', 'Target 2'], [export2.id, '']])\n\n    @with_transaction()\n    def test_reference(self):\n        'Test export_data reference'\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n        ExportDataTarget = pool.get('test.export_data.target')\n\n        target1, = ExportDataTarget.create([{'name': \"Target test\"}])\n        export1, = ExportData.create([{\n                    'reference': str(target1),\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export1], ['reference']),\n            [[str(target1)]])\n\n        export2, = ExportData.create([{\n                    'reference': None,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export2], ['reference']), [['']])\n\n        self.assertEqual(\n            ExportData.export_data([export1, export2],\n                ['reference']),\n            [[str(target1)], ['']])\n\n        self.assertEqual(\n            ExportData.export_data([export1], ['reference/rec_name']),\n            [[target1.rec_name]])\n\n        self.assertEqual(\n            ExportData.export_data([export1], ['reference.translated']),\n            [[\"Target\"]])\n\n    @with_transaction()\n    def test_domain(self):\n        \"Test export data with domain\"\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n\n        ExportData.create([{\n                    'boolean': True,\n                    }, {\n                    'boolean': False,\n                    }])\n\n        self.assertEqual(\n            ExportData.export_data_domain(\n                [('boolean', '=', True)], ['boolean']),\n            [[True]])\n\n    @with_transaction()\n    def test_header(self):\n        \"Test export data with header\"\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n\n        export1, = ExportData.create([{\n                    'char': \"Test\",\n                    'integer': 2,\n                    }])\n        self.assertEqual(\n            ExportData.export_data([export1], ['char', 'integer'], True),\n            [[\"Char\", \"Integer\"], [\"Test\", 2]])\n\n    @with_transaction()\n    def test_nested_header(self):\n        \"Test export data with header and nested fields\"\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n\n        fields_names = [\n            'many2one/name', 'many2one/rec_name', 'selection',\n            'selection.translated', 'reference.translated',\n            'reference/rec_name']\n        self.assertEqual(\n            ExportData.export_data([], fields_names, True),\n            [[\"Many2One/Name\", \"Many2One/Record Name\", \"Selection\",\n                \"Selection (string)\", \"Reference (model name)\",\n                \"Reference/Record Name\"]])\n\n    @with_transaction()\n    def test_header_domain(self):\n        \"Test export data with header and domain\"\n        pool = Pool()\n        ExportData = pool.get('test.export_data')\n        ExportData.create([{\n                    'boolean': True,\n                    }, {\n                    'boolean': False,\n                    }])\n\n        self.assertEqual(\n            ExportData.export_data_domain(\n                [('boolean', '=', True)], ['boolean'], header=True),\n            [[\"Boolean\"], [True]])\n"
  },
  {
    "path": "trytond/tests/test_field_binary.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport shutil\nimport tempfile\nimport unittest\n\nfrom sql import Literal\n\nfrom trytond.config import config\nfrom trytond.model import fields\nfrom trytond.model.exceptions import RequiredValidationError\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\ncast = fields.Binary.cast\n\n\nclass FieldBinaryTestCase(unittest.TestCase):\n    \"Test Field Binary\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    def setUp(self):\n        path = config.get('database', 'path')\n        dtemp = tempfile.mkdtemp()\n        config.set('database', 'path', dtemp)\n        self.addCleanup(config.set, 'database', 'path', path)\n        self.addCleanup(shutil.rmtree, dtemp)\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create binary\"\n        Binary = Pool().get('test.binary')\n\n        binary, = Binary.create([{\n                    'binary': cast(b'foo'),\n                    }])\n\n        self.assertEqual(binary.binary, cast(b'foo'))\n\n    @with_transaction()\n    def test_create_without_default(self):\n        \"Test create binary without default\"\n        Binary = Pool().get('test.binary')\n\n        binary, = Binary.create([{}])\n\n        self.assertEqual(binary.binary, None)\n\n    @with_transaction()\n    def test_create_with_default(self):\n        \"Test create binary with default\"\n        Binary = Pool().get('test.binary_default')\n\n        binary, = Binary.create([{}])\n\n        self.assertEqual(binary.binary, cast(b'default'))\n\n    @with_transaction()\n    def test_create_required_without_value(self):\n        \"Test create binary without value\"\n        Binary = Pool().get('test.binary_required')\n\n        with self.assertRaises(RequiredValidationError):\n            binary, = Binary.create([{}])\n\n    @with_transaction()\n    def test_create_required_with_value(self):\n        \"Test create binary with default\"\n        Binary = Pool().get('test.binary_default')\n\n        binary, = Binary.create([{\n                    'binary': cast(b'baz'),\n                    }])\n\n        self.assertEqual(binary.binary, cast(b'baz'))\n\n    @with_transaction()\n    def test_create_required_with_empty(self):\n        \"Test create binary with empty\"\n        Binary = Pool().get('test.binary_required')\n\n        with self.assertRaises(RequiredValidationError):\n            binary, = Binary.create([{\n                        'binary': cast(b''),\n                        }])\n\n    @with_transaction()\n    def test_create_filestorage(self):\n        \"Test create binary with filestorage\"\n        Binary = Pool().get('test.binary_filestorage')\n\n        binary, = Binary.create([{\n                    'binary': cast(b'foo'),\n                    }])\n\n        self.assertEqual(binary.binary, cast(b'foo'))\n        self.assertTrue(binary.binary_id)\n\n    @with_transaction()\n    def test_create_empty_filestorage(self):\n        \"Test create binary empty with filestorage\"\n        Binary = Pool().get('test.binary_filestorage')\n\n        binary, = Binary.create([{\n                    'binary': None,\n                    }])\n\n        self.assertEqual(binary.binary, None)\n        self.assertEqual(binary.binary_id, None)\n\n    @with_transaction()\n    def test_create_with_sql_value(self):\n        \"Test create binary with SQL value\"\n        Binary = Pool().get('test.binary')\n\n        binary, = Binary.create([{\n                    'binary': Literal('foo'),\n                    }])\n\n        self.assertEqual(binary.binary, cast(b'foo'))\n\n    @with_transaction()\n    def test_set_sql_value(self):\n        \"Test cannot set SQL value\"\n        Binary = Pool().get('test.binary')\n\n        binary = Binary()\n\n        with self.assertRaises(ValueError):\n            binary.binary = Literal('foo')\n\n    @with_transaction()\n    def test_read_size(self):\n        \"Test read binary size\"\n        Binary = Pool().get('test.binary')\n        binary, = Binary.create([{\n                    'binary': cast(b'foo'),\n                    }])\n\n        with Transaction().set_context({'test.binary.binary': 'size'}):\n            binary = Binary(binary.id)\n\n        self.assertEqual(binary.binary, len(b'bar'))\n\n    @with_transaction()\n    def test_read_size_filestorage(self):\n        \"Test read binary size with filestorage\"\n        Binary = Pool().get('test.binary_filestorage')\n        binary, = Binary.create([{\n                    'binary': cast(b'foo'),\n                    }])\n\n        with Transaction().set_context(\n                {'test.binary_filestorage.binary': 'size'}):\n            binary = Binary(binary.id)\n\n        self.assertEqual(binary.binary, len(b'bar'))\n\n    @with_transaction()\n    def test_write(self):\n        \"Test write binary\"\n        Binary = Pool().get('test.binary')\n        binary, = Binary.create([{\n                    'binary': cast(b'foo'),\n                    }])\n\n        Binary.write([binary], {\n                'binary': cast(b'bar'),\n                })\n\n        self.assertEqual(binary.binary, cast(b'bar'))\n\n    @with_transaction()\n    def test_write_filestorage(self):\n        \"Test write binary with filestorage\"\n        Binary = Pool().get('test.binary_filestorage')\n        binary, = Binary.create([{\n                    'binary': cast(b'foo'),\n                    }])\n\n        Binary.write([binary], {\n                'binary': cast(b'bar'),\n                })\n\n        self.assertEqual(binary.binary, cast(b'bar'))\n\n    @with_transaction()\n    def test_write_empty_filestorage(self):\n        \"Test write binary empty with filestorage\"\n        Binary = Pool().get('test.binary_filestorage')\n        binary, = Binary.create([{\n                    'binary': cast(b'foo'),\n                    }])\n\n        Binary.write([binary], {\n                'binary': None,\n                })\n\n        self.assertEqual(binary.binary, None)\n        self.assertEqual(binary.binary_id, None)\n"
  },
  {
    "path": "trytond/tests/test_field_boolean.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom sql import Literal\n\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass FieldBooleanTestCase(unittest.TestCase):\n    \"Test Field Boolean\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create boolean\"\n        Boolean = Pool().get('test.boolean')\n\n        boolean_true, boolean_false, boolean_none = Boolean.create([{\n                    'boolean': True,\n                    }, {\n                    'boolean': False,\n                    }, {\n                    'boolean': None,\n                    }])\n\n        self.assertEqual(boolean_true.boolean, True)\n        self.assertEqual(boolean_false.boolean, False)\n        self.assertEqual(boolean_none.boolean, None)\n\n    @with_transaction()\n    def test_create_without_default(self):\n        \"Test create boolean without default\"\n        Boolean = Pool().get('test.boolean')\n\n        boolean, = Boolean.create([{}])\n\n        self.assertEqual(boolean.boolean, False)\n\n    @with_transaction()\n    def test_create_with_default(self):\n        \"Test create boolean with default\"\n        Boolean = Pool().get('test.boolean_default')\n\n        boolean, = Boolean.create([{}])\n\n        self.assertEqual(boolean.boolean, True)\n\n    @with_transaction()\n    def test_create_with_sql_value(self):\n        \"Test create boolean with SQL value\"\n        Boolean = Pool().get('test.boolean')\n\n        boolean, = Boolean.create([{'boolean': Literal(True)}])\n\n        self.assertEqual(boolean.boolean, True)\n\n    @with_transaction()\n    def test_set_sql_value(self):\n        \"Test cannot set SQL value\"\n        Boolean = Pool().get('test.boolean')\n\n        boolean = Boolean()\n\n        with self.assertRaises(ValueError):\n            boolean.boolean = Literal(True)\n\n    @with_transaction()\n    def test_search_equals_true(self):\n        \"Test search boolean equals True\"\n        Boolean = Pool().get('test.boolean')\n        boolean1, boolean2 = Boolean.create([{\n                    'boolean': True,\n                    }, {\n                    'boolean': False,\n                    }])\n\n        booleans = Boolean.search([\n                ('boolean', '=', True),\n                ])\n\n        self.assertListEqual(booleans, [boolean1])\n\n    @with_transaction()\n    def test_search_equals_false(self):\n        \"Test search boolean equals False\"\n        Boolean = Pool().get('test.boolean')\n        boolean1, boolean2 = Boolean.create([{\n                    'boolean': True,\n                    }, {\n                    'boolean': False,\n                    }])\n\n        booleans = Boolean.search([\n                ('boolean', '=', False),\n                ])\n\n        self.assertListEqual(booleans, [boolean2])\n\n    @with_transaction()\n    def test_search_non_equals(self):\n        \"Test search boolean non equals\"\n        Boolean = Pool().get('test.boolean')\n        boolean, = Boolean.create([{\n                    'boolean': True,\n                    }])\n\n        booleans = Boolean.search([\n                ('boolean', '!=', True),\n                ])\n        self.assertListEqual(booleans, [])\n\n    @with_transaction()\n    def test_search_in_true(self):\n        \"Test search boolean in [True]\"\n        Boolean = Pool().get('test.boolean')\n        boolean, = Boolean.create([{\n                    'boolean': True,\n                    }])\n\n        booleans = Boolean.search([\n                ('boolean', 'in', [True]),\n                ])\n\n        self.assertListEqual(booleans, [boolean])\n\n    @with_transaction()\n    def test_search_in_false(self):\n        \"Test search boolean in [False]\"\n        Boolean = Pool().get('test.boolean')\n        boolean, = Boolean.create([{\n                    'boolean': True,\n                    }])\n\n        booleans = Boolean.search([\n                ('boolean', 'in', [False]),\n                ])\n\n        self.assertListEqual(booleans, [])\n\n    @with_transaction()\n    def test_search_not_in_true(self):\n        \"Test search boolean not in [True]\"\n        Boolean = Pool().get('test.boolean')\n        boolean, = Boolean.create([{\n                    'boolean': True,\n                    }])\n\n        booleans = Boolean.search([\n                ('boolean', 'not in', [True]),\n                ])\n\n        self.assertListEqual(booleans, [])\n\n    @with_transaction()\n    def test_search_not_in_false(self):\n        \"Test search boolean not in [False]\"\n        Boolean = Pool().get('test.boolean')\n        boolean, = Boolean.create([{\n                    'boolean': True,\n                    }])\n\n        booleans = Boolean.search([\n                ('boolean', 'not in', [False]),\n                ])\n\n        self.assertListEqual(booleans, [boolean])\n\n    @with_transaction()\n    def test_search_in_true_false(self):\n        \"Test search boolean in [True, False]\"\n        Boolean = Pool().get('test.boolean')\n        boolean1, boolean2 = Boolean.create([{\n                    'boolean': True,\n                    }, {\n                    'boolean': False,\n                    }])\n\n        booleans = Boolean.search([\n                ('boolean', 'in', [True, False]),\n                ])\n\n        self.assertListEqual(booleans, [boolean1, boolean2])\n\n    @with_transaction()\n    def test_search_not_in_true_false(self):\n        \"Test search boolean not in [True, False]\"\n        Boolean = Pool().get('test.boolean')\n        boolean1, boolean2 = Boolean.create([{\n                    'boolean': True,\n                    }, {\n                    'boolean': False,\n                    }])\n\n        booleans = Boolean.search([\n                ('boolean', 'not in', [True, False]),\n                ])\n\n        self.assertListEqual(booleans, [])\n\n    @with_transaction()\n    def test_search_equals_false_with_none(self):\n        \"Test search boolean equals False with None\"\n        Boolean = Pool().get('test.boolean')\n        boolean, = Boolean.create([{\n                    'boolean': None,\n                    }])\n\n        booleans = Boolean.search([\n                ('boolean', '=', False),\n                ])\n        self.assertListEqual(booleans, [boolean])\n\n    @with_transaction()\n    def test_search_non_equals_false_with_none(self):\n        \"Test search boolean non equals False with None\"\n        Boolean = Pool().get('test.boolean')\n        boolean, = Boolean.create([{\n                    'boolean': None,\n                    }])\n\n        booleans = Boolean.search([\n                ('boolean', '!=', False),\n                ])\n        self.assertListEqual(booleans, [])\n\n    @with_transaction()\n    def test_write_false(self):\n        \"Test write boolean False\"\n        Boolean = Pool().get('test.boolean')\n        boolean, = Boolean.create([{\n                    'boolean': True,\n                    }])\n\n        Boolean.write([boolean], {\n                'boolean': False,\n                })\n\n        self.assertEqual(boolean.boolean, False)\n\n    @with_transaction()\n    def test_write_true(self):\n        \"Test write boolean True\"\n        Boolean = Pool().get('test.boolean')\n        boolean, = Boolean.create([{\n                    'boolean': False,\n                    }])\n\n        Boolean.write([boolean], {\n                'boolean': True,\n                })\n\n        self.assertEqual(boolean.boolean, True)\n"
  },
  {
    "path": "trytond/tests/test_field_char.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom sql import Literal\n\nfrom trytond import backend\nfrom trytond.model.exceptions import (\n    ForbiddenCharValidationError, RequiredValidationError, SizeValidationError)\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import (\n    ExtensionTestCase, activate_module, with_transaction)\nfrom trytond.transaction import Transaction\n\n\nclass CommonTestCaseMixin:\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create char\"\n        Char = self.Char()\n\n        char, char_none = Char.create([{\n                    'char': \"Test\",\n                    }, {\n                    'char': None,\n                    }])\n\n        self.assertEqual(char.char, \"Test\")\n        self.assertEqual(char_none.char, None)\n\n    @with_transaction()\n    def test_create_unicode(self):\n        \"Test create unicode\"\n        Char = self.Char()\n\n        char, = Char.create([{\n                    'char': \"é\",\n                    }])\n\n        self.assertEqual(char.char, \"é\")\n\n    @with_transaction()\n    def test_search_equals(self):\n        \"Test search char equals\"\n        Char = self.Char()\n        char, = Char.create([{\n                    'char': \"Foo\",\n                    }])\n\n        chars_foo = Char.search([\n                ('char', '=', \"Foo\"),\n                ])\n        chars_bar = Char.search([\n                ('char', '=', \"Bar\"),\n                ])\n\n        self.assertListEqual(chars_foo, [char])\n        self.assertListEqual(chars_bar, [])\n\n    @with_transaction()\n    def test_search_equals_none(self):\n        \"Test search char equals None\"\n        Char = self.Char()\n        char, = Char.create([{\n                    'char': None,\n                    }])\n\n        chars = Char.search([\n                ('char', '=', None),\n                ])\n\n        self.assertListEqual(chars, [char])\n\n    @with_transaction()\n    def test_search_equals_unicode(self):\n        \"Test search char equals unicode\"\n        Char = self.Char()\n        char, = Char.create([{\n                    'char': \"é\",\n                    }])\n\n        chars = Char.search([\n                ('char', '=', \"é\"),\n                ])\n\n        self.assertListEqual(chars, [char])\n\n    @with_transaction()\n    def test_search_equals_non_unicode(self):\n        \"Test search char equals non unicode\"\n        Char = self.Char()\n        char, = Char.create([{\n                    'char': \"é\",\n                    }])\n\n        chars = Char.search([\n                ('char', '=', \"é\"),\n                ])\n\n        self.assertListEqual(chars, [char])\n\n    @with_transaction()\n    def test_search_non_equals(self):\n        \"Test search char non equals\"\n        Char = self.Char()\n        char, = Char.create([{\n                    'char': \"Foo\",\n                    }])\n\n        chars_foo = Char.search([\n                ('char', '!=', \"Foo\"),\n                ])\n        chars_bar = Char.search([\n                ('char', '!=', \"Bar\"),\n                ])\n\n        self.assertListEqual(chars_foo, [])\n        self.assertListEqual(chars_bar, [char])\n\n    @with_transaction()\n    def test_search_non_equals_none(self):\n        \"Test search char non equals None\"\n        Char = self.Char()\n        char, = Char.create([{\n                    'char': None,\n                    }])\n\n        chars = Char.search([\n                ('char', '!=', None),\n                ])\n\n        self.assertListEqual(chars, [])\n\n    @with_transaction()\n    def test_search_in(self):\n        \"Test search char in\"\n        Char = self.Char()\n        char, = Char.create([{\n                    'char': \"Foo\",\n                    }])\n\n        chars_foo = Char.search([\n                ('char', 'in', [\"Foo\"]),\n                ])\n        chars_bar = Char.search([\n                ('char', 'in', [\"Bar\"]),\n                ])\n        chars_empty = Char.search([\n                ('char', 'in', []),\n                ])\n\n        self.assertListEqual(chars_foo, [char])\n        self.assertListEqual(chars_bar, [])\n        self.assertListEqual(chars_empty, [])\n\n    @with_transaction()\n    def test_search_in_none(self):\n        \"Test search char in [None]\"\n        Char = self.Char()\n        char, = Char.create([{\n                    'char': None,\n                    }])\n\n        chars = Char.search([\n                ('char', 'in', [None]),\n                ])\n\n        self.assertListEqual(chars, [char])\n\n    @with_transaction()\n    def test_search_not_in(self):\n        \"Test search char not in\"\n        Char = self.Char()\n        char, = Char.create([{\n                    'char': \"Foo\",\n                    }])\n\n        chars_foo = Char.search([\n                ('char', 'not in', [\"Foo\"]),\n                ])\n        chars_bar = Char.search([\n                ('char', 'not in', [\"Bar\"]),\n                ])\n        chars_empty = Char.search([\n                ('char', 'not in', []),\n                ])\n\n        self.assertListEqual(chars_foo, [])\n        self.assertListEqual(chars_bar, [char])\n        self.assertListEqual(chars_empty, [char])\n\n    @with_transaction()\n    def test_search_not_in_none(self):\n        \"Test search char not in [None]\"\n        Char = self.Char()\n        char, = Char.create([{\n                    'char': None,\n                    }])\n\n        chars = Char.search([\n                ('char', 'not in', [None]),\n                ])\n\n        self.assertListEqual(chars, [])\n\n    @with_transaction()\n    def test_search_like(self):\n        \"Test search char like\"\n        Char = self.Char()\n        char, = Char.create([{\n                    'char': \"Bar\",\n                    }])\n\n        chars_bar = Char.search([\n                ('char', 'like', \"Bar\"),\n                ])\n        chars_b = Char.search([\n                ('char', 'like', \"B%\"),\n                ])\n        chars_foo = Char.search([\n                ('char', 'like', \"Foo\"),\n                ])\n        chars_f = Char.search([\n                ('char', 'like', \"F%\"),\n                ])\n\n        self.assertListEqual(chars_bar, [char])\n        self.assertListEqual(chars_b, [char])\n        self.assertListEqual(chars_foo, [])\n        self.assertListEqual(chars_f, [])\n\n    @with_transaction()\n    def test_search_ilike(self):\n        \"Test search char ilike\"\n        Char = self.Char()\n        char, = Char.create([{\n                    'char': \"Bar\",\n                    }])\n\n        chars_bar = Char.search([\n                ('char', 'ilike', \"bar\"),\n                ])\n        chars_b = Char.search([\n                ('char', 'ilike', \"b%\"),\n                ])\n        chars_foo = Char.search([\n                ('char', 'ilike', \"foo\"),\n                ])\n        chars_f = Char.search([\n                ('char', 'ilike', \"f%\"),\n                ])\n\n        self.assertListEqual(chars_bar, [char])\n        self.assertListEqual(chars_b, [char])\n        self.assertListEqual(chars_foo, [])\n        self.assertListEqual(chars_f, [])\n\n    @with_transaction()\n    def test_search_not_like(self):\n        \"Test search char not like\"\n        Char = self.Char()\n        char, = Char.create([{\n                    'char': \"Bar\",\n                    }])\n\n        chars_bar = Char.search([\n                ('char', 'not like', \"Bar\"),\n                ])\n        chars_b = Char.search([\n                ('char', 'not like', \"B%\"),\n                ])\n        chars_foo = Char.search([\n                ('char', 'not like', \"Foo\"),\n                ])\n        chars_f = Char.search([\n                ('char', 'not like', \"F%\"),\n                ])\n\n        self.assertListEqual(chars_bar, [])\n        self.assertListEqual(chars_b, [])\n        self.assertListEqual(chars_foo, [char])\n        self.assertListEqual(chars_f, [char])\n\n    @with_transaction()\n    def test_search_not_ilike(self):\n        \"Test search char not like\"\n        Char = self.Char()\n        char, = Char.create([{\n                    'char': \"Bar\",\n                    }])\n\n        chars_bar = Char.search([\n                ('char', 'not ilike', \"bar\"),\n                ])\n        chars_b = Char.search([\n                ('char', 'not ilike', \"b%\"),\n                ])\n        chars_foo = Char.search([\n                ('char', 'not ilike', \"foo\"),\n                ])\n        chars_f = Char.search([\n                ('char', 'not ilike', \"f%\"),\n                ])\n\n        self.assertListEqual(chars_bar, [])\n        self.assertListEqual(chars_b, [])\n        self.assertListEqual(chars_foo, [char])\n        self.assertListEqual(chars_f, [char])\n\n    @with_transaction()\n    def test_write_unicode(self):\n        \"Test write char unicode\"\n        Char = self.Char()\n        char, = Char.create([{\n                    'char': \"Foo\",\n                    }])\n\n        Char.write([char], {\n                'char': \"é\",\n                })\n\n        self.assertEqual(char.char, \"é\")\n\n    @with_transaction()\n    def test_create_strip(self):\n        \"Test create with stripping\"\n        Char = self.Char()\n\n        char, = Char.create([{\n                    'char': \" Foo \",\n                    'char_lstripped': \" Foo \",\n                    'char_rstripped': \" Foo \",\n                    'char_unstripped': \" Foo \",\n                    }])\n\n        read_record = Char(char.id)\n        self.assertEqual(read_record.char, \"Foo\")\n        self.assertEqual(read_record.char_lstripped, \"Foo \")\n        self.assertEqual(read_record.char_rstripped, \" Foo\")\n        self.assertEqual(read_record.char_unstripped, \" Foo \")\n\n    @with_transaction()\n    def test_write_strip(self):\n        \"Test write with stripping\"\n        Char = self.Char()\n\n        char, = Char.create([{\n                    'char': \"Foo\",\n                    'char_lstripped': \"Foo\",\n                    'char_rstripped': \"Foo\",\n                    'char_unstripped': \"Foo\",\n                    }])\n\n        Char.write([char], {\n                'char': \" Bar \",\n                'char_lstripped': \" Bar \",\n                'char_rstripped': \" Bar \",\n                'char_unstripped': \" Bar \",\n                })\n        read_record = Char(char.id)\n        self.assertEqual(read_record.char, \"Bar\")\n        self.assertEqual(read_record.char_lstripped, \"Bar \")\n        self.assertEqual(read_record.char_rstripped, \" Bar\")\n        self.assertEqual(read_record.char_unstripped, \" Bar \")\n\n    @with_transaction()\n    def test_set_strip(self):\n        \"Test set with stripping\"\n        Char = self.Char()\n\n        char = Char()\n\n        char.char = \" Foo \"\n        char.char_lstripped = \" Foo \"\n        char.char_rstripped = \" Foo \"\n        char.char_unstripped = \" Foo \"\n        self.assertEqual(char.char, \"Foo\")\n        self.assertEqual(char.char_lstripped, \"Foo \")\n        self.assertEqual(char.char_rstripped, \" Foo\")\n        self.assertEqual(char.char_unstripped, \" Foo \")\n\n\nclass FieldCharTestCase(unittest.TestCase, CommonTestCaseMixin):\n    \"Test Field Char\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    def Char(self):\n        return Pool().get('test.char')\n\n    @with_transaction()\n    def test_create_with_sql_value(self):\n        \"Test create with SQL value\"\n        Char = self.Char()\n\n        char, = Char.create([{'char': Literal('Foo')}])\n\n        self.assertEqual(char.char, \"Foo\")\n\n    @with_transaction()\n    def test_set_sql_value(self):\n        \"Test cannot set SQL value\"\n        Char = self.Char()\n\n        char = Char()\n\n        with self.assertRaises(ValueError):\n            char.char = Literal('Foo')\n\n    @with_transaction()\n    def test_create_without_default(self):\n        \"Test create char without default\"\n        Char = Pool().get('test.char')\n\n        char, = Char.create([{}])\n\n        self.assertEqual(char.char, None)\n\n    @with_transaction()\n    def test_create_with_default(self):\n        \"Test create char without default\"\n        Char = Pool().get('test.char_default')\n\n        char, = Char.create([{}])\n\n        self.assertEqual(char.char, \"Test\")\n\n    @with_transaction()\n    def test_create_required_with_value(self):\n        \"Test create char required with value\"\n        Char = Pool().get('test.char_required')\n\n        char, = Char.create([{\n                    'char': \"Test\",\n                    }])\n\n        self.assertEqual(char.char, \"Test\")\n\n    @with_transaction()\n    def test_create_required_without_value(self):\n        \"Test create char required without value\"\n        Char = Pool().get('test.char_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Char.create([{}])\n\n    @with_transaction()\n    def test_create_required_with_empty(self):\n        \"Test create char required with empty\"\n        Char = Pool().get('test.char_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Char.create([{\n                        'char': '',\n                        }])\n\n    @with_transaction()\n    def test_create_size_valid(self):\n        \"Test create char with size\"\n        Char = Pool().get('test.char_size')\n\n        char, = Char.create([{\n                    'char': \"Test\",\n                    }])\n\n        self.assertEqual(char.char, \"Test\")\n\n    @with_transaction()\n    def test_create_size_invalid(self):\n        \"Test create char with invalid size\"\n        Char = Pool().get('test.char_size')\n\n        with self.assertRaises(SizeValidationError):\n            Char.create([{\n                        'char': \"foobar\",\n                        }])\n\n    @with_transaction()\n    def test_create_size_pyson_valid(self):\n        \"Test create char with PYSON size\"\n        Char = Pool().get('test.char_size_pyson')\n\n        char, = Char.create([{\n                    'char': \"Test\",\n                    'size': 5,\n                    }])\n\n        self.assertEqual(char.char, \"Test\")\n\n    @with_transaction()\n    def test_create_size_pyson_invalid(self):\n        \"Test create char with invalid PYSON size\"\n        Char = Pool().get('test.char_size_pyson')\n\n        with self.assertRaises(SizeValidationError):\n            Char.create([{\n                        'char': \"foobar\",\n                        'size': 5,\n                        }])\n\n    @with_transaction()\n    def test_create_size_pyson_none(self):\n        \"Test create char with PYSON size as None\"\n        pool = Pool()\n        Char = pool.get('test.char_size_pyson')\n\n        char, = Char.create([{\n                    'char': \"foo\",\n                    'size': None,\n                    }])\n\n    @with_transaction()\n    def test_create_invalid_char(self):\n        \"Test create char with invalid char\"\n        Char = Pool().get('test.char')\n\n        with self.assertRaises(ForbiddenCharValidationError):\n            Char.create([{\n                        'char': \"foo\\nbar\",\n                        }])\n\n    @with_transaction()\n    def test_write(self):\n        \"Test write char\"\n        Char = Pool().get('test.char')\n        char, = Char.create([{\n                    'char': \"Foo\",\n                    }])\n\n        Char.write([char], {\n                'char': \"Bar\",\n                })\n\n        self.assertEqual(char.char, \"Bar\")\n\n    @with_transaction()\n    def test_write_none(self):\n        \"Test write char None\"\n        Char = Pool().get('test.char')\n        char, = Char.create([{\n                    'char': \"Foo\",\n                    }])\n\n        Char.write([char], {\n                'char': None,\n                })\n\n        self.assertEqual(char.char, None)\n\n    @with_transaction()\n    def test_write_size_invalid(self):\n        \"Test write char with invalid size\"\n        Char = Pool().get('test.char_size')\n\n        char, = Char.create([{\n                    'char': \"Test\",\n                    }])\n\n        with self.assertRaises(SizeValidationError):\n            Char.write([char], {\n                    'char': 'foobar',\n                    })\n\n    @with_transaction()\n    def test_create_strip_with_sql_value(self):\n        \"Test create with stripping with SQL value\"\n        Char = self.Char()\n\n        char, = Char.create([{\n                    'char': Literal(\" Foo \"),\n                    'char_lstripped': Literal(\" Foo \"),\n                    'char_rstripped': Literal(\" Foo \"),\n                    'char_unstripped': Literal(\" Foo \"),\n                    }])\n\n        read_record = Char(char.id)\n        self.assertEqual(read_record.char, \"Foo\")\n        self.assertEqual(read_record.char_lstripped, \"Foo \")\n        self.assertEqual(read_record.char_rstripped, \" Foo\")\n        self.assertEqual(read_record.char_unstripped, \" Foo \")\n\n    @with_transaction()\n    def test_write_strip_with_sql_value(self):\n        \"Test write with stripping with SQL value\"\n        Char = self.Char()\n\n        char, = Char.create([{\n                    'char': \"Foo\",\n                    'char_lstripped': \"Foo\",\n                    'char_rstripped': \"Foo\",\n                    'char_unstripped': \"Foo\",\n                    }])\n\n        Char.write([char], {\n                'char': Literal(\" Bar \"),\n                'char_lstripped': Literal(\" Bar \"),\n                'char_rstripped': Literal(\" Bar \"),\n                'char_unstripped': Literal(\" Bar \"),\n                })\n        read_record = Char(char.id)\n        self.assertEqual(read_record.char, \"Bar\")\n        self.assertEqual(read_record.char_lstripped, \"Bar \")\n        self.assertEqual(read_record.char_rstripped, \" Bar\")\n        self.assertEqual(read_record.char_unstripped, \" Bar \")\n\n\nclass FieldCharTranslatedTestCase(unittest.TestCase, CommonTestCaseMixin):\n    \"Test Field Char Translated\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    def Char(self):\n        return Pool().get('test.char_translate')\n\n    @with_transaction()\n    def test_create_with_sql_value(self):\n        \"Test cannot create with SQL value\"\n        Char = self.Char()\n\n        with self.assertRaises(ValueError):\n            Char.create([{'char': Literal('Foo')}])\n\n    @with_transaction()\n    def test_translation_default_language_cache(self):\n        \"\"\"Test set translation for default language does not fill\n        transactional cache with former value\"\"\"\n        pool = Pool()\n        Config = pool.get('ir.configuration')\n        Char = self.Char()\n\n        with Transaction().set_context(language=Config.get_language()):\n            char, = Char.create([{\n                        'char': \"foo\",\n                        }])\n\n            char.char = \"bar\"\n            char.save()\n\n            self.assertEqual(char.char, \"bar\")\n\n\n@unittest.skipUnless(backend.name == 'postgresql',\n    \"unaccent works only on postgresql\")\nclass FieldCharUnaccentedTestCase(ExtensionTestCase):\n    \"Test Field Char with unaccented searches\"\n    extension = 'unaccent'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n        super().setUpClass()\n\n    @with_transaction()\n    def test_normal_search(self):\n        \"Test searches without the unaccented feature\"\n        Char = Pool().get('test.char_unaccented_off')\n        char, = Char.create([{\n                    'char': 'Stéphanie',\n                    }])\n\n        chars_stephanie = Char.search([\n                ('char', 'ilike', 'Stephanie'),\n                ])\n\n        self.assertListEqual(chars_stephanie, [])\n\n    @with_transaction()\n    def test_accented_search(self):\n        \"Test searches of accented value\"\n        Char = Pool().get('test.char_unaccented_on')\n        char, = Char.create([{\n                    'char': 'Stéphanie',\n                    }])\n\n        chars_stephanie = Char.search([\n                ('char', 'ilike', 'Stephanie'),\n                ])\n\n        self.assertListEqual(chars_stephanie, [char])\n\n    @with_transaction()\n    def test_unaccented_search(self):\n        \"Test searches of unaccented value\"\n        Char = Pool().get('test.char_unaccented_on')\n        char, = Char.create([{\n                    'char': 'Stephanie',\n                    }])\n\n        chars_stephanie = Char.search([\n                ('char', 'ilike', 'Stéphanie'),\n                ])\n        self.assertListEqual(chars_stephanie, [char])\n\n    @with_transaction()\n    def test_unaccented_translated_search(self):\n        \"Test unaccented translated search\"\n        pool = Pool()\n        Char = pool.get('test.char_unaccented_translate')\n        Lang = pool.get('ir.lang')\n\n        lang, = Lang.search([\n                ('translatable', '=', False),\n                ('code', '!=', 'en'),\n                ], limit=1)\n        lang.translatable = True\n        lang.save()\n        char, = Char.create([{\n                    'char': 'School',\n                    }])\n\n        with Transaction().set_context(lang=lang.code):\n            trans_char = Char(char.id)\n            trans_char.char = 'École'\n            trans_char.save()\n\n            chars_ecole = Char.search([\n                    ('char', 'ilike', 'Ecole'),\n                    ])\n            self.assertListEqual(chars_ecole, [char])\n\n\n@unittest.skipUnless(backend.name == 'postgresql',\n    \"similarity works only on postgresql\")\nclass FieldCharSimilarityTestCase(ExtensionTestCase):\n    \"Test Field Char with similarity searches\"\n    extension = 'pg_trgm'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n        super().setUpClass()\n\n    def _test_search(self, Model):\n        record1, record2 = Model.create([{\n                    'char': \"word\",\n                    }, {\n                    'char': \"Foo\",\n                    }])\n\n        with Transaction().set_context(search_similarity=0.3):\n            self.assertListEqual(Model.search([\n                        ('char', 'ilike', 'two words'),\n                        ]), [record1])\n\n    @with_transaction()\n    def test_search(self):\n        \"Test search\"\n        pool = Pool()\n        self._test_search(pool.get('test.char'))\n\n    @with_transaction()\n    def test_search_translated(self):\n        \"Test search translated\"\n        pool = Pool()\n        self._test_search(pool.get('test.char_translate'))\n\n    def _test_order(self, Model):\n        record1, record2 = Model.create([{\n                    'char': \"word\",\n                    }, {\n                    'char': \"Foo\",\n                    }])\n        with Transaction().set_context({\n                    '%s.char.order' % Model.__name__: 'foo bar',\n                    }):\n            self.assertListEqual(Model.search([\n                        ], order=[('char', 'DESC')]),\n                [record2, record1])\n\n    @with_transaction()\n    def test_order(self):\n        \"Test order\"\n        pool = Pool()\n        self._test_order(pool.get('test.char'))\n\n    @with_transaction()\n    def test_order_translated(self):\n        \"Test order translated\"\n        pool = Pool()\n        self._test_order(pool.get('test.char_translate'))\n"
  },
  {
    "path": "trytond/tests/test_field_context.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport unittest\n\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass FieldContextTestCase(unittest.TestCase):\n    \"Test context on field\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_context(self):\n        pool = Pool()\n        Parent = pool.get('test.field_context.parent')\n        Child = pool.get('test.field_context.child')\n        child = Child()\n        child.save()\n        parent = Parent(name='foo', child=child)\n        parent.save()\n        self.assertEqual(parent.child._context['name'], 'foo')\n        self.assertEqual(parent.child._context['rec_name'], '')\n\n        parent.name = 'bar'\n        parent.save()\n        self.assertEqual(parent.child._context['name'], 'bar')\n        self.assertEqual(parent.child._context['rec_name'], '')\n"
  },
  {
    "path": "trytond/tests/test_field_date.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport unittest\n\nfrom sql import Literal, Select\nfrom sql.functions import CurrentDate\n\nfrom trytond import backend\nfrom trytond.model.exceptions import RequiredValidationError\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\ntoday = datetime.date(2009, 1, 1)\ntomorrow = today + datetime.timedelta(1)\nyesterday = today - datetime.timedelta(1)\ndefault_date = datetime.date(2000, 1, 1)\n\n\nclass FieldDateTestCase(unittest.TestCase):\n    \"Test Field Date\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create date\"\n        Date = Pool().get('test.date')\n\n        date, date_none = Date.create([{\n                    'date': today,\n                    }, {\n                    'date': None\n                    }])\n\n        self.assertEqual(date.date, today)\n        self.assertEqual(date_none.date, None)\n\n    @with_transaction()\n    def test_create_date_string(self):\n        \"Test create date with date string\"\n        Date = Pool().get('test.date')\n\n        date, = Date.create([{\n                    'date': str(today),\n                    }])\n\n        self.assertEqual(date.date, today)\n\n    @with_transaction()\n    def test_create_invalid_date_string(self):\n        \"Test create date with invalid date string\"\n        Date = Pool().get('test.date')\n\n        with self.assertRaises(ValueError):\n            Date.create([{\n                        'date': '2009-02-29',\n                        }])\n\n    @with_transaction()\n    def test_create_without_default(self):\n        \"Test create date without default\"\n        Date = Pool().get('test.date')\n\n        date, = Date.create([{}])\n\n        self.assertEqual(date.date, None)\n\n    @with_transaction()\n    def test_create_with_default(self):\n        \"Test create date with default\"\n        Date = Pool().get('test.date_default')\n\n        date, = Date.create([{}])\n\n        self.assertEqual(date.date, default_date)\n\n    @with_transaction()\n    def test_create_with_sql_value(self):\n        \"Test create date with SQL value\"\n        Date = Pool().get('test.date')\n\n        date, = Date.create([{'date': CurrentDate()}])\n\n        self.assertTrue(date.date)\n\n    @with_transaction()\n    def test_set_sql_value(self):\n        \"Test cannot set SQL value\"\n        Date = Pool().get('test.date')\n\n        date = Date()\n\n        with self.assertRaises(ValueError):\n            date.date = CurrentDate()\n\n    @with_transaction()\n    def test_create_non_date(self):\n        \"Test create date with non date\"\n        Date = Pool().get('test.date')\n\n        with self.assertRaises(ValueError):\n            Date.create([{\n                        'date': 'non date',\n                        }])\n\n    @with_transaction()\n    def test_create_integer(self):\n        \"Test create date with integer\"\n        Date = Pool().get('test.date')\n\n        with self.assertRaises(TypeError):\n            Date.create([{\n                        'date': 42,\n                        }])\n\n    @with_transaction()\n    def test_create_datetime(self):\n        \"Test create date with datetime\"\n        Date = Pool().get('test.date')\n\n        with self.assertRaises(ValueError):\n            Date.create([{\n                        'date': datetime.datetime(2009, 1, 1, 12, 0),\n                        }])\n\n    @with_transaction()\n    def test_create_required_with_value(self):\n        \"Test create date required with value\"\n        Date = Pool().get('test.date_required')\n\n        date, = Date.create([{\n                    'date': today,\n                    }])\n\n        self.assertEqual(date.date, today)\n\n    @with_transaction()\n    def test_create_required_without_value(self):\n        \"Test create date required without value\"\n        Date = Pool().get('test.date_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Date.create([{}])\n\n    @with_transaction()\n    def test_search_equals(self):\n        \"Test search date equals\"\n        Date = Pool().get('test.date')\n        date, = Date.create([{\n                    'date': today,\n                    }])\n\n        dates_today = Date.search([\n                ('date', '=', today),\n                ])\n        dates_tomorrow = Date.search([\n                ('date', '=', tomorrow),\n                ])\n\n        self.assertListEqual(dates_today, [date])\n        self.assertListEqual(dates_tomorrow, [])\n\n    @with_transaction()\n    def test_search_equals_none(self):\n        \"Test search date equals None\"\n        Date = Pool().get('test.date')\n        date, = Date.create([{\n                    'date': None,\n                    }])\n\n        dates = Date.search([\n                ('date', '=', None),\n                ])\n\n        self.assertListEqual(dates, [date])\n\n    @with_transaction()\n    def test_search_non_equals(self):\n        \"Test search date non equals\"\n        Date = Pool().get('test.date')\n        date, = Date.create([{\n                    'date': today,\n                    }])\n\n        dates_today = Date.search([\n                ('date', '!=', today),\n                ])\n        dates_tomorrow = Date.search([\n                ('date', '!=', tomorrow),\n                ])\n\n        self.assertListEqual(dates_today, [])\n        self.assertListEqual(dates_tomorrow, [date])\n\n    @with_transaction()\n    def test_search_non_equals_none(self):\n        \"Test search date non equals None\"\n        Date = Pool().get('test.date')\n        date, = Date.create([{\n                    'date': None,\n                    }])\n\n        dates = Date.search([\n                ('date', '!=', None),\n                ])\n\n        self.assertListEqual(dates, [])\n\n    @with_transaction()\n    def test_search_in(self):\n        \"Test search date in\"\n        Date = Pool().get('test.date')\n        date, = Date.create([{\n                    'date': today,\n                    }])\n\n        dates_today = Date.search([\n                ('date', 'in', [today]),\n                ])\n        dates_tomorrow = Date.search([\n                ('date', 'in', [tomorrow]),\n                ])\n        dates_empty = Date.search([\n                ('date', 'in', []),\n                ])\n\n        self.assertListEqual(dates_today, [date])\n        self.assertListEqual(dates_tomorrow, [])\n        self.assertListEqual(dates_empty, [])\n\n    @with_transaction()\n    def test_search_in_none(self):\n        \"Test search date in [None]\"\n        Date = Pool().get('test.date')\n        date, = Date.create([{\n                    'date': None,\n                    }])\n\n        dates = Date.search([\n                ('date', 'in', [None]),\n                ])\n\n        self.assertListEqual(dates, [date])\n\n    @with_transaction()\n    def test_search_not_in(self):\n        \"Test search date not in\"\n        Date = Pool().get('test.date')\n        date, = Date.create([{\n                    'date': today,\n                    }])\n\n        dates_today = Date.search([\n                ('date', 'not in', [today]),\n                ])\n        dates_tomorrow = Date.search([\n                ('date', 'not in', [tomorrow]),\n                ])\n        dates_empty = Date.search([\n                ('date', 'not in', []),\n                ])\n\n        self.assertListEqual(dates_today, [])\n        self.assertListEqual(dates_tomorrow, [date])\n        self.assertListEqual(dates_empty, [date])\n\n    @with_transaction()\n    def test_search_not_in_none(self):\n        \"Test search date not in [None]\"\n        Date = Pool().get('test.date')\n        date, = Date.create([{\n                    'date': None,\n                    }])\n\n        dates = Date.search([\n                ('date', 'not in', [None]),\n                ])\n\n        self.assertListEqual(dates, [])\n\n    @with_transaction()\n    def test_search_in_multi(self):\n        \"Test search date in multiple\"\n        Date = Pool().get('test.date')\n        dates = Date.create([{\n                    'date': today,\n                    }, {\n                    'date': tomorrow,\n                    }])\n\n        dates_in = Date.search([\n                ('date', 'in', [today, tomorrow]),\n                ])\n\n        self.assertListEqual(dates_in, dates)\n\n    @with_transaction()\n    def test_search_not_in_multi(self):\n        \"Test search date not in multiple\"\n        Date = Pool().get('test.date')\n        Date.create([{\n                    'date': today,\n                    }, {\n                    'date': tomorrow,\n                    }])\n\n        dates = Date.search([\n                ('date', 'not in', [today, tomorrow]),\n                ])\n\n        self.assertListEqual(dates, [])\n\n    @with_transaction()\n    def test_search_less(self):\n        \"Test search date less than\"\n        Date = Pool().get('test.date')\n        date, = Date.create([{\n                    'date': today,\n                    }])\n\n        dates_tomorrow = Date.search([\n                ('date', '<', tomorrow),\n                ])\n        dates_yesterday = Date.search([\n                ('date', '<', yesterday),\n                ])\n        dates_today = Date.search([\n                ('date', '<', today),\n                ])\n\n        self.assertListEqual(dates_tomorrow, [date])\n        self.assertListEqual(dates_yesterday, [])\n        self.assertListEqual(dates_today, [])\n\n    @with_transaction()\n    def test_search_less_equals(self):\n        \"Test search date less than or equals\"\n        Date = Pool().get('test.date')\n        date, = Date.create([{\n                    'date': today,\n                    }])\n\n        dates_tomorrow = Date.search([\n                ('date', '<=', tomorrow),\n                ])\n        dates_yesterday = Date.search([\n                ('date', '<=', yesterday),\n                ])\n        dates_today = Date.search([\n                ('date', '<=', today),\n                ])\n\n        self.assertListEqual(dates_tomorrow, [date])\n        self.assertListEqual(dates_yesterday, [])\n        self.assertListEqual(dates_today, [date])\n\n    @with_transaction()\n    def test_search_greater(self):\n        \"Test search date greater than\"\n        Date = Pool().get('test.date')\n        date, = Date.create([{\n                    'date': today,\n                    }])\n\n        dates_tomorrow = Date.search([\n                ('date', '>', tomorrow),\n                ])\n        dates_yesterday = Date.search([\n                ('date', '>', yesterday),\n                ])\n        dates_today = Date.search([\n                ('date', '>', today),\n                ])\n\n        self.assertListEqual(dates_tomorrow, [])\n        self.assertListEqual(dates_yesterday, [date])\n        self.assertListEqual(dates_today, [])\n\n    @with_transaction()\n    def test_search_greater_equals(self):\n        \"Test search date greater than or equals\"\n        Date = Pool().get('test.date')\n        date, = Date.create([{\n                    'date': today,\n                    }])\n\n        dates_tomorrow = Date.search([\n                ('date', '>=', tomorrow),\n                ])\n        dates_yesterday = Date.search([\n                ('date', '>=', yesterday),\n                ])\n        dates_today = Date.search([\n                ('date', '>=', today),\n                ])\n\n        self.assertListEqual(dates_tomorrow, [])\n        self.assertListEqual(dates_yesterday, [date])\n        self.assertListEqual(dates_today, [date])\n\n    @with_transaction()\n    def test_write(self):\n        \"Test write date\"\n        Date = Pool().get('test.date')\n        date, = Date.create([{\n                    'date': today,\n                    }])\n\n        Date.write([date], {\n                'date': yesterday,\n                })\n\n        self.assertEqual(date.date, yesterday)\n\n    @with_transaction()\n    def test_write_non_date(self):\n        \"Test write date with non date\"\n        Date = Pool().get('test.date')\n        date, = Date.create([{\n                    'date': today,\n                    }])\n\n        with self.assertRaises(ValueError):\n            Date.write([date], {\n                    'date': 'non date',\n                    })\n\n    @with_transaction()\n    def test_write_integer(self):\n        \"Test write date with integer\"\n        Date = Pool().get('test.date')\n        date, = Date.create([{\n                    'date': today,\n                    }])\n\n        with self.assertRaises(TypeError):\n            Date.write([date], {\n                    'date': 42,\n                    })\n\n    @with_transaction()\n    def test_write_datetime(self):\n        \"Test write date with datetime\"\n        Date = Pool().get('test.date')\n        date, = Date.create([{\n                    'date': today,\n                    }])\n\n        with self.assertRaises(ValueError):\n            Date.write([date], {\n                    'date': datetime.datetime(2009, 1, 1, 12, 0),\n                    })\n\n    @unittest.skipIf(backend.name == 'sqlite',\n        \"SQLite does not support timezone others than utc and localtime\")\n    @with_transaction()\n    def test_sql_cast_timezone(self):\n        \"Cast datetime to date with timezone\"\n        Date = Pool().get('test.date')\n        expression = Date.date.sql_cast(\n            Literal(datetime.datetime(2021, 10, 14, 22, 00)),\n            timezone='Europe/Brussels')\n        cursor = Transaction().connection.cursor()\n\n        cursor.execute(*Select([expression]))\n        result, = cursor.fetchone()\n\n        self.assertEqual(result, datetime.date(2021, 10, 15))\n"
  },
  {
    "path": "trytond/tests/test_field_datetime.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport unittest\n\nfrom sql.functions import CurrentTimestamp\n\nfrom trytond.model.exceptions import (\n    RequiredValidationError, TimeFormatValidationError)\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\ntoday = datetime.datetime(2009, 1, 1, 12, 0, 0)\ntomorrow = today + datetime.timedelta(1)\nyesterday = today - datetime.timedelta(1)\ndefault_datetime = datetime.datetime(2000, 1, 1, 12, 0, 0)\n\n\nclass FieldDateTimeTestCase(unittest.TestCase):\n    \"Test Field DateTime\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create datetime\"\n        DateTime = Pool().get('test.datetime')\n\n        datetime, datetime_none = DateTime.create([{\n                    'datetime': today,\n                    }, {\n                    'datetime': None\n                    }])\n\n        self.assertEqual(datetime.datetime, today)\n        self.assertEqual(datetime_none.datetime, None)\n\n    @with_transaction()\n    def test_create_datetime_string(self):\n        \"Test create datetime with datetime string\"\n        DateTime = Pool().get('test.datetime')\n\n        datetime, = DateTime.create([{\n                    'datetime': str(today),\n                    }])\n\n        self.assertEqual(datetime.datetime, today)\n\n    @with_transaction()\n    def test_create_invalid_datetime_string(self):\n        \"Test create datetime with invalid datetime string\"\n        DateTime = Pool().get('test.datetime')\n\n        with self.assertRaises(ValueError):\n            DateTime.create([{\n                        'datetime': '2009-02-29',\n                        }])\n\n    @with_transaction()\n    def test_create_without_default(self):\n        \"Test create datetime without default\"\n        DateTime = Pool().get('test.datetime')\n\n        datetime, = DateTime.create([{}])\n\n        self.assertEqual(datetime.datetime, None)\n\n    @with_transaction()\n    def test_create_with_default(self):\n        \"Test create datetime with default\"\n        DateTime = Pool().get('test.datetime_default')\n\n        datetime, = DateTime.create([{}])\n\n        self.assertEqual(datetime.datetime, default_datetime)\n\n    @with_transaction()\n    def test_create_with_sql_value(self):\n        \"Test create datetime with SQL value\"\n        DateTime = Pool().get('test.datetime')\n\n        datetime, = DateTime.create([{\n                    'datetime': DateTime.datetime.sql_cast(CurrentTimestamp()),\n                    }])\n\n        self.assertTrue(datetime.datetime)\n\n    @with_transaction()\n    def test_set_sql_value(self):\n        \"Test cannot set SQL value\"\n        DateTime = Pool().get('test.datetime')\n\n        datetime = DateTime()\n\n        with self.assertRaises(ValueError):\n            datetime.datetime = CurrentTimestamp()\n\n    @with_transaction()\n    def test_create_non_datetime(self):\n        \"Test create datetime with non datetime\"\n        DateTime = Pool().get('test.datetime')\n\n        with self.assertRaises(ValueError):\n            DateTime.create([{\n                        'datetime': 'non datetime',\n                        }])\n\n    @with_transaction()\n    def test_create_integer(self):\n        \"Test create datetime with integer\"\n        DateTime = Pool().get('test.datetime')\n\n        with self.assertRaises(TypeError):\n            DateTime.create([{\n                        'datetime': 42,\n                        }])\n\n    @with_transaction()\n    def test_create_date(self):\n        \"Test create datetime with date\"\n        DateTime = Pool().get('test.datetime')\n\n        with self.assertRaises(TypeError):\n            DateTime.create([{\n                        'datetime': datetime.date(2009, 1, 1),\n                        }])\n\n    @with_transaction()\n    def test_create_microsecond(self):\n        \"Test create datetime with microsecond\"\n        DateTime = Pool().get('test.datetime_required')\n\n        datetime, = DateTime.create([{\n                    'datetime': today.replace(microsecond=1),\n                    }])\n\n        self.assertEqual(datetime.datetime, today)\n\n    @with_transaction()\n    def test_create_required_with_value(self):\n        \"Test create datetime required with value\"\n        DateTime = Pool().get('test.datetime_required')\n\n        datetime, = DateTime.create([{\n                    'datetime': today,\n                    }])\n\n        self.assertEqual(datetime.datetime, today)\n\n    @with_transaction()\n    def test_create_required_without_value(self):\n        \"Test create datetime required without value\"\n        DateTime = Pool().get('test.datetime_required')\n\n        with self.assertRaises(RequiredValidationError):\n            DateTime.create([{}])\n\n    @with_transaction()\n    def test_create_format_valid(self):\n        \"Test create datetime with valid format\"\n        DateTime = Pool().get('test.datetime_format')\n\n        datetime_, = DateTime.create([{\n                    'datetime': datetime.datetime(2009, 1, 1, 12, 30),\n                    }])\n\n        self.assertEqual(\n            datetime_.datetime, datetime.datetime(2009, 1, 1, 12, 30))\n\n    @with_transaction()\n    def test_create_format_invalid(self):\n        \"Test create datetime with invalid format\"\n        DateTime = Pool().get('test.datetime_format')\n\n        with self.assertRaises(TimeFormatValidationError):\n            DateTime.create([{\n                        'datetime': datetime.datetime(2009, 1, 1, 12, 30, 25),\n                        }])\n\n    @with_transaction()\n    def test_search_equals(self):\n        \"Test search datetime equals\"\n        DateTime = Pool().get('test.datetime')\n        datetime, = DateTime.create([{\n                    'datetime': today,\n                    }])\n\n        datetimes_today = DateTime.search([\n                ('datetime', '=', today),\n                ])\n        datetimes_tomorrow = DateTime.search([\n                ('datetime', '=', tomorrow),\n                ])\n\n        self.assertListEqual(datetimes_today, [datetime])\n        self.assertListEqual(datetimes_tomorrow, [])\n\n    @with_transaction()\n    def test_search_equals_none(self):\n        \"Test search datetime equals None\"\n        DateTime = Pool().get('test.datetime')\n        datetime, = DateTime.create([{\n                    'datetime': None,\n                    }])\n\n        datetimes = DateTime.search([\n                ('datetime', '=', None),\n                ])\n\n        self.assertListEqual(datetimes, [datetime])\n\n    @with_transaction()\n    def test_search_non_equals(self):\n        \"Test search datetime non equals\"\n        DateTime = Pool().get('test.datetime')\n        datetime, = DateTime.create([{\n                    'datetime': today,\n                    }])\n\n        datetimes_today = DateTime.search([\n                ('datetime', '!=', today),\n                ])\n        datetimes_tomorrow = DateTime.search([\n                ('datetime', '!=', tomorrow),\n                ])\n\n        self.assertListEqual(datetimes_today, [])\n        self.assertListEqual(datetimes_tomorrow, [datetime])\n\n    @with_transaction()\n    def test_search_non_equals_none(self):\n        \"Test search datetime non equals None\"\n        DateTime = Pool().get('test.datetime')\n        datetime, = DateTime.create([{\n                    'datetime': None,\n                    }])\n\n        datetimes = DateTime.search([\n                ('datetime', '!=', None),\n                ])\n\n        self.assertListEqual(datetimes, [])\n\n    @with_transaction()\n    def test_search_in(self):\n        \"Test search datetime in\"\n        DateTime = Pool().get('test.datetime')\n        datetime, = DateTime.create([{\n                    'datetime': today,\n                    }])\n\n        datetimes_today = DateTime.search([\n                ('datetime', 'in', [today]),\n                ])\n        datetimes_tomorrow = DateTime.search([\n                ('datetime', 'in', [tomorrow]),\n                ])\n        datetimes_empty = DateTime.search([\n                ('datetime', 'in', []),\n                ])\n\n        self.assertListEqual(datetimes_today, [datetime])\n        self.assertListEqual(datetimes_tomorrow, [])\n        self.assertListEqual(datetimes_empty, [])\n\n    @with_transaction()\n    def test_search_in_none(self):\n        \"Test search datetime in [None]\"\n        DateTime = Pool().get('test.datetime')\n        datetime, = DateTime.create([{\n                    'datetime': None,\n                    }])\n\n        datetimes = DateTime.search([\n                ('datetime', 'in', [None]),\n                ])\n\n        self.assertListEqual(datetimes, [datetime])\n\n    @with_transaction()\n    def test_search_not_in(self):\n        \"Test search datetime not in\"\n        DateTime = Pool().get('test.datetime')\n        datetime, = DateTime.create([{\n                    'datetime': today,\n                    }])\n\n        datetimes_today = DateTime.search([\n                ('datetime', 'not in', [today]),\n                ])\n        datetimes_tomorrow = DateTime.search([\n                ('datetime', 'not in', [tomorrow]),\n                ])\n        datetimes_empty = DateTime.search([\n                ('datetime', 'not in', []),\n                ])\n\n        self.assertListEqual(datetimes_today, [])\n        self.assertListEqual(datetimes_tomorrow, [datetime])\n        self.assertListEqual(datetimes_empty, [datetime])\n\n    @with_transaction()\n    def test_search_not_in_none(self):\n        \"Test search datetime not in [None]\"\n        DateTime = Pool().get('test.datetime')\n        datetime, = DateTime.create([{\n                    'datetime': None,\n                    }])\n\n        datetimes = DateTime.search([\n                ('datetime', 'not in', [None]),\n                ])\n\n        self.assertListEqual(datetimes, [])\n\n    @with_transaction()\n    def test_search_in_multi(self):\n        \"Test search datetime in multiple\"\n        DateTime = Pool().get('test.datetime')\n        datetimes = DateTime.create([{\n                    'datetime': today,\n                    }, {\n                    'datetime': tomorrow,\n                    }])\n\n        datetimes_in = DateTime.search([\n                ('datetime', 'in', [today, tomorrow]),\n                ])\n\n        self.assertListEqual(datetimes_in, datetimes)\n\n    @with_transaction()\n    def test_search_not_in_multi(self):\n        \"Test search datetime not in multiple\"\n        DateTime = Pool().get('test.datetime')\n        DateTime.create([{\n                    'datetime': today,\n                    }, {\n                    'datetime': tomorrow,\n                    }])\n\n        datetimes = DateTime.search([\n                ('datetime', 'not in', [today, tomorrow]),\n                ])\n\n        self.assertListEqual(datetimes, [])\n\n    @with_transaction()\n    def test_search_less(self):\n        \"Test search datetime less than\"\n        DateTime = Pool().get('test.datetime')\n        datetime, = DateTime.create([{\n                    'datetime': today,\n                    }])\n\n        datetimes_tomorrow = DateTime.search([\n                ('datetime', '<', tomorrow),\n                ])\n        datetimes_yesterday = DateTime.search([\n                ('datetime', '<', yesterday),\n                ])\n        datetimes_today = DateTime.search([\n                ('datetime', '<', today),\n                ])\n\n        self.assertListEqual(datetimes_tomorrow, [datetime])\n        self.assertListEqual(datetimes_yesterday, [])\n        self.assertListEqual(datetimes_today, [])\n\n    @with_transaction()\n    def test_search_less_equals(self):\n        \"Test search datetime less than or equals\"\n        DateTime = Pool().get('test.datetime')\n        datetime, = DateTime.create([{\n                    'datetime': today,\n                    }])\n\n        datetimes_tomorrow = DateTime.search([\n                ('datetime', '<=', tomorrow),\n                ])\n        datetimes_yesterday = DateTime.search([\n                ('datetime', '<=', yesterday),\n                ])\n        datetimes_today = DateTime.search([\n                ('datetime', '<=', today),\n                ])\n\n        self.assertListEqual(datetimes_tomorrow, [datetime])\n        self.assertListEqual(datetimes_yesterday, [])\n        self.assertListEqual(datetimes_today, [datetime])\n\n    @with_transaction()\n    def test_search_greater(self):\n        \"Test search datetime greater than\"\n        DateTime = Pool().get('test.datetime')\n        datetime, = DateTime.create([{\n                    'datetime': today,\n                    }])\n\n        datetimes_tomorrow = DateTime.search([\n                ('datetime', '>', tomorrow),\n                ])\n        datetimes_yesterday = DateTime.search([\n                ('datetime', '>', yesterday),\n                ])\n        datetimes_today = DateTime.search([\n                ('datetime', '>', today),\n                ])\n\n        self.assertListEqual(datetimes_tomorrow, [])\n        self.assertListEqual(datetimes_yesterday, [datetime])\n        self.assertListEqual(datetimes_today, [])\n\n    @with_transaction()\n    def test_search_greater_equals(self):\n        \"Test search datetime greater than or equals\"\n        DateTime = Pool().get('test.datetime')\n        datetime, = DateTime.create([{\n                    'datetime': today,\n                    }])\n\n        datetimes_tomorrow = DateTime.search([\n                ('datetime', '>=', tomorrow),\n                ])\n        datetimes_yesterday = DateTime.search([\n                ('datetime', '>=', yesterday),\n                ])\n        datetimes_today = DateTime.search([\n                ('datetime', '>=', today),\n                ])\n\n        self.assertListEqual(datetimes_tomorrow, [])\n        self.assertListEqual(datetimes_yesterday, [datetime])\n        self.assertListEqual(datetimes_today, [datetime])\n\n    @with_transaction()\n    def test_write(self):\n        \"Test write datetime\"\n        DateTime = Pool().get('test.datetime')\n        datetime, = DateTime.create([{\n                    'datetime': today,\n                    }])\n\n        DateTime.write([datetime], {\n                'datetime': yesterday,\n                })\n\n        self.assertEqual(datetime.datetime, yesterday)\n\n    @with_transaction()\n    def test_write_non_datetime(self):\n        \"Test write datetime with non datetime\"\n        DateTime = Pool().get('test.datetime')\n        datetime, = DateTime.create([{\n                    'datetime': today,\n                    }])\n\n        with self.assertRaises(ValueError):\n            DateTime.write([datetime], {\n                    'datetime': 'non datetime',\n                    })\n\n    @with_transaction()\n    def test_write_integer(self):\n        \"Test write datetime with integer\"\n        DateTime = Pool().get('test.datetime')\n        datetime, = DateTime.create([{\n                    'datetime': today,\n                    }])\n\n        with self.assertRaises(TypeError):\n            DateTime.write([datetime], {\n                    'datetime': 42,\n                    })\n\n    @with_transaction()\n    def test_write_date(self):\n        \"Test write datetime with date\"\n        DateTime = Pool().get('test.datetime')\n        datetime_, = DateTime.create([{\n                    'datetime': today,\n                    }])\n\n        with self.assertRaises(TypeError):\n            DateTime.write([datetime_], {\n                    'datetime': datetime.date(2009, 1, 1),\n                    })\n"
  },
  {
    "path": "trytond/tests/test_field_depends.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of this\n# repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond.model import ModelView, fields\nfrom trytond.pyson import Eval, If\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass FieldDependsTestCase(unittest.TestCase):\n    'Test Field Depends'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    def test_empty_depends(self):\n        'Test depends are set if empty'\n\n        class Model(object):\n            @fields.depends('name')\n            def dependant(self):\n                pass\n        record = Model()\n\n        record.dependant()\n\n        self.assertIsNone(record.name)\n\n    def test_empty_depends_default(self):\n        \"Test depends are set with default value if empty\"\n\n        class Model(object):\n            @fields.depends('name')\n            def dependant(self):\n                pass\n\n            @classmethod\n            def default_name(cls):\n                return \"foo\"\n        Model._defaults = {'name': Model.default_name}\n        record = Model()\n\n        record.dependant()\n\n        self.assertEqual(record.name, \"foo\")\n\n    def test_set_depends(self):\n        'Test depends are not modified if set'\n\n        class Model(object):\n            @fields.depends('name')\n            def dependant(self):\n                pass\n        record = Model()\n        record.name = \"Name\"\n\n        record.dependant()\n\n        self.assertEqual(record.name, \"Name\")\n\n    def test_parent(self):\n        'Test _parent_ depends are set'\n\n        class Model(object):\n            @fields.depends('_parent_parent.name',\n                '_parent_parent.description')\n            def dependant(self):\n                pass\n        parent = Model()\n        parent.description = \"Description\"\n        record = Model()\n        record.parent = parent\n\n        record.dependant()\n\n        self.assertIsNone(record.parent.name)\n        self.assertEqual(record.parent.description, \"Description\")\n\n    def test_nested_parent(self):\n        'Test nested _parent_ depends are set'\n\n        class Model(object):\n            @fields.depends('_parent_parent.name',\n                '_parent_parent.description',\n                '_parent_parent._parent_parent.name',\n                '_parent_parent._parent_parent.description',)\n            def dependant(self):\n                pass\n        grantparent = Model()\n        grantparent.description = \"Description\"\n        parent = Model()\n        parent.parent = grantparent\n        record = Model()\n        record.parent = parent\n\n        record.dependant()\n\n        self.assertIsNone(record.parent.name)\n        self.assertIsNone(record.parent.description)\n        self.assertIsNone(record.parent.parent.name)\n        self.assertEqual(record.parent.parent.description, \"Description\")\n\n    def test_inherit(self):\n        \"Tests inherited depends\"\n\n        class Parent(ModelView):\n            name = fields.Char(\"Name\")\n            foo = fields.Char(\"Foo\")\n\n            @fields.depends('foo')\n            def on_change_name(self):\n                pass\n\n        class Model(Parent):\n            bar = fields.Char(\"Bar\")\n\n            @fields.depends('bar')\n            def on_change_name(self):\n                super(Model, self).on_change_name()\n\n        Model.__setup__()\n        Model.__post_setup__()\n\n        self.assertEqual(Model.name.on_change, {'foo', 'bar'})\n\n    def test_methods(self):\n        \"Tests depends on method\"\n\n        class Model(ModelView):\n            name = fields.Char(\"Name\")\n            foo = fields.Char(\"Foo\")\n            bar = fields.Char(\"Bar\")\n\n            @fields.depends('foo', methods=['other_method'])\n            def on_change_name(self):\n                self.other_method()\n\n            @fields.depends('bar')\n            def other_method(self):\n                pass\n\n        Model.__setup__()\n        Model.__post_setup__()\n\n        self.assertEqual(Model.name.on_change, {'foo', 'bar'})\n\n    def test_methods_2(self):\n        \"Tests depends on method on method\"\n\n        class Model(ModelView):\n            name = fields.Char(\"Name\")\n            foo = fields.Char(\"Foo\")\n            bar = fields.Char(\"Bar\")\n\n            @fields.depends('foo', methods=['other_method'])\n            def on_change_name(self):\n                self.other_method()\n\n            @fields.depends(methods=['another_method'])\n            def other_method(self):\n                self.another_method()\n\n            @fields.depends('bar')\n            def another_method(self):\n                pass\n\n        Model.__setup__()\n        Model.__post_setup__()\n\n        self.assertEqual(Model.name.on_change, {'foo', 'bar'})\n\n    @with_transaction()\n    def test_field_context(self):\n        \"Tests depends on field with context\"\n\n        class Model(ModelView):\n            name = fields.Char(\"Name\")\n            foo = fields.Char(\n                \"Foo\", context={'bar': Eval('bar')}, depends=['bar'])\n            bar = fields.Char(\"Bar\")\n\n            @fields.depends('foo')\n            def on_change_name(self):\n                return\n\n        Model.__setup__()\n        Model.__post_setup__()\n\n        self.assertEqual(\n            set(Model.name.definition(Model, 'en')['on_change']),\n            {'foo', 'bar', 'id'})\n\n    @with_transaction()\n    def test_field_context_parent(self):\n        \"Tests depends on parent field with context\"\n\n        class Target(ModelView):\n            name = fields.Char(\n                \"Name\", context={'bar': Eval('bar')}, depends=['bar'])\n            bar = fields.Char(\"Bar\")\n\n        class Model(ModelView):\n            name = fields.Char(\"Name\")\n            foo = fields.Many2One(None, \"Foo\")\n\n            @fields.depends('_parent_foo.name')\n            def on_change_name(self):\n                return\n\n        Model.foo.get_target = lambda: Target\n\n        Target.__setup__()\n        Target.__post_setup__()\n        Model.__setup__()\n        Model.__post_setup__()\n\n        self.assertEqual(\n            set(Model.name.definition(Model, 'en')['on_change']),\n            {'_parent_foo.name', '_parent_foo.bar', 'id'})\n\n    def test_property_depends(self):\n        \"Tests depends on a property\"\n\n        class Model(ModelView):\n            \"ModelView Property Depends\"\n            __name__ = 'test.modelview.property_depends'\n\n            foo = fields.Char(\"Foo\")\n            bar = fields.Char(\"Bar\")\n\n            @property\n            @fields.depends('foo')\n            def len_foo(self):\n                return len(self.foo)\n\n            @len_foo.setter\n            @fields.depends('bar')\n            def len_foo(self, value):\n                pass\n\n            @fields.depends(methods=['len_foo'])\n            def on_change_bar(self):\n                pass\n\n        Model.__setup__()\n        Model.__post_setup__()\n\n        self.assertEqual(Model.bar.on_change, {'foo', 'bar'})\n\n    def test_get_eval_fields(self):\n        \"Test get_eval_fields\"\n        for value, result in [\n                ('test', set()),\n                (Eval('foo'), {'foo'}),\n                (Eval('_parent_foo'), {'foo'}),\n                (Eval('foo.bar'), {'foo'}),\n                ([Eval('foo'), Eval('bar')], {'foo', 'bar'}),\n                ((Eval('foo'), Eval('bar')), {'foo', 'bar'}),\n                ({'foo': Eval('bar')}, {'bar'}),\n                (If(Eval('foo'), Eval('bar'), Eval('baz')),\n                    {'foo', 'bar', 'baz'}),\n                ]:\n            with self.subTest(value=value):\n                self.assertEqual(fields.get_eval_fields(value), result)\n"
  },
  {
    "path": "trytond/tests/test_field_dict.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond import backend\nfrom trytond.model.dictschema import SelectionError\nfrom trytond.model.exceptions import RequiredValidationError\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import (\n    ExtensionTestCase, activate_module, with_transaction)\n\n\nclass FieldDictTestCase(unittest.TestCase):\n    \"Test Field Dict\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    def create_schema(self):\n        DictSchema = Pool().get('test.dict.schema')\n\n        DictSchema.create([{\n                    'name': 'a',\n                    'string': 'A',\n                    'type_': 'integer',\n                    }, {\n                    'name': 'b',\n                    'string': 'B',\n                    'type_': 'integer',\n                    }, {\n                    'name': 'type',\n                    'string': 'Type',\n                    'type_': 'selection',\n                    'selection': ('arabic: Arabic\\n'\n                        'hexa: Hexadecimal'),\n                    }, {\n                    'name': 'countries',\n                    'string': 'Countries',\n                    'type_': 'multiselection',\n                    'selection': (\n                        'au: Australia\\n'\n                        'be: Belgium\\n'\n                        'ca: Canada\\n'\n                        'de: Germany\\n'\n                        'es: Spain\\n'\n                        'fr: France'),\n                    }])\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create dict\"\n        Dict = Pool().get('test.dict')\n        self.create_schema()\n\n        dict_, = Dict.create([{\n                    'dico': {'a': 1, 'b': 2},\n                    }])\n\n        self.assertDictEqual(dict_.dico, {'a': 1, 'b': 2})\n\n    @with_transaction()\n    def test_create_without_schema(self):\n        \"Test create dict without schema\"\n        Dict = Pool().get('test.dict')\n\n        dict_, = Dict.create([{\n                    'dico': {'z': 26},\n                    }])\n\n        self.assertDictEqual(dict_.dico, {'z': 26})\n\n    @with_transaction()\n    def test_create_without_default(self):\n        \"Test create dict without default\"\n        Dict = Pool().get('test.dict')\n        self.create_schema()\n\n        dict_, = Dict.create([{}])\n\n        self.assertEqual(dict_.dico, None)\n\n    @with_transaction()\n    def test_create_with_default(self):\n        \"Test create dict without default\"\n        Dict = Pool().get('test.dict_default')\n        self.create_schema()\n\n        dict_, = Dict.create([{}])\n\n        self.assertDictEqual(dict_.dico, {'a': 1})\n\n    @with_transaction()\n    def test_create_required_with_value(self):\n        \"Test create dict required with value\"\n        Dict = Pool().get('test.dict_required')\n        self.create_schema()\n\n        dict_, = Dict.create([{\n                    'dico': {'a': 1},\n                    }])\n\n        self.assertDictEqual(dict_.dico, {'a': 1})\n\n    @with_transaction()\n    def test_create_required_without_value(self):\n        \"Test create dict required without value\"\n        Dict = Pool().get('test.dict_required')\n        self.create_schema()\n\n        with self.assertRaises(RequiredValidationError):\n            Dict.create([{}])\n\n    @with_transaction()\n    def test_create_required_with_empty(self):\n        \"Test create dict required without value\"\n        Dict = Pool().get('test.dict_required')\n        self.create_schema()\n\n        with self.assertRaises(RequiredValidationError):\n            Dict.create([{\n                        'dico': {},\n                        }])\n\n    @with_transaction()\n    def test_create_selection(self):\n        \"Test create dict with selection\"\n        Dict = Pool().get('test.dict')\n        self.create_schema()\n\n        dict_, = Dict.create([{\n                    'dico': {'type': 'arabic'},\n                    }])\n\n        self.assertDictEqual(dict_.dico, {'type': 'arabic'})\n\n    @with_transaction()\n    def test_create_multiselection(self):\n        \"Test create dict with multi-selection\"\n        Dict = Pool().get('test.dict')\n        self.create_schema()\n\n        dict_, = Dict.create([{\n                    'dico': {'countries': ['fr', 'be']},\n                    }])\n\n        self.assertDictEqual(dict_.dico, {'countries': ('be', 'fr')})\n\n    @with_transaction()\n    def test_invalid_selection_schema(self):\n        \"Test invalid selection schema\"\n        pool = Pool()\n        DictSchema = pool.get('test.dict.schema')\n\n        with self.assertRaises(SelectionError):\n            DictSchema.create([{\n                        'name': 'selection',\n                        'string': \"Selection\",\n                        'type_': 'selection',\n                        'selection': 'foo',\n                        }])\n\n    @with_transaction()\n    def test_create_text(self):\n        \"Test create dict as text\"\n        Dict = Pool().get('test.dict_text')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': 1, 'b': 2},\n                    }])\n\n        self.assertDictEqual(dict_.dico, {'a': 1, 'b': 2})\n\n    @with_transaction()\n    def test_write(self):\n        \"Test write dict\"\n        Dict = Pool().get('test.dict')\n        self.create_schema()\n        dict_, = Dict.create([{\n                    'dico': {'a': 1, 'b': 2},\n                    }])\n\n        Dict.write([dict_], {\n                'dico': {'a': 2},\n                })\n\n        self.assertDictEqual(dict_.dico, {'a': 2})\n\n    @with_transaction()\n    def test_write_wthout_schema(self):\n        \"Test write dict without schema\"\n        Dict = Pool().get('test.dict')\n        dict_, = Dict.create([{\n                    'dico': {'z': 26},\n                    }])\n\n        Dict.write([dict_], {\n                'dico': {'y': 1},\n                })\n\n        self.assertDictEqual(dict_.dico, {'y': 1})\n\n    @with_transaction()\n    def test_write_text(self):\n        \"Test write dict as text\"\n        Dict = Pool().get('test.dict_text')\n        dict_, = Dict.create([{\n                    'dico': {'a': 1, 'b': 2},\n                    }])\n\n        Dict.write([dict_], {'dico': {'z': 26}})\n\n        self.assertDictEqual(dict_.dico, {'z': 26})\n\n    @with_transaction()\n    def test_search_element_equals(self):\n        \"Test search dict element equals\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': 'Foo'},\n                    }])\n\n        dicts_foo = Dict.search([\n                ('dico.a', '=', \"Foo\"),\n                ])\n        dicts_bar = Dict.search([\n                ('dico.a', '=', \"Bar\"),\n                ])\n        dicts_foo_b = Dict.search([\n                ('dico.b', '=', \"Foo\"),\n                ])\n\n        self.assertListEqual(dicts_foo, [dict_])\n        self.assertListEqual(dicts_bar, [])\n        self.assertListEqual(dicts_foo_b, [])\n\n    @with_transaction()\n    def test_search_multiselection_equals(self):\n        \"Test search dict multi-selection equals\"\n        pool = Pool()\n        Dict = pool.get('test.dict')\n        self.create_schema()\n\n        dict_, = Dict.create([{\n                    'dico': {'countries': ['fr', 'be']},\n                    }])\n\n        france_belgium = Dict.search([\n                ('dico.countries', '=', ['be', 'fr']),\n                ])\n        belgium = Dict.search([\n                ('dico.countries', '=', ['be']),\n                ])\n        germany = Dict.search([\n                ('dico.countries', '=', ['de']),\n                ])\n\n        self.assertEqual(france_belgium, [dict_])\n        self.assertEqual(belgium, [])\n        self.assertEqual(germany, [])\n\n    @with_transaction()\n    def test_search_element_equals_none(self):\n        \"Test search dict element equals None\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': None},\n                    }])\n\n        dicts = Dict.search([\n                ('dico.a', '=', None),\n                ])\n\n        self.assertListEqual(dicts, [dict_])\n\n    @with_transaction()\n    def test_search_non_element_equals_none(self):\n        \"Test search dict non element equals None\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': \"Foo\"},\n                    }])\n\n        dicts = Dict.search([\n                ('dico.b', '=', None),\n                ])\n\n        self.assertListEqual(dicts, [dict_])\n\n    @with_transaction()\n    def test_search_element_non_equals(self):\n        \"Test search dict element non equals\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': \"Foo\"},\n                    }])\n\n        dicts_foo = Dict.search([\n                ('dico.a', '!=', \"Foo\"),\n                ])\n        dicts_bar = Dict.search([\n                ('dico.a', '!=', \"Bar\"),\n                ])\n        dicts_foo_b = Dict.search([\n                ('dico.b', '!=', \"Foo\"),\n                ])\n\n        self.assertListEqual(dicts_foo, [])\n        self.assertListEqual(dicts_bar, [dict_])\n        self.assertListEqual(dicts_foo_b, [])\n\n    @with_transaction()\n    def test_search_multiselection_not_equals(self):\n        \"Test search dict multi-selection not equals\"\n        pool = Pool()\n        Dict = pool.get('test.dict')\n        self.create_schema()\n\n        dict_, = Dict.create([{\n                    'dico': {'countries': ['fr', 'be']},\n                    }])\n\n        not_france_belgium = Dict.search([\n                ('dico.countries', '!=', ['be', 'fr']),\n                ])\n        not_belgium = Dict.search([\n                ('dico.countries', '!=', ['be']),\n                ])\n        not_germany = Dict.search([\n                ('dico.countries', '!=', ['de']),\n                ])\n        not_empty = Dict.search([\n                ('dico.countries', '!=', []),\n                ])\n\n        self.assertEqual(not_france_belgium, [])\n        self.assertEqual(not_belgium, [dict_])\n        self.assertEqual(not_germany, [dict_])\n        self.assertEqual(not_empty, [dict_])\n\n    @with_transaction()\n    def test_search_element_non_equals_none(self):\n        \"Test search dict element non equals None\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': None},\n                    }])\n\n        dicts = Dict.search([\n                ('dico.a', '!=', None),\n                ])\n\n        self.assertListEqual(dicts, [])\n\n    @with_transaction()\n    def test_search_non_element_non_equals_none(self):\n        \"Test search dict non element non equals None\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': \"Foo\"},\n                    }])\n\n        dicts = Dict.search([\n                ('dico.b', '!=', None),\n                ])\n\n        self.assertListEqual(dicts, [])\n\n    @with_transaction()\n    def test_search_element_equals_true(self):\n        \"Test search dict element equals True\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict1, dict2 = Dict.create([{\n                    'dico': {'a': True},\n                    }, {\n                    'dico': {'a': False},\n                    }])\n\n        dicts = Dict.search([\n                ('dico.a', '=', True),\n                ])\n\n        self.assertListEqual(dicts, [dict1])\n\n    @with_transaction()\n    def test_search_element_equals_false(self):\n        \"Test search dict element equals False\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict1, dict2 = Dict.create([{\n                    'dico': {'a': True},\n                    }, {\n                    'dico': {'a': False},\n                    }])\n\n        dicts = Dict.search([\n                ('dico.a', '=', False),\n                ])\n\n        self.assertListEqual(dicts, [dict2])\n\n    @with_transaction()\n    def test_search_element_non_equals_true(self):\n        \"Test search dict element non equals True\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': True},\n                    }])\n\n        dicts = Dict.search([\n                ('dico.a', '!=', True),\n                ])\n\n        self.assertListEqual(dicts, [])\n\n    @with_transaction()\n    def test_search_element_in(self):\n        \"Test search dict element in\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': \"Foo\"},\n                    }])\n\n        dicts_foo = Dict.search([\n                ('dico.a', 'in', [\"Foo\"]),\n                ])\n        dicts_bar = Dict.search([\n                ('dico.a', 'in', [\"Bar\"]),\n                ])\n        dicts_empty = Dict.search([\n                ('dico.a', 'in', []),\n                ])\n        dicts_foo_b = Dict.search([\n                ('dico.b', 'in', [\"Foo\"]),\n                ])\n\n        self.assertListEqual(dicts_foo, [dict_])\n        self.assertListEqual(dicts_bar, [])\n        self.assertListEqual(dicts_empty, [])\n        self.assertListEqual(dicts_foo_b, [])\n\n    @with_transaction()\n    @unittest.skipIf(\n        backend.name != 'postgresql',\n        'in use the contain check specific to postgresql')\n    def test_search_multiselection_in(self):\n        \"Test search dict multi-selection with in\"\n        pool = Pool()\n        Dict = pool.get('test.dict')\n        self.create_schema()\n\n        dict_, = Dict.create([{\n                    'dico': {'countries': ['fr', 'be']},\n                    }])\n\n        belgium = Dict.search([\n                ('dico.countries', 'in', ['be']),\n                ])\n        germany = Dict.search([\n                ('dico.countries', 'in', ['de']),\n                ])\n        belgium_germany = Dict.search([\n                ('dico.countries', 'in', ['be', 'de']),\n                ])\n        empty = Dict.search([\n                ('dico.countries', 'in', []),\n                ])\n\n        self.assertEqual(belgium, [dict_])\n        self.assertEqual(germany, [])\n        self.assertEqual(belgium_germany, [dict_])\n        self.assertEqual(empty, [])\n\n    @with_transaction()\n    def test_search_element_in_none(self):\n        \"Test search dict element in [None]\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': None},\n                    }])\n\n        dicts = Dict.search([\n                ('dico.a', 'in', [None]),\n                ])\n\n        self.assertListEqual(dicts, [dict_])\n\n    @with_transaction()\n    def test_search_element_not_in(self):\n        \"Test search dict element not in\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': \"Foo\"},\n                    }])\n\n        dicts_foo = Dict.search([\n                ('dico.a', 'not in', [\"Foo\"]),\n                ])\n        dicts_bar = Dict.search([\n                ('dico.a', 'not in', [\"Bar\"]),\n                ])\n        dicts_empty = Dict.search([\n                ('dico.a', 'not in', []),\n                ])\n        dicts_foo_b = Dict.search([\n                ('dico.b', 'not in', [\"Foo\"]),\n                ])\n\n        self.assertListEqual(dicts_foo, [])\n        self.assertListEqual(dicts_bar, [dict_])\n        self.assertListEqual(dicts_empty, [dict_])\n        self.assertListEqual(dicts_foo_b, [])\n\n    @with_transaction()\n    @unittest.skipIf(\n        backend.name != 'postgresql',\n        'in use the contain check specific to postgresql')\n    def test_search_multiselection_not_in(self):\n        \"Test search dict multi-selection with not in\"\n        pool = Pool()\n        Dict = pool.get('test.dict')\n        self.create_schema()\n\n        dict_, = Dict.create([{\n                    'dico': {'countries': ['fr', 'be']},\n                    }])\n\n        not_belgium = Dict.search([\n                ('dico.countries', 'not in', ['be']),\n                ])\n        not_germany = Dict.search([\n                ('dico.countries', 'not in', ['de']),\n                ])\n        not_belgium_germany = Dict.search([\n                ('dico.countries', 'not in', ['de', 'be']),\n                ])\n        not_empty = Dict.search([\n                ('dico.countries', 'not in', []),\n                ])\n\n        self.assertEqual(not_belgium, [])\n        self.assertEqual(not_germany, [dict_])\n        self.assertEqual(not_belgium_germany, [])\n        self.assertEqual(not_empty, [dict_])\n\n    @with_transaction()\n    def test_search_element_not_in_none(self):\n        \"Test search dict element not in [None]\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': None},\n                    }])\n\n        dicts = Dict.search([\n                ('dico.a', 'not in', [None]),\n                ])\n\n        self.assertListEqual(dicts, [])\n\n    @with_transaction()\n    def test_search_element_less(self):\n        \"Test search dict element less than\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': 1.1},\n                    }])\n\n        dicts_5 = Dict.search([\n                ('dico.a', '<', 5),\n                ])\n        dicts__5 = Dict.search([\n                ('dico.a', '<', -5),\n                ])\n        dicts_1_1 = Dict.search([\n                ('dico.a', '<', 1.1),\n                ])\n\n        self.assertListEqual(dicts_5, [dict_])\n        self.assertListEqual(dicts__5, [])\n        self.assertListEqual(dicts_1_1, [])\n\n    @with_transaction()\n    def test_search_element_less_equals(self):\n        \"Test search dict element less than or equals\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': 1.1},\n                    }])\n\n        dicts_5 = Dict.search([\n                ('dico.a', '<=', 5),\n                ])\n        dicts__5 = Dict.search([\n                ('dico.a', '<=', -5),\n                ])\n        dicts_1_1 = Dict.search([\n                ('dico.a', '<=', 1.1),\n                ])\n\n        self.assertListEqual(dicts_5, [dict_])\n        self.assertListEqual(dicts__5, [])\n        self.assertListEqual(dicts_1_1, [dict_])\n\n    @with_transaction()\n    def test_search_element_greater(self):\n        \"Test search dict element greater than\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': 1.1},\n                    }])\n\n        dicts_5 = Dict.search([\n                ('dico.a', '>', 5),\n                ])\n        dicts__5 = Dict.search([\n                ('dico.a', '>', -5),\n                ])\n        dicts_1_1 = Dict.search([\n                ('dico.a', '>', 1.1),\n                ])\n\n        self.assertListEqual(dicts_5, [])\n        self.assertListEqual(dicts__5, [dict_])\n        self.assertListEqual(dicts_1_1, [])\n\n    @with_transaction()\n    def test_search_element_greater_equals(self):\n        \"Test search dict element greater than or equals\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': 1.1},\n                    }])\n\n        dicts_5 = Dict.search([\n                ('dico.a', '>=', 5),\n                ])\n        dicts__5 = Dict.search([\n                ('dico.a', '>=', -5),\n                ])\n        dicts_1_1 = Dict.search([\n                ('dico.a', '>=', 1.1),\n                ])\n\n        self.assertListEqual(dicts_5, [])\n        self.assertListEqual(dicts__5, [dict_])\n        self.assertListEqual(dicts_1_1, [dict_])\n\n    @with_transaction()\n    def test_search_element_like(self):\n        \"Test search dict element like\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': \"Bar\"},\n                    }])\n\n        dicts_bar = Dict.search([\n                ('dico.a', 'like', \"Bar\"),\n                ])\n        dicts_b = Dict.search([\n                ('dico.a', 'like', \"B%\"),\n                ])\n        dicts_foo = Dict.search([\n                ('dico.a', 'like', \"Foo\"),\n                ])\n        dicts_f = Dict.search([\n                ('dico.a', 'like', \"F%\"),\n                ])\n        dicts_b_b = Dict.search([\n                ('dico.b', 'like', \"B%\"),\n                ])\n\n        self.assertListEqual(dicts_bar, [dict_])\n        self.assertListEqual(dicts_b, [dict_])\n        self.assertListEqual(dicts_foo, [])\n        self.assertListEqual(dicts_f, [])\n        self.assertListEqual(dicts_b_b, [])\n\n    @with_transaction()\n    def test_search_element_ilike(self):\n        \"Test search dict element ilike\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': \"Bar\"},\n                    }])\n\n        dicts_bar = Dict.search([\n                ('dico.a', 'ilike', \"bar\"),\n                ])\n        dicts_b = Dict.search([\n                ('dico.a', 'ilike', \"b%\"),\n                ])\n        dicts_foo = Dict.search([\n                ('dico.a', 'ilike', \"foo\"),\n                ])\n        dicts_f = Dict.search([\n                ('dico.a', 'ilike', \"f%\"),\n                ])\n        dicts_b_b = Dict.search([\n                ('dico.b', 'ilike', \"b%\"),\n                ])\n\n        self.assertListEqual(dicts_bar, [dict_])\n        self.assertListEqual(dicts_b, [dict_])\n        self.assertListEqual(dicts_foo, [])\n        self.assertListEqual(dicts_f, [])\n        self.assertListEqual(dicts_b_b, [])\n\n    @with_transaction()\n    def test_search_element_not_like(self):\n        \"Test search dict element not like\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': \"Bar\"},\n                    }])\n\n        dicts_bar = Dict.search([\n                ('dico.a', 'not like', \"Bar\"),\n                ])\n        dicts_b = Dict.search([\n                ('dico.a', 'not like', \"B%\"),\n                ])\n        dicts_foo = Dict.search([\n                ('dico.a', 'not like', \"Foo\"),\n                ])\n        dicts_f = Dict.search([\n                ('dico.a', 'not like', \"F%\"),\n                ])\n        dicts_b_b = Dict.search([\n                ('dico.b', 'not like', \"B%\"),\n                ])\n\n        self.assertListEqual(dicts_bar, [])\n        self.assertListEqual(dicts_b, [])\n        self.assertListEqual(dicts_foo, [dict_])\n        self.assertListEqual(dicts_f, [dict_])\n        self.assertListEqual(dicts_b_b, [])\n\n    @with_transaction()\n    def test_search_element_not_ilike(self):\n        \"Test search dict element not ilike\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n\n        dict_, = Dict.create([{\n                    'dico': {'a': \"Bar\"},\n                    }])\n\n        dicts_bar = Dict.search([\n                ('dico.a', 'not ilike', \"bar\"),\n                ])\n        dicts_b = Dict.search([\n                ('dico.a', 'not ilike', \"b%\"),\n                ])\n        dicts_foo = Dict.search([\n                ('dico.a', 'not ilike', \"foo\"),\n                ])\n        dicts_f = Dict.search([\n                ('dico.a', 'not ilike', \"f%\"),\n                ])\n        dicts_b_b = Dict.search([\n                ('dico.b', 'not ilike', \"b%\"),\n                ])\n\n        self.assertListEqual(dicts_bar, [])\n        self.assertListEqual(dicts_b, [])\n        self.assertListEqual(dicts_foo, [dict_])\n        self.assertListEqual(dicts_f, [dict_])\n        self.assertListEqual(dicts_b_b, [])\n\n    @with_transaction()\n    def test_search_element_text(self):\n        \"Test search dict element on text\"\n        pool = Pool()\n        Dict = pool.get('test.dict_text')\n        dict_, = Dict.create([{\n                    'dico': {'a': 'Foo'},\n                    }])\n\n        dicts = Dict.search([\n                ('dico.a', '=', \"Foo\"),\n                ])\n\n        self.assertListEqual(dicts, [dict_])\n\n    @with_transaction()\n    def test_search_order_element(self):\n        \"Test search order by dict element\"\n        pool = Pool()\n        Dict = pool.get('test.dict_noschema')\n        for value in [5, 3, 2]:\n            Dict.create([{'dico': {'a': 5 - value, 'b': value}}])\n\n        records = Dict.search([], order=[('dico.b', 'ASC')])\n        values = [r.dico['b'] for r in records]\n\n        self.assertListEqual(values, [2, 3, 5])\n\n    @with_transaction()\n    def test_string(self):\n        \"Test string dict\"\n        Dict = Pool().get('test.dict')\n        self.create_schema()\n\n        dict_, = Dict.create([{\n                    'dico': {'a': 1, 'type': 'arabic'},\n                    }])\n\n        self.assertDictEqual(dict_.dico_string, {'a': 1, 'type': \"Arabic\"})\n\n    @with_transaction()\n    def test_string_keys(self):\n        \"Test string keys dict\"\n        Dict = Pool().get('test.dict')\n        self.create_schema()\n\n        dict_, = Dict.create([{\n                    'dico': {'a': 1, 'type': 'arabic'},\n                    }])\n\n        self.assertDictEqual(\n            dict_.dico_string_keys, {'a': 'A', 'type': \"Type\"})\n\n    @with_transaction\n    def test_set_key(self):\n        \"Test setting a key of dict\"\n        Dict = Pool().get('test.dict')\n        self.create_schema()\n\n        dict_, = Dict.create([{\n                    'dico': {'a': 1, 'type': 'arabic'},\n                    }])\n\n        with self.assertRaises(TypeError):\n            dict.dico['a'] = 5\n\n\n@unittest.skipUnless(backend.name == 'postgresql',\n    \"unaccent works only on postgresql\")\nclass FieldDictUnaccentedTestCase(ExtensionTestCase):\n    \"Test Field Dict with unaccented searched\"\n    extension = 'unaccent'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n        super().setUpClass()\n\n    @with_transaction()\n    def test_search_unaccented_off(self):\n        \"Test searches without the unaccented feature\"\n        pool = Pool()\n        Dict = pool.get('test.dict_unaccented_off')\n        dict_, = Dict.create([{\n                    'dico': {'a': 'Stéphanie'},\n                    }])\n\n        dicts = Dict.search([\n                ('dico.a', 'ilike', 'Stephanie'),\n                ])\n\n        self.assertListEqual(dicts, [])\n\n    @with_transaction()\n    def test_search_accented(self):\n        \"Test searches of accented value\"\n        pool = Pool()\n        Dict = pool.get('test.dict_unaccented_on')\n        dict_, = Dict.create([{\n                    'dico': {'a': 'Stéphanie'},\n                    }])\n\n        dicts = Dict.search([\n                ('dico.a', 'ilike', 'Stephanie'),\n                ])\n\n        self.assertListEqual(dicts, [dict_])\n\n    @with_transaction()\n    def test_search_unaccented(self):\n        \"Test searches of unaccented value\"\n        pool = Pool()\n        Dict = pool.get('test.dict_unaccented_on')\n        dict_, = Dict.create([{\n                    'dico': {'a': 'Stephanie'},\n                    }])\n\n        dicts = Dict.search([\n                ('dico.a', 'ilike', 'Stéphanie'),\n                ])\n\n        self.assertListEqual(dicts, [dict_])\n"
  },
  {
    "path": "trytond/tests/test_field_float.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom sql import Literal\n\nfrom trytond.model.exceptions import (\n    DigitsValidationError, RequiredValidationError)\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass FieldFloatTestCase(unittest.TestCase):\n    \"Test Field Float\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create float\"\n        Float = Pool().get('test.float')\n\n        float_1_1, float_none = Float.create([{\n                    'float': 1.1,\n                    }, {\n                    'float': None,\n                    }])\n\n        self.assertEqual(float_1_1.float, 1.1)\n        self.assertEqual(float_none.float, None)\n\n    @with_transaction()\n    def test_create_15_digits(self):\n        \"Test create float 15 digits\"\n        Float = Pool().get('test.float')\n\n        float_, = Float.create([{\n                    'float': 0.123456789012345,\n                    }])\n\n        self.assertEqual(float_.float, 0.123456789012345)\n\n    @with_transaction()\n    def test_create_without_default(self):\n        \"Test create float without default\"\n        Float = Pool().get('test.float')\n\n        float_, = Float.create([{}])\n\n        self.assertEqual(float_.float, None)\n\n    @with_transaction()\n    def test_create_with_default(self):\n        \"Test create float with default\"\n        Float = Pool().get('test.float_default')\n\n        float_, = Float.create([{}])\n\n        self.assertEqual(float_.float, 5.5)\n\n    @with_transaction()\n    def test_create_with_sql_value(self):\n        \"Test create float with SQL value\"\n        Float = Pool().get('test.float')\n\n        float_, = Float.create([{'float': Literal(5.) / Literal(2.)}])\n\n        self.assertEqual(float_.float, 2.5)\n\n    @with_transaction()\n    def test_set_sql_value(self):\n        \"Test cannot set SQL value\"\n        Float = Pool().get('test.float')\n\n        float_ = Float()\n\n        with self.assertRaises(ValueError):\n            float_.float = Literal(42)\n\n    @with_transaction()\n    def test_create_non_float(self):\n        \"Test create float with non float\"\n        Float = Pool().get('test.float')\n\n        with self.assertRaises(ValueError):\n            Float.create([{\n                        'float': 'non float',\n                        }])\n\n    @with_transaction()\n    def test_create_required_with_value(self):\n        \"Test create float required with value\"\n        Float = Pool().get('test.float_required')\n\n        float_, = Float.create([{\n                    'float': 0,\n                    }])\n\n        self.assertEqual(float_.float, 0)\n\n    @with_transaction()\n    def test_create_required_without_value(self):\n        \"Test create float required without value\"\n        Float = Pool().get('test.float_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Float.create([{}])\n\n    @with_transaction()\n    def test_create_digits_valid(self):\n        \"Test create float with digits\"\n        Float = Pool().get('test.float_digits')\n\n        float_, = Float.create([{\n                    'digits': 1,\n                    'float': 1.1,\n                    }])\n\n        self.assertEqual(float_.float, 1.1)\n\n    @with_transaction()\n    def test_create_digits_invalid(self):\n        \"Test create float with invalid digits\"\n        Float = Pool().get('test.float_digits')\n\n        with self.assertRaises(DigitsValidationError):\n            Float.create([{\n                        'digits': 1,\n                        'float': 1.11,\n                        }])\n\n    @with_transaction()\n    def test_float_digits_none(self):\n        \"Test create float with no digits\"\n        Float = Pool().get('test.float_digits')\n\n        record, = Float.create([{\n                    'float': 0.123456789012345,\n                    'digits': None,\n                    }])\n\n        self.assertEqual(record.float, 0.123456789012345)\n\n    @with_transaction()\n    def test_search_equals(self):\n        \"Test search float equals\"\n        Float = Pool().get('test.float')\n        float_, = Float.create([{\n                    'float': 1.1,\n                    }])\n\n        floats_1_1 = Float.search([\n                ('float', '=', 1.1),\n                ])\n        floats_0 = Float.search([\n                ('float', '=', 0),\n                ])\n\n        self.assertListEqual(floats_1_1, [float_])\n        self.assertListEqual(floats_0, [])\n\n    @with_transaction()\n    def test_search_equals_none(self):\n        \"Test search float equals None\"\n        Float = Pool().get('test.float')\n        float_, = Float.create([{\n                    'float': None,\n                    }])\n\n        floats = Float.search([\n                ('float', '=', None),\n                ])\n\n        self.assertListEqual(floats, [float_])\n\n    @with_transaction()\n    def test_search_non_equals(self):\n        \"Test search float non equals\"\n        Float = Pool().get('test.float')\n        float_, = Float.create([{\n                    'float': 1.1,\n                    }])\n\n        floats_1_1 = Float.search([\n                ('float', '!=', 1.1),\n                ])\n        floats_0 = Float.search([\n                ('float', '!=', 0),\n                ])\n\n        self.assertListEqual(floats_1_1, [])\n        self.assertListEqual(floats_0, [float_])\n\n    @with_transaction()\n    def test_search_non_equals_none(self):\n        \"Test search float non equals None\"\n        Float = Pool().get('test.float')\n        float_, = Float.create([{\n                    'float': None,\n                    }])\n\n        floats = Float.search([\n                ('float', '!=', None),\n                ])\n\n        self.assertListEqual(floats, [])\n\n    @with_transaction()\n    def test_search_in(self):\n        \"Test search float in\"\n        Float = Pool().get('test.float')\n        float_, = Float.create([{\n                    'float': 1.1,\n                    }])\n\n        floats_1_1 = Float.search([\n                ('float', 'in', [1.1]),\n                ])\n        floats_0 = Float.search([\n                ('float', 'in', [0]),\n                ])\n        floats_empty = Float.search([\n                ('float', 'in', []),\n                ])\n\n        self.assertListEqual(floats_1_1, [float_])\n        self.assertListEqual(floats_0, [])\n        self.assertListEqual(floats_empty, [])\n\n    @with_transaction()\n    def test_search_in_none(self):\n        \"Test search float in [None]\"\n        Float = Pool().get('test.float')\n        float_, = Float.create([{\n                    'float': None,\n                    }])\n\n        floats = Float.search([\n                ('float', 'in', [None]),\n                ])\n\n        self.assertListEqual(floats, [float_])\n\n    @with_transaction()\n    def test_search_not_in(self):\n        \"Test search float_ not in\"\n        Float = Pool().get('test.float')\n        float_, = Float.create([{\n                    'float': 1.1,\n                    }])\n\n        floats_1_1 = Float.search([\n                ('float', 'not in', [1.1]),\n                ])\n        floats_0 = Float.search([\n                ('float', 'not in', [0]),\n                ])\n        floats_empty = Float.search([\n                ('float', 'not in', []),\n                ])\n\n        self.assertListEqual(floats_1_1, [])\n        self.assertListEqual(floats_0, [float_])\n        self.assertListEqual(floats_empty, [float_])\n\n    @with_transaction()\n    def test_search_not_in_none(self):\n        \"Test search float in [None]\"\n        Float = Pool().get('test.float')\n        float_, = Float.create([{\n                    'float': None,\n                    }])\n\n        floats = Float.search([\n                ('float', 'not in', [None]),\n                ])\n\n        self.assertListEqual(floats, [])\n\n    @with_transaction()\n    def test_search_in_multi(self):\n        \"Test search float in multiple\"\n        Float = Pool().get('test.float')\n        floats = Float.create([{\n                    'float': 1.1,\n                    }, {\n                    'float': 0,\n                    }])\n\n        floats_in = Float.search([\n                ('float', 'in', [0, 1.1]),\n                ])\n\n        self.assertListEqual(floats_in, floats)\n\n    @with_transaction()\n    def test_search_not_in_multi(self):\n        \"Test search float_ not in multiple\"\n        Float = Pool().get('test.float')\n        Float.create([{\n                    'float': 1.1,\n                    }, {\n                    'float': 0,\n                    }])\n\n        floats = Float.search([\n                ('float', 'not in', [0, 1.1]),\n                ])\n\n        self.assertListEqual(floats, [])\n\n    @with_transaction()\n    def test_search_less(self):\n        \"Test search float_ less than\"\n        Float = Pool().get('test.float')\n        float_, = Float.create([{\n                    'float': 1.1,\n                    }])\n\n        floats_5 = Float.search([\n                ('float', '<', 5),\n                ])\n        floats__5 = Float.search([\n                ('float', '<', -5),\n                ])\n        floats_1_1 = Float.search([\n                ('float', '<', 1.1),\n                ])\n\n        self.assertListEqual(floats_5, [float_])\n        self.assertListEqual(floats__5, [])\n        self.assertListEqual(floats_1_1, [])\n\n    @with_transaction()\n    def test_search_less_equals(self):\n        \"Test search float_ less than or equals\"\n        Float = Pool().get('test.float')\n        float_, = Float.create([{\n                    'float': 1.1,\n                    }])\n\n        floats_5 = Float.search([\n                ('float', '<=', 5),\n                ])\n        floats__5 = Float.search([\n                ('float', '<=', -5),\n                ])\n        floats_1 = Float.search([\n                ('float', '<=', 1.1),\n                ])\n\n        self.assertListEqual(floats_5, [float_])\n        self.assertListEqual(floats__5, [])\n        self.assertListEqual(floats_1, [float_])\n\n    @with_transaction()\n    def test_search_greater(self):\n        \"Test search float_ greater than\"\n        Float = Pool().get('test.float')\n        float_, = Float.create([{\n                    'float': 1.1,\n                    }])\n\n        floats_5 = Float.search([\n                ('float', '>', 5),\n                ])\n        floats__5 = Float.search([\n                ('float', '>', -5),\n                ])\n        floats_1_1 = Float.search([\n                ('float', '>', 1.1),\n                ])\n\n        self.assertListEqual(floats_5, [])\n        self.assertListEqual(floats__5, [float_])\n        self.assertListEqual(floats_1_1, [])\n\n    @with_transaction()\n    def test_search_greater_equals(self):\n        \"Test search float greater than or equals\"\n        Float = Pool().get('test.float')\n        float_, = Float.create([{\n                    'float': 1.1,\n                    }])\n\n        floats_5 = Float.search([\n                ('float', '>=', 5),\n                ])\n        floats__5 = Float.search([\n                ('float', '>=', -5),\n                ])\n        floats_1 = Float.search([\n                ('float', '>=', 1.1),\n                ])\n\n        self.assertListEqual(floats_5, [])\n        self.assertListEqual(floats__5, [float_])\n        self.assertListEqual(floats_1, [float_])\n\n    @with_transaction()\n    def test_write(self):\n        \"Test write float\"\n        Float = Pool().get('test.float')\n        float_, = Float.create([{\n                    'float': 1.1,\n                    }])\n\n        Float.write([float_], {\n                'float': 0,\n                })\n\n        self.assertEqual(float_.float, 0)\n\n    @with_transaction()\n    def test_write_non_float(self):\n        \"Test write float with non float\"\n        Float = Pool().get('test.float')\n        float_, = Float.create([{\n                    'float': 1.1,\n                    }])\n\n        with self.assertRaises(ValueError):\n            Float.write([float_], {\n                    'float': 'non float',\n                    })\n\n    @with_transaction()\n    def test_write_digits_invalid_value(self):\n        \"Test write float with invalid value for digits\"\n        Float = Pool().get('test.float_digits')\n\n        float_, = Float.create([{\n                    'digits': 1,\n                    'float': 1.1,\n                    }])\n\n        with self.assertRaises(DigitsValidationError):\n            Float.write([float_], {\n                    'float': 1.11,\n                    })\n\n    @with_transaction()\n    def test_write_digits_invalid_digits(self):\n        \"Test write float with invalid digits for value\"\n        Float = Pool().get('test.float_digits')\n\n        float_, = Float.create([{\n                    'digits': 1,\n                    'float': 1.1,\n                    }])\n\n        with self.assertRaises(DigitsValidationError):\n            Float.write([float_], {\n                    'digits': 0,\n                    })\n"
  },
  {
    "path": "trytond/tests/test_field_function.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\nfrom unittest.mock import patch\n\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\n\nclass FieldFunctionTestCase(unittest.TestCase):\n    \"Test Field Function\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_accessor(self):\n        \"Test accessing field on unsaved instance\"\n        pool = Pool()\n        Model = pool.get('test.function.accessor')\n        Target = pool.get('test.function.accessor.target')\n\n        target = Target()\n        target.save()\n        record = Model()\n        record.target = target\n\n        self.assertEqual(record.function, target)\n\n    @with_transaction()\n    def test_getter_context(self):\n        \"Test getter context\"\n        pool = Pool()\n        Model = pool.get('test.function.getter_context')\n\n        record = Model()\n        record.save()\n\n        with Transaction().set_context(language='en', test='foo'):\n            record = Model(record.id)\n\n        self.assertEqual(record.function_with_context, 'en - foo')\n        self.assertEqual(record.function_without_context, 'en - empty')\n\n    @with_transaction()\n    def test_getter_cached_readonly_transaction(self):\n        \"Test getter cached in read only transaction\"\n        pool = Pool()\n        Model = pool.get('test.function.getter_context')\n\n        with Transaction().new_transaction(readonly=True), \\\n                patch.object(Model, 'getter') as getter:\n            record, = Model.search([], limit=1)\n            record.function_with_context\n            record.function_without_context\n            self.assertEqual(getter.call_count, 2)\n\n            getter.reset_mock()\n            with Transaction().set_context(test='foo'):\n                record = Model(record.id)\n            record.function_with_context\n            record.function_without_context\n            self.assertEqual(getter.call_count, 1)\n\n            getter.reset_mock()\n            # Change transaction key context\n            with Transaction().set_context(language='en'):\n                record = Model(record.id)\n            record.function_with_context\n            record.function_without_context\n            self.assertEqual(getter.call_count, 2)\n\n    @with_transaction()\n    def test_getter_local_cache(self):\n        \"Test getter use local cache\"\n        pool = Pool()\n        Model = pool.get('test.function.getter_local_cache')\n\n        record = Model()\n        record.save()\n        with patch.object(Model, 'get_function1') as getter:\n            getter.return_value = 'test'\n\n            Model.read([record.id], ['function1', 'function2'])\n\n            self.assertEqual(getter.call_count, 1)\n"
  },
  {
    "path": "trytond/tests/test_field_integer.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom sql import Literal\n\nfrom trytond.model.exceptions import (\n    DomainValidationError, RequiredValidationError)\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass FieldIntegerTestCase(unittest.TestCase):\n    \"Test Field Integer\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create integer\"\n        Integer = Pool().get('test.integer')\n\n        integer_1, integer_none = Integer.create([{\n                    'integer': 1,\n                    }, {\n                    'integer': None,\n                    }])\n\n        self.assertEqual(integer_1.integer, 1)\n        self.assertEqual(integer_none.integer, None)\n\n    @with_transaction()\n    def test_create_without_default(self):\n        \"Test create integer without default\"\n        Integer = Pool().get('test.integer')\n\n        integer, = Integer.create([{}])\n\n        self.assertEqual(integer.integer, None)\n\n    @with_transaction()\n    def test_create_with_default(self):\n        \"Test create integer with default\"\n        Integer = Pool().get('test.integer_default')\n\n        integer, = Integer.create([{}])\n\n        self.assertEqual(integer.integer, 5)\n\n    @with_transaction()\n    def test_create_with_sql_value(self):\n        \"Test create integer with SQL value\"\n        Integer = Pool().get('test.integer_default')\n\n        integer, = Integer.create([{'integer': Literal(5)}])\n\n        self.assertEqual(integer.integer, 5)\n\n    @with_transaction()\n    def test_set_sql_value(self):\n        \"Test cannot set SQL value\"\n        Integer = Pool().get('test.integer_default')\n\n        integer = Integer()\n\n        with self.assertRaises(ValueError):\n            integer.integer = Literal(42)\n\n    @with_transaction()\n    def test_create_non_integer(self):\n        \"Test create integer with non integer\"\n        Integer = Pool().get('test.integer')\n\n        with self.assertRaises(ValueError):\n            Integer.create([{\n                        'integer': 'non integer',\n                        }])\n\n    @with_transaction()\n    def test_create_required_with_value(self):\n        \"Test create integer required with value\"\n        Integer = Pool().get('test.integer_required')\n\n        integer, = Integer.create([{\n                    'integer': 0,\n                    }])\n\n        self.assertEqual(integer.integer, 0)\n\n    @with_transaction()\n    def test_create_required_without_value(self):\n        \"Test create integer required without value\"\n        Integer = Pool().get('test.integer_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Integer.create([{}])\n\n    @with_transaction()\n    def test_create_with_domain_valid(self):\n        \"Test create integer with domain valid\"\n        Integer = Pool().get('test.integer_domain')\n\n        integer, = Integer.create([{\n                    'integer': 100,\n                    }])\n\n        self.assertEqual(integer.integer, 100)\n\n    @with_transaction()\n    def test_create_with_domain_invalid(self):\n        \"Test create integer with domain invalid\"\n        Integer = Pool().get('test.integer_domain')\n\n        with self.assertRaises(DomainValidationError):\n            Integer.create([{\n                        'integer': 10,\n                        }])\n\n    @with_transaction()\n    def test_search_equals(self):\n        \"Test search integer equals\"\n        Integer = Pool().get('test.integer')\n        integer, = Integer.create([{\n                    'integer': 1,\n                    }])\n\n        integers_1 = Integer.search([\n                ('integer', '=', 1),\n                ])\n        integers_0 = Integer.search([\n                ('integer', '=', 0),\n                ])\n\n        self.assertListEqual(integers_1, [integer])\n        self.assertListEqual(integers_0, [])\n\n    @with_transaction()\n    def test_search_non_equals(self):\n        \"Test search integer non equals\"\n        Integer = Pool().get('test.integer')\n        integer, = Integer.create([{\n                    'integer': 1,\n                    }])\n\n        integers_1 = Integer.search([\n                ('integer', '!=', 1),\n                ])\n        integers_0 = Integer.search([\n                ('integer', '!=', 0),\n                ])\n\n        self.assertListEqual(integers_1, [])\n        self.assertListEqual(integers_0, [integer])\n\n    @with_transaction()\n    def test_search_in(self):\n        \"Test search integer in\"\n        Integer = Pool().get('test.integer')\n        integer, = Integer.create([{\n                    'integer': 1,\n                    }])\n\n        integers_1 = Integer.search([\n                ('integer', 'in', [1]),\n                ])\n        integers_0 = Integer.search([\n                ('integer', 'in', [0]),\n                ])\n        integers_empty = Integer.search([\n                ('integer', 'in', []),\n                ])\n\n        self.assertListEqual(integers_1, [integer])\n        self.assertListEqual(integers_0, [])\n        self.assertListEqual(integers_empty, [])\n\n    @with_transaction()\n    def test_search_not_in(self):\n        \"Test search integer not in\"\n        Integer = Pool().get('test.integer')\n        integer, = Integer.create([{\n                    'integer': 1,\n                    }])\n\n        integers_1 = Integer.search([\n                ('integer', 'not in', [1]),\n                ])\n        integers_0 = Integer.search([\n                ('integer', 'not in', [0]),\n                ])\n        integers_empty = Integer.search([\n                ('integer', 'not in', []),\n                ])\n\n        self.assertListEqual(integers_1, [])\n        self.assertListEqual(integers_0, [integer])\n        self.assertListEqual(integers_empty, [integer])\n\n    @with_transaction()\n    def test_search_in_multi(self):\n        \"Test search integer in multiple\"\n        Integer = Pool().get('test.integer')\n        integers = Integer.create([{\n                    'integer': 1,\n                    }, {\n                    'integer': 0,\n                    }])\n\n        integers_in = Integer.search([\n                ('integer', 'in', [0, 1]),\n                ])\n\n        self.assertListEqual(integers_in, integers)\n\n    @with_transaction()\n    def test_search_not_in_multi(self):\n        \"Test search integer not in multiple\"\n        Integer = Pool().get('test.integer')\n        Integer.create([{\n                    'integer': 1,\n                    }, {\n                    'integer': 0,\n                    }])\n\n        integers = Integer.search([\n                ('integer', 'not in', [0, 1]),\n                ])\n\n        self.assertListEqual(integers, [])\n\n    @with_transaction()\n    def test_search_less(self):\n        \"Test search integer less than\"\n        Integer = Pool().get('test.integer')\n        integer, = Integer.create([{\n                    'integer': 1,\n                    }])\n\n        integers_5 = Integer.search([\n                ('integer', '<', 5),\n                ])\n        integers__5 = Integer.search([\n                ('integer', '<', -5),\n                ])\n        integers_1 = Integer.search([\n                ('integer', '<', 1),\n                ])\n\n        self.assertListEqual(integers_5, [integer])\n        self.assertListEqual(integers__5, [])\n        self.assertListEqual(integers_1, [])\n\n    @with_transaction()\n    def test_search_less_equals(self):\n        \"Test search integer less than or equals\"\n        Integer = Pool().get('test.integer')\n        integer, = Integer.create([{\n                    'integer': 1,\n                    }])\n\n        integers_5 = Integer.search([\n                ('integer', '<=', 5),\n                ])\n        integers__5 = Integer.search([\n                ('integer', '<=', -5),\n                ])\n        integers_1 = Integer.search([\n                ('integer', '<=', 1),\n                ])\n\n        self.assertListEqual(integers_5, [integer])\n        self.assertListEqual(integers__5, [])\n        self.assertListEqual(integers_1, [integer])\n\n    @with_transaction()\n    def test_search_greater(self):\n        \"Test search integer greater than\"\n        Integer = Pool().get('test.integer')\n        integer, = Integer.create([{\n                    'integer': 1,\n                    }])\n\n        integers_5 = Integer.search([\n                ('integer', '>', 5),\n                ])\n        integers__5 = Integer.search([\n                ('integer', '>', -5),\n                ])\n        integers_1 = Integer.search([\n                ('integer', '>', 1),\n                ])\n\n        self.assertListEqual(integers_5, [])\n        self.assertListEqual(integers__5, [integer])\n        self.assertListEqual(integers_1, [])\n\n    @with_transaction()\n    def test_search_greater_equals(self):\n        \"Test search integer greater than or equals\"\n        Integer = Pool().get('test.integer')\n        integer, = Integer.create([{\n                    'integer': 1,\n                    }])\n\n        integers_5 = Integer.search([\n                ('integer', '>=', 5),\n                ])\n        integers__5 = Integer.search([\n                ('integer', '>=', -5),\n                ])\n        integers_1 = Integer.search([\n                ('integer', '>=', 1),\n                ])\n\n        self.assertListEqual(integers_5, [])\n        self.assertListEqual(integers__5, [integer])\n        self.assertListEqual(integers_1, [integer])\n\n    @with_transaction()\n    def test_write(self):\n        \"Test write integer\"\n        Integer = Pool().get('test.integer')\n        integer, = Integer.create([{\n                    'integer': 1,\n                    }])\n\n        Integer.write([integer], {\n                'integer': 0,\n                })\n\n        self.assertEqual(integer.integer, 0)\n\n    @with_transaction()\n    def test_write_non_integer(self):\n        \"Test write integer with non integer\"\n        Integer = Pool().get('test.integer')\n        integer, = Integer.create([{\n                    'integer': 1,\n                    }])\n\n        with self.assertRaises(ValueError):\n            Integer.write([integer], {\n                    'integer': 'non integer',\n                    })\n"
  },
  {
    "path": "trytond/tests/test_field_many2many.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond.model.exceptions import (\n    RequiredValidationError, SizeValidationError)\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass CommonTestCaseMixin:\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create many2many\"\n        Many2Many = self.Many2Many()\n\n        many2many, = Many2Many.create([{\n                    'targets': [\n                        ('create', [{\n                                    'name': \"Target\",\n                                    }]),\n                        ],\n                    }])\n\n        self.assertEqual(len(many2many.targets), 1)\n\n    @with_transaction()\n    def test_search_equals(self):\n        \"Test search many2many equals\"\n        Many2Many = self.Many2Many()\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        many2manys = Many2Many.search([\n                ('targets', '=', \"Target\"),\n                ])\n\n        self.assertListEqual(many2manys, [many2many])\n\n    @with_transaction()\n    def test_search_equals_no_link(self):\n        \"Test search many2many equals without link\"\n        Many2Many = self.Many2Many()\n        many2many, no_link = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }, {\n                    }])\n\n        many2manys = Many2Many.search([\n                ('targets', '=', \"Target\"),\n                ])\n\n        self.assertListEqual(many2manys, [many2many])\n\n    @with_transaction()\n    def test_search_non_equals(self):\n        \"Test search many2many non equals\"\n        Many2Many = self.Many2Many()\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        many2manys = Many2Many.search([\n                ('targets', '!=', \"Target\"),\n                ])\n\n        self.assertListEqual(many2manys, [])\n\n    @with_transaction()\n    def test_search_equals_none(self):\n        \"Test search many2many equals None\"\n        Many2Many = self.Many2Many()\n        many2many1, many2many2 = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }, {\n                    'targets': None,\n                    }])\n\n        many2manys = Many2Many.search([\n                ('targets', '=', None),\n                ])\n\n        self.assertListEqual(many2manys, [many2many2])\n\n    @with_transaction()\n    def test_search_non_equals_none(self):\n        \"Test search many2many non equals None\"\n        Many2Many = self.Many2Many()\n        many2many1, many2many2 = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }, {\n                    'targets': None,\n                    }])\n\n        many2manys = Many2Many.search([\n                ('targets', '!=', None),\n                ])\n\n        self.assertListEqual(many2manys, [many2many1])\n\n    @with_transaction()\n    def test_search_non_equals_no_link(self):\n        \"Test search many2many non equals without link\"\n        Many2Many = self.Many2Many()\n        many2many, no_link = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }, {\n                    }])\n\n        many2manys = Many2Many.search([\n                ('targets', '!=', \"Target\"),\n                ])\n\n        self.assertListEqual(many2manys, [no_link])\n\n    @with_transaction()\n    def test_search_in(self):\n        \"Test search many2many in\"\n        Many2Many = self.Many2Many()\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n        target, = many2many.targets\n\n        many2manys = Many2Many.search([\n                ('targets', 'in', [target.id]),\n                ])\n\n        self.assertListEqual(many2manys, [many2many])\n\n    @with_transaction()\n    def test_search_in_0(self):\n        \"Test search many2many in [0]\"\n        Many2Many = self.Many2Many()\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        many2manys = Many2Many.search([\n                ('targets', 'in', [0]),\n                ])\n\n        self.assertListEqual(many2manys, [])\n\n    @with_transaction()\n    def test_search_in_empty(self):\n        \"Test search many2many in []\"\n        Many2Many = self.Many2Many()\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        many2manys = Many2Many.search([\n                ('targets', 'in', []),\n                ])\n\n        self.assertListEqual(many2manys, [])\n\n    @with_transaction()\n    def test_search_not_in(self):\n        \"Test search many2many not in\"\n        Many2Many = self.Many2Many()\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n        target, = many2many.targets\n\n        many2manys = Many2Many.search([\n                ('targets', 'not in', [target.id]),\n                ])\n\n        self.assertListEqual(many2manys, [])\n\n    @with_transaction()\n    def test_search_not_in_0(self):\n        \"Test search many2many not in [0]\"\n        Many2Many = self.Many2Many()\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        many2manys = Many2Many.search([\n                ('targets', 'not in', [0]),\n                ])\n\n        self.assertListEqual(many2manys, [many2many])\n\n    @with_transaction()\n    def test_search_not_in_empty(self):\n        \"Test search many2many not in []\"\n        Many2Many = self.Many2Many()\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        many2manys = Many2Many.search([\n                ('targets', 'not in', []),\n                ])\n\n        self.assertListEqual(many2manys, [many2many])\n\n    @with_transaction()\n    def test_search_join(self):\n        \"Test search many2many equals\"\n        Many2Many = self.Many2Many()\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        many2manys = Many2Many.search([\n                ('targets.name', '=', \"Target\"),\n                ])\n\n        self.assertListEqual(many2manys, [many2many])\n\n    @with_transaction()\n    def test_search_where(self):\n        \"Test search many2many where\"\n        Many2Many = self.Many2Many()\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        many2manys = Many2Many.search([\n                ('targets', 'where', [('name', '=', \"Target\")]),\n                ])\n\n        self.assertListEqual(many2manys, [many2many])\n\n    @with_transaction()\n    def test_search_not_where(self):\n        \"Test search many2many not where\"\n        Many2Many = self.Many2Many()\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        many2manys = Many2Many.search([\n                ('targets', 'not where', [('name', '=', \"Target\")]),\n                ])\n\n        self.assertListEqual(many2manys, [])\n\n    @with_transaction()\n    def test_search_not_where_others(self):\n        \"Test search many2many not where with others\"\n        Many2Many = self.Many2Many()\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [\n                                {'name': \"Target\"}, {'name': \"Foo\"}])],\n                    }])\n\n        many2manys = Many2Many.search([\n                ('targets', 'not where', [('name', '=', \"Target\")]),\n                ])\n\n        self.assertListEqual(many2manys, [])\n\n    @with_transaction()\n    def test_write_write(self):\n        \"Test write many2many write\"\n        Many2Many = self.Many2Many()\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Foo\"}])],\n                    }])\n        target, = many2many.targets\n\n        Many2Many.write([many2many], {\n                'targets': [\n                    ('write', [target.id], {\n                            'name': \"Bar\",\n                            }),\n                    ],\n                })\n\n        self.assertEqual(target.name, \"Bar\")\n\n    @with_transaction()\n    def test_write_add(self):\n        \"Test write many2many add\"\n        Many2Many = self.Many2Many()\n        Target = self.Many2ManyTarget()\n        many2many, = Many2Many.create([{}])\n        target, = Target.create([{}])\n\n        Many2Many.write([many2many], {\n                'targets': [\n                    ('add', [target.id]),\n                    ],\n                })\n\n        self.assertTupleEqual(many2many.targets, (target,))\n\n    @with_transaction()\n    def test_write_remove(self):\n        \"Test write many2many remove\"\n        Many2Many = self.Many2Many()\n        Target = self.Many2ManyTarget()\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Foo\"}])],\n                    }])\n        target, = many2many.targets\n\n        Many2Many.write([many2many], {\n                'targets': [\n                    ('remove', [target.id]),\n                    ],\n                })\n        targets = Target.search([('id', '=', target.id)])\n\n        self.assertTupleEqual(many2many.targets, ())\n        self.assertListEqual(targets, [target])\n\n    @with_transaction()\n    def test_write_copy(self):\n        \"Test write many2many copy\"\n        Many2Many = self.Many2Many()\n        Target = self.Many2ManyTarget()\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [{'name': \"Foo\"}])],\n                    }])\n        target1, = many2many.targets\n\n        Many2Many.write([many2many], {\n                'targets': [\n                    ('copy', [target1.id], {'name': \"Bar\"}),\n                    ],\n                })\n        target2, = Target.search([('id', '!=', target1.id)])\n\n        self.assertListEqual(\n            sorted(many2many.targets), sorted((target1, target2)))\n\n    @with_transaction()\n    def test_write_delete(self):\n        \"Test write many2many delete\"\n        Many2Many = self.Many2Many()\n        Target = self.Many2ManyTarget()\n        many2many, = Many2Many.create([{\n                    'targets': [(\n                            'create', [{'name': \"Foo\"}, {'name': \"Bar\"}])],\n                    }])\n        target1, target2 = many2many.targets\n\n        Many2Many.write([many2many], {\n                'targets': [\n                    ('delete', [target1.id]),\n                    ],\n                })\n        targets = Target.search([])\n\n        self.assertTupleEqual(many2many.targets, (target2,))\n        self.assertListEqual(targets, [target2])\n\n    @with_transaction()\n    def test_write_not_readd(self):\n        \"Test write many2many do not re-add existing\"\n        pool = Pool()\n        Many2Many = self.Many2Many()\n        Relation = pool.get(Many2Many.targets.relation_name)\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [{}])],\n                    }])\n\n        target, = many2many.targets\n\n        Many2Many.write([many2many], {\n                    'targets': [('add', {target.id})],\n                    })\n\n        relation, = Relation.search([])\n        self.assertIsNone(relation.write_date)\n\n\nclass FieldMany2ManyTestCase(unittest.TestCase, CommonTestCaseMixin):\n    \"Test Field Many2Many\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    def Many2Many(self):\n        return Pool().get('test.many2many')\n\n    def Many2ManyTarget(self):\n        return Pool().get('test.many2many.target')\n\n    @with_transaction()\n    def test_create_required_with_value(self):\n        \"Test create many2many required with value\"\n        Many2Many = Pool().get('test.many2many_required')\n\n        many2many, = Many2Many.create([{\n                    'targets': [\n                        ('create', [{\n                                    'name': \"Target\",\n                                    }]),\n                        ],\n                    }])\n\n        self.assertEqual(len(many2many.targets), 1)\n\n    @with_transaction()\n    def test_create_required_without_value(self):\n        \"Test create many2many required without value\"\n        Many2Many = Pool().get('test.many2many_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Many2Many.create([{}])\n\n    @with_transaction()\n    def test_create_size_valid(self):\n        \"Test create many2many size valid\"\n        Many2Many = Pool().get('test.many2many_size')\n\n        many2many, = Many2Many.create([{\n                    'targets': [\n                        ('create', [{}] * 3),\n                        ],\n                    }])\n\n        self.assertEqual(len(many2many.targets), 3)\n\n    @with_transaction()\n    def test_create_size_invalid(self):\n        \"Test create many2many size invalid\"\n        Many2Many = Pool().get('test.many2many_size')\n\n        with self.assertRaises(SizeValidationError):\n            Many2Many.create([{\n                        'targets': [\n                            ('create', [{}] * 4),\n                            ],\n                        }])\n\n    @with_transaction()\n    def test_create_filter(self):\n        \"Test create many2many with filter\"\n        Many2Many = Pool().get('test.many2many_filter')\n\n        filtered, = Many2Many.create([{\n                    'targets': [\n                        ('create', [{'value': x} for x in range(4)])],\n                    }])\n        filtered_target, = filtered.filtered_targets\n\n        self.assertEqual(len(filtered.targets), 4)\n        self.assertEqual(filtered_target.value, 3)\n\n    @with_transaction()\n    def test_create_filter_domain(self):\n        \"Test create many2many with filter and domain\"\n        Many2Many = Pool().get('test.many2many_filter_domain')\n\n        filtered, = Many2Many.create([{\n                    'targets': [\n                        ('create', [{'value': x} for x in range(4)])],\n                    }])\n        filtered_target, = filtered.filtered_targets\n\n        self.assertEqual(len(filtered.targets), 4)\n        self.assertEqual(filtered_target.value, 3)\n\n    @with_transaction()\n    def test_search_non_equals_filter(self):\n        \"Test search many2many non equals with filter\"\n        Many2Many = Pool().get('test.many2many_filter')\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [{'value': -1}])],\n                    }])\n\n        many2manys = Many2Many.search([('targets', '!=', None)])\n        many2manys_filtered = Many2Many.search(\n            [('filtered_targets', '!=', None)])\n\n        self.assertListEqual(many2manys, [many2many])\n        self.assertListEqual(many2manys_filtered, [])\n\n    @with_transaction()\n    def test_search_join_filter(self):\n        \"Test search many2many join with filter\"\n        Many2Many = Pool().get('test.many2many_filter')\n        many2many, = Many2Many.create([{\n                    'targets': [('create', [{'value': -1}])],\n                    }])\n\n        many2manys = Many2Many.search([('targets.value', '=', -1)])\n        many2manys_filtered = Many2Many.search(\n            [('filtered_targets.value', '=', -1)])\n\n        self.assertListEqual(many2manys, [many2many])\n        self.assertListEqual(many2manys_filtered, [])\n\n    def create_tree(self, Many2Many):\n        self.second1, self.second2, self.second3, self.second4 = (\n            Many2Many.create([\n                    {},\n                    {},\n                    {},\n                    {},\n                    ]))\n        self.first1, self.first2, self.first3, self.first4 = Many2Many.create([\n                {'children': [('add', [self.second1.id, self.second2.id])]},\n                {'children': [('add', [self.second1.id, self.second2.id])]},\n                {'children': [('add', [self.second3.id, self.second4.id])]},\n                {'children': [('add', [self.second4.id])]},\n                ])\n        self.root1, self.root2 = Many2Many.create([\n                {'children': [\n                        ('add', [\n                                self.first1.id, self.first2.id,\n                                self.second1.id])]},\n                {'children': [('add', [self.first3.id, self.first4.id])]},\n                ])\n\n    @with_transaction()\n    def test_search_child_of_root1(self):\n        \"Test search many2many child of root1\"\n        Many2Many = Pool().get('test.many2many_tree')\n        self.create_tree(Many2Many)\n\n        result = Many2Many.search([\n                ('parents', 'child_of', [self.root1.id]),\n                ])\n\n        self.assertListEqual(\n            sorted(result),\n            sorted([self.root1,\n                    self.first1, self.first2,\n                    self.second1, self.second2]))\n\n    @with_transaction()\n    def test_search_not_child_of_root1(self):\n        \"Test search many2many not child of root1\"\n        Many2Many = Pool().get('test.many2many_tree')\n        self.create_tree(Many2Many)\n\n        result = Many2Many.search([\n                ('parents', 'not child_of', [self.root1.id]),\n                ])\n\n        self.assertListEqual(\n            sorted(result),\n            sorted([self.root2,\n                    self.first3, self.first4,\n                    self.second3, self.second4]))\n\n    @with_transaction()\n    def test_search_child_of_second1(self):\n        \"Test search many2many child of second1\"\n        Many2Many = Pool().get('test.many2many_tree')\n        self.create_tree(Many2Many)\n\n        result = Many2Many.search([\n                ('parents', 'child_of', [self.second1.id]),\n                ])\n\n        self.assertListEqual(result, [self.second1])\n\n    @with_transaction()\n    def test_search_not_child_of_second1(self):\n        \"Test search many2many not child of second1\"\n        Many2Many = Pool().get('test.many2many_tree')\n        self.create_tree(Many2Many)\n\n        result = Many2Many.search([\n                ('parents', 'not child_of', [self.second1.id]),\n                ])\n\n        self.assertListEqual(\n            sorted(result),\n            sorted([self.root1, self.root2,\n                    self.first1, self.first2, self.first3, self.first4,\n                    self.second2, self.second3, self.second4]))\n\n    @with_transaction()\n    def test_search_child_of_empty(self):\n        \"Test search many2many child of empty\"\n        Many2Many = Pool().get('test.many2many_tree')\n        self.create_tree(Many2Many)\n\n        result = Many2Many.search([\n                ('parents', 'child_of', []),\n                ])\n\n        self.assertListEqual(result, [])\n\n    @with_transaction()\n    def test_search_not_child_of_empty(self):\n        \"Test search many2many not child of empty\"\n        Many2Many = Pool().get('test.many2many_tree')\n        self.create_tree(Many2Many)\n\n        result = Many2Many.search([\n                ('parents', 'not child_of', []),\n                ])\n\n        self.assertListEqual(\n            sorted(result),\n            sorted([self.root1, self.root2,\n                    self.first1, self.first2, self.first3, self.first4,\n                    self.second1, self.second2, self.second3, self.second4]))\n\n    @with_transaction()\n    def test_search_parent_of_root1(self):\n        \"Test search many2many parent of root1\"\n        Many2Many = Pool().get('test.many2many_tree')\n        self.create_tree(Many2Many)\n\n        result = Many2Many.search([\n                ('parents', 'parent_of', [self.root1.id]),\n                ])\n\n        self.assertListEqual(result, [self.root1])\n\n    @with_transaction()\n    def test_search_not_parent_of_root1(self):\n        \"Test search many2many not parent of root1\"\n        Many2Many = Pool().get('test.many2many_tree')\n        self.create_tree(Many2Many)\n\n        result = Many2Many.search([\n                ('parents', 'not parent_of', [self.root1.id]),\n                ])\n\n        self.assertListEqual(\n            sorted(result),\n            sorted([self.root2,\n                    self.first1, self.first2, self.first3, self.first4,\n                    self.second1, self.second2, self.second3, self.second4]))\n\n    @with_transaction()\n    def test_search_parent_of_second4(self):\n        \"Test search many2many parent of second4\"\n        Many2Many = Pool().get('test.many2many_tree')\n        self.create_tree(Many2Many)\n\n        result = Many2Many.search([\n                ('parents', 'parent_of', [self.second4.id]),\n                ])\n\n        self.assertListEqual(\n            sorted(result),\n            sorted([self.root2, self.first3, self.first4, self.second4]))\n\n    @with_transaction()\n    def test_search_not_parent_of_second4(self):\n        \"Test search many2many not parent of second4\"\n        Many2Many = Pool().get('test.many2many_tree')\n        self.create_tree(Many2Many)\n\n        result = Many2Many.search([\n                ('parents', 'not parent_of', [self.second4.id]),\n                ])\n\n        self.assertListEqual(\n            sorted(result),\n            sorted([self.root1,\n                    self.first1, self.first2,\n                    self.second1, self.second2, self.second3]))\n\n    @with_transaction()\n    def test_search_parent_of_empty(self):\n        \"Test search many2many parent of empty\"\n        Many2Many = Pool().get('test.many2many_tree')\n        self.create_tree(Many2Many)\n\n        result = Many2Many.search([\n                ('parents', 'parent_of', []),\n                ])\n\n        self.assertListEqual(result, [])\n\n    @with_transaction()\n    def test_search_not_parent_of_empty(self):\n        \"Test search many2many not parent of empty\"\n        Many2Many = Pool().get('test.many2many_tree')\n        self.create_tree(Many2Many)\n\n        result = Many2Many.search([\n                ('parents', 'not parent_of', []),\n                ])\n\n        self.assertListEqual(\n            sorted(result),\n            sorted([self.root1, self.root2,\n                    self.first1, self.first2, self.first3, self.first4,\n                    self.second1, self.second2, self.second3, self.second4]))\n\n    @with_transaction()\n    def test_context_attribute(self):\n        \"Test context on many2many attribute\"\n        pool = Pool()\n        Many2Many = pool.get('test.many2many_context')\n\n        record, = Many2Many.create([{\n                    'targets': [('create', [{}])],\n                    }])\n\n        self.assertEqual(record.targets[0].context, 'foo')\n\n    @with_transaction()\n    def test_context_read(self):\n        \"Test context on many2many read\"\n        pool = Pool()\n        Many2Many = pool.get('test.many2many_context')\n\n        record, = Many2Many.create([{\n                    'targets': [('create', [{}])],\n                    }])\n        data, = Many2Many.read([record.id], ['targets.context'])\n\n        self.assertEqual(data['targets.'][0]['context'], 'foo')\n\n    @with_transaction()\n    def test_context_set(self):\n        \"Test context on many2many set\"\n        pool = Pool()\n        Many2Many = pool.get('test.many2many_context')\n        Target = pool.get('test.many2many_context.target')\n\n        target, = Target.create([{}])\n        record = Many2Many(targets=[target.id])\n\n        self.assertEqual(record.targets[0].context, 'foo')\n\n\nclass FieldMany2ManyReferenceTestCase(unittest.TestCase, CommonTestCaseMixin):\n    \"Test Field Many2Many Reference\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    def Many2Many(self):\n        return Pool().get('test.many2many_reference')\n\n    def Many2ManyTarget(self):\n        return Pool().get('test.many2many_reference.target')\n"
  },
  {
    "path": "trytond/tests/test_field_many2one.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond.model.exceptions import DomainValidationError\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass FieldMany2OneTestCase(unittest.TestCase):\n    \"Test Field Many2One\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_create_id(self):\n        \"Test create many2one with id\"\n        pool = Pool()\n        Target = pool.get('test.many2one_target')\n        Many2One = pool.get('test.many2one')\n        target, = Target.create([{}])\n\n        many2one, = Many2One.create([{\n                    'many2one': target.id,\n                    }])\n\n        self.assertEqual(many2one.many2one, target)\n\n    @with_transaction()\n    def test_create_instance(self):\n        \"Test create many2one with instance\"\n        pool = Pool()\n        Target = pool.get('test.many2one_target')\n        Many2One = pool.get('test.many2one')\n        target, = Target.create([{}])\n\n        many2one, = Many2One.create([{\n                    'many2one': target,\n                    }])\n\n        self.assertEqual(many2one.many2one, target)\n\n    @with_transaction()\n    def test_create_no_foreign_key(self):\n        \"Test create many2one without foreign key\"\n        pool = Pool()\n        Target = pool.get('test.many2one_target_storage')\n        Many2One = pool.get('test.many2one_no_foreign_key')\n\n        many2one = Many2One(many2one=1)\n        many2one.save()\n\n        self.assertEqual(many2one.many2one, Target(1))\n\n    @with_transaction()\n    def test_create_with_domain_valid(self):\n        \"Test create many2one with valid domain\"\n        pool = Pool()\n        Target = pool.get('test.many2one_target')\n        Many2One = pool.get('test.many2one_domainvalidation')\n        target, = Target.create([{'value': 6}])\n\n        many2one, = Many2One.create([{\n                    'many2one': target.id,\n                    }])\n\n        self.assertEqual(many2one.many2one, target)\n\n    @with_transaction()\n    def test_create_with_domain_invalid(self):\n        \"Test create many2one with invalid domain\"\n        pool = Pool()\n        Target = pool.get('test.many2one_target')\n        Many2One = pool.get('test.many2one_domainvalidation')\n        target, = Target.create([{'value': 1}])\n\n        with self.assertRaises(DomainValidationError):\n            Many2One.create([{\n                        'many2one': target.id,\n                        }])\n\n    @with_transaction()\n    def test_create_with_domain_inactive(self):\n        \"Test create many2one with domain and inactive target\"\n        pool = Pool()\n        Target = pool.get('test.many2one_target')\n        Many2One = pool.get('test.many2one_domainvalidation')\n        target, = Target.create([{'value': 6, 'active': False}])\n\n        many2one, = Many2One.create([{\n                    'many2one': target.id,\n                    }])\n\n        self.assertEqual(many2one.many2one, target)\n\n    @with_transaction()\n    def test_search_order_default(self):\n        \"Test search order by many2one default\"\n        pool = Pool()\n        Target = pool.get('test.many2one_target')\n        Many2One = pool.get('test.many2one')\n        for value in [5, 3, 2]:\n            target, = Target.create([{'value': value}])\n            Many2One.create([{'many2one': target}])\n\n        records = Many2One.search([], order=[('many2one', 'ASC')])\n        values = [r.many2one.value for r in records]\n\n        self.assertListEqual(values, [2, 3, 5])\n\n    @with_transaction()\n    def test_search_order_id(self):\n        \"Test search order by many2one id\"\n        pool = Pool()\n        Target = pool.get('test.many2one_target')\n        Many2One = pool.get('test.many2one')\n        target_ids = []\n        for value in [5, 3, 2]:\n            target, = Target.create([{'value': value}])\n            Many2One.create([{'many2one': target}])\n            target_ids.append(target.id)\n        target_ids.sort()\n\n        records = Many2One.search([], order=[('many2one.id', 'ASC')])\n        ids = [r.many2one.id for r in records]\n\n        self.assertListEqual(ids, target_ids)\n\n    @with_transaction()\n    def test_search_order_value(self):\n        \"Test search order by many2one value\"\n        pool = Pool()\n        Target = pool.get('test.many2one_target')\n        Many2One = pool.get('test.many2one')\n        for value in [5, 3, 2]:\n            target, = Target.create([{'value': value}])\n            Many2One.create([{'many2one': target}])\n\n        records = Many2One.search([], order=[('many2one.value', 'ASC')])\n        values = [r.many2one.value for r in records]\n\n        self.assertListEqual(values, [2, 3, 5])\n\n    @with_transaction()\n    def _test_search_join(self, target_search):\n        pool = Pool()\n        Target = pool.get('test.many2one_target')\n        Many2One = pool.get('test.many2one')\n        target1, target2 = Target.create([\n                {'value': 1},\n                {'value': 2},\n                ])\n        many2one1, many2one2 = Many2One.create([\n                {'many2one': target1},\n                {'many2one': target2},\n                ])\n\n        def set_target_search(target_search):\n            Many2One.many2one.target_search = target_search\n        self.addCleanup(set_target_search, Many2One.many2one.target_search)\n        set_target_search(target_search)\n\n        many2ones = Many2One.search([\n                ('many2one.value', '=', 1),\n                ])\n\n        self.assertListEqual(many2ones, [many2one1])\n\n    def test_search_join(self):\n        \"Test search by many2one join\"\n        self._test_search_join('join')\n\n    def test_search_subquery(self):\n        \"Test search by many2one subquery\"\n        self._test_search_join('subquery')\n\n    @with_transaction()\n    def test_context_attribute(self):\n        \"Test context on many2one attribute\"\n        pool = Pool()\n        Many2One = pool.get('test.many2one_context')\n        Target = pool.get('test.many2one_context.target')\n\n        target, = Target.create([{}])\n        record, = Many2One.create([{\n                    'target': target.id,\n                    }])\n\n        self.assertEqual(record.target.context, 'foo')\n\n    @with_transaction()\n    def test_context_read(self):\n        \"Test context on many2one read\"\n        pool = Pool()\n        Many2One = pool.get('test.many2one_context')\n        Target = pool.get('test.many2one_context.target')\n\n        target, = Target.create([{}])\n        record, = Many2One.create([{\n                    'target': target.id,\n                    }])\n        data, = Many2One.read([record.id], ['target.context'])\n\n        self.assertEqual(data['target.']['context'], 'foo')\n\n    @with_transaction()\n    def test_context_set(self):\n        \"Test context on many2one set\"\n        pool = Pool()\n        Many2One = pool.get('test.many2one_context')\n        Target = pool.get('test.many2one_context.target')\n\n        target, = Target.create([{}])\n        record = Many2One(target=target.id)\n\n        self.assertEqual(record.target.context, 'foo')\n\n\nclass FieldMany2OneTreeTestCase(unittest.TestCase):\n    \"Test Field Many2One Tree\"\n    model_name = 'test.many2one_tree'\n\n    def create_tree(self, Many2One):\n        self.root1, self.root2 = Many2One.create([{}, {}])\n        self.first1, self.first2, self.first3, self.first4 = Many2One.create([\n                {'many2one': self.root1},\n                {'many2one': self.root1},\n                {'many2one': self.root2},\n                {'many2one': self.root2},\n                ])\n        self.second1, self.second2, self.second3, self.second4 = (\n            Many2One.create([\n                {'many2one': self.first1},\n                {'many2one': self.first1},\n                {'many2one': self.first2},\n                {'many2one': self.first2},\n                ]))\n\n    @with_transaction()\n    def test_search_child_of_root1(self):\n        \"Test search many2one child of root1\"\n        Many2One = Pool().get(self.model_name)\n        self.create_tree(Many2One)\n\n        result = Many2One.search([\n                ('many2one', 'child_of', [self.root1.id]),\n                ])\n\n        self.assertListEqual(\n            sorted(result),\n            sorted([self.root1,\n                    self.first1, self.first2,\n                    self.second1, self.second2, self.second3, self.second4]))\n\n    @with_transaction()\n    def test_search_not_child_of_root1(self):\n        \"Test search many2one not child of root1\"\n        Many2One = Pool().get(self.model_name)\n        self.create_tree(Many2One)\n\n        result = Many2One.search([\n                ('many2one', 'not child_of', [self.root1.id]),\n                ])\n\n        self.assertListEqual(\n            sorted(result),\n            sorted([self.root2, self.first3, self.first4]))\n\n    @with_transaction()\n    def test_search_child_of_second1(self):\n        \"Test search many2one child of second1\"\n        Many2One = Pool().get(self.model_name)\n        self.create_tree(Many2One)\n\n        result = Many2One.search([\n                ('many2one', 'child_of', [self.second1.id]),\n                ])\n\n        self.assertListEqual(result, [self.second1])\n\n    @with_transaction()\n    def test_search_not_child_of_second1(self):\n        \"Test search many2one not child of second1\"\n        Many2One = Pool().get(self.model_name)\n        self.create_tree(Many2One)\n\n        result = Many2One.search([\n                ('many2one', 'not child_of', [self.second1.id]),\n                ])\n\n        self.assertListEqual(\n            sorted(result),\n            sorted([self.root1, self.root2,\n                    self.first1, self.first2, self.first3, self.first4,\n                    self.second2, self.second3, self.second4]))\n\n    @with_transaction()\n    def test_search_child_of_empty(self):\n        \"Test search many2one child of empty\"\n        Many2One = Pool().get(self.model_name)\n        self.create_tree(Many2One)\n\n        result = Many2One.search([\n                ('many2one', 'child_of', []),\n                ])\n\n        self.assertListEqual(result, [])\n\n    @with_transaction()\n    def test_search_not_child_of_empty(self):\n        \"Test search many2one not child of empty\"\n        Many2One = Pool().get(self.model_name)\n        self.create_tree(Many2One)\n\n        result = Many2One.search([\n                ('many2one', 'not child_of', []),\n                ])\n\n        self.assertListEqual(\n            sorted(result),\n            sorted([self.root1, self.root2,\n                    self.first1, self.first2, self.first3, self.first4,\n                    self.second1, self.second2, self.second3, self.second4]))\n\n    @with_transaction()\n    def test_search_child_of_none(self):\n        \"Test search many2one child of None\"\n        Many2One = Pool().get(self.model_name)\n        self.create_tree(Many2One)\n\n        result = Many2One.search([\n                ('many2one', 'child_of', [None]),\n                ])\n\n        self.assertListEqual(result, [])\n\n    @with_transaction()\n    def test_search_parent_of_root1(self):\n        \"Test search many2one parent of root1\"\n        Many2One = Pool().get(self.model_name)\n        self.create_tree(Many2One)\n\n        result = Many2One.search([\n                ('many2one', 'parent_of', [self.root1.id]),\n                ])\n\n        self.assertListEqual(result, [self.root1])\n\n    @with_transaction()\n    def test_search_not_parent_of_root1(self):\n        \"Test search many2one not parent of root1\"\n        Many2One = Pool().get(self.model_name)\n        self.create_tree(Many2One)\n\n        result = Many2One.search([\n                ('many2one', 'not parent_of', [self.root1.id]),\n                ])\n\n        self.assertListEqual(\n            sorted(result),\n            sorted([self.root2,\n                    self.first1, self.first2, self.first3, self.first4,\n                    self.second1, self.second2, self.second3, self.second4]))\n\n    @with_transaction()\n    def test_search_parent_of_second4(self):\n        \"Test search many2one parent of second4\"\n        Many2One = Pool().get(self.model_name)\n        self.create_tree(Many2One)\n\n        result = Many2One.search([\n                ('many2one', 'parent_of', [self.second4.id]),\n                ])\n\n        self.assertListEqual(\n            sorted(result),\n            sorted([self.root1, self.first2, self.second4]))\n\n    @with_transaction()\n    def test_search_not_parent_of_second4(self):\n        \"Test search many2one not parent of second4\"\n        Many2One = Pool().get(self.model_name)\n        self.create_tree(Many2One)\n\n        result = Many2One.search([\n                ('many2one', 'not parent_of', [self.second4.id]),\n                ])\n\n        self.assertListEqual(\n            sorted(result),\n            sorted([self.root2,\n                    self.first1, self.first3, self.first4,\n                    self.second1, self.second2, self.second3]))\n\n    @with_transaction()\n    def test_search_parent_of_empty(self):\n        \"Test search many2one parent of empty\"\n        Many2One = Pool().get(self.model_name)\n        self.create_tree(Many2One)\n\n        result = Many2One.search([\n                ('many2one', 'parent_of', []),\n                ])\n\n        self.assertListEqual(result, [])\n\n    @with_transaction()\n    def test_search_not_parent_of_empty(self):\n        \"Test search many2one not parent of empty\"\n        Many2One = Pool().get(self.model_name)\n        self.create_tree(Many2One)\n\n        result = Many2One.search([\n                ('many2one', 'not parent_of', []),\n                ])\n\n        self.assertListEqual(\n            sorted(result),\n            sorted([self.root1, self.root2,\n                    self.first1, self.first2, self.first3, self.first4,\n                    self.second1, self.second2, self.second3, self.second4]))\n\n\nclass FieldMany2OneMPTTTestCase(FieldMany2OneTreeTestCase):\n    \"Test Field Many2One MPTT\"\n    model_name = 'test.many2one_mptt'\n\n\nclass FieldMany2OnePathTestCase(FieldMany2OneTreeTestCase):\n    \"Test Field Many2One Path\"\n    model_name = 'test.many2one_path'\n"
  },
  {
    "path": "trytond/tests/test_field_multiselection.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond import backend\nfrom trytond.model.exceptions import (\n    RequiredValidationError, SelectionValidationError)\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\n\nclass FieldMultiSelectionTestCase(unittest.TestCase):\n    \"Test Field MultiSelection\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create multi-selection\"\n        Selection = Pool().get('test.multi_selection')\n\n        selection, selection_none = Selection.create([{\n                    'selects': ['foo', 'bar'],\n                    }, {\n                    'selects': None,\n                    }])\n\n        self.assertEqual(selection.selects, ('bar', 'foo'))\n        self.assertEqual(selection_none.selects, ())\n\n    @with_transaction()\n    def test_create_not_in(self):\n        \"Test create multi-selection not in selection\"\n        Selection = Pool().get('test.multi_selection')\n\n        with self.assertRaises(SelectionValidationError):\n            Selection.create([{\n                        'selects': ('invalid'),\n                        }])\n\n    @with_transaction()\n    def test_create_dynamic(self):\n        \"Test create dynamic selection\"\n        Selection = Pool().get('test.multi_selection')\n\n        selection_foo, selection_bar = Selection.create([{\n                    'selects': ['foo'],\n                    'dyn_selects': ['foo'],\n                    }, {\n                    'selects': ['bar'],\n                    'dyn_selects': ['baz'],\n                    }])\n\n        self.assertEqual(selection_foo.dyn_selects, ('foo',))\n        self.assertEqual(selection_bar.dyn_selects, ('baz',))\n\n    @with_transaction()\n    def test_create_dynamic_none(self):\n        \"Test create dynamic selection None\"\n        Selection = Pool().get('test.multi_selection')\n\n        selection, = Selection.create([{\n                    'selects': ['foo'],\n                    'dyn_selects': None,\n                    }])\n\n        self.assertEqual(selection.dyn_selects, ())\n\n    @with_transaction()\n    def test_create_dynamic_not_in(self):\n        \"Test create dynamic selection not in\"\n        Selection = Pool().get('test.multi_selection')\n\n        with self.assertRaises(SelectionValidationError):\n            Selection.create([{\n                    'selects': ['foo'],\n                    'dyn_selects': ['foo', 'bar'],\n                    }])\n\n    @with_transaction()\n    def test_create_static(self):\n        \"Test create static selection\"\n        Selection = Pool().get('test.multi_selection')\n\n        selection, = Selection.create([{\n                    'static_selects': ['foo', 'bar'],\n                    }])\n\n        self.assertEqual(selection.static_selects, ('bar', 'foo'))\n\n    @with_transaction()\n    def test_create_static_none(self):\n        \"Test create static selection None\"\n        Selection = Pool().get('test.multi_selection')\n\n        selection, = Selection.create([{\n                    'static_selects': None,\n                    }])\n\n        self.assertEqual(selection.static_selects, ())\n\n    @with_transaction()\n    def test_create_static_not_in(self):\n        \"Test create static selection not in\"\n        Selection = Pool().get('test.multi_selection')\n\n        with self.assertRaises(SelectionValidationError):\n            Selection.create([{\n                    'static_selects': ['foo', 'bar', 'invalid'],\n                    }])\n\n    @with_transaction()\n    def test_create_required_with_value(self):\n        \"Test create selection required with value\"\n        Selection = Pool().get('test.multi_selection_required')\n\n        selection, = Selection.create([{\n                    'selects': ['foo', 'bar'],\n                    }])\n\n        self.assertEqual(selection.selects, ('bar', 'foo'))\n\n    @with_transaction()\n    def test_create_required_without_value(self):\n        \"Test create selection required without value\"\n        Selection = Pool().get('test.multi_selection_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Selection.create([{}])\n\n    @with_transaction()\n    def test_create_required_none(self):\n        \"Test create selection required without value\"\n        Selection = Pool().get('test.multi_selection_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Selection.create([{\n                        'selects': None,\n                        }])\n\n    @with_transaction()\n    def test_create_required_empty(self):\n        \"Test create selection required with empty value\"\n        Selection = Pool().get('test.multi_selection_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Selection.create([{\n                        'selects': [],\n                        }])\n\n    @with_transaction()\n    def test_write(self):\n        \"Test write selection\"\n        Selection = Pool().get('test.multi_selection')\n        selection, = Selection.create([{\n                    'selects': ['foo'],\n                    }])\n\n        Selection.write([selection], {\n                'selects': ['foo', 'bar'],\n                })\n\n        self.assertEqual(selection.selects, ('bar', 'foo'))\n\n    @with_transaction()\n    def test_string(self):\n        \"Test string selection\"\n        Selection = Pool().get('test.multi_selection')\n        selection, = Selection.create([{\n                    'selects': ['foo', 'bar'],\n                    }])\n\n        self.assertEqual(selection.selects_string, [\"Bar\", \"Foo\"])\n\n    @with_transaction()\n    def test_string_none(self):\n        \"Test string selection none\"\n        Selection = Pool().get('test.multi_selection')\n        selection, = Selection.create([{\n                    'selects': None,\n                    }])\n\n        self.assertEqual(selection.selects_string, [])\n\n    @with_transaction()\n    def test_search_equals(self):\n        \"Test search selection equals\"\n        Selection = Pool().get('test.multi_selection')\n        selection, = Selection.create([{\n                    'selects': ['bar', 'foo'],\n                    }])\n\n        foo_bar = Selection.search([\n                ('selects', '=', ['foo', 'bar']),\n                ])\n        foo = Selection.search([\n                ('selects', '=', ['foo']),\n                ])\n\n        self.assertEqual(foo_bar, [selection])\n        self.assertEqual(foo, [])\n\n    @with_transaction()\n    def test_search_equals_string(self):\n        \"Test search selection equals string\"\n        Selection = Pool().get('test.multi_selection')\n        selection, = Selection.create([{\n                    'selects': ['foo'],\n                    }])\n\n        foo = Selection.search([\n                ('selects', '=', 'foo'),\n                ])\n\n        self.assertEqual(foo, [])\n\n    @with_transaction()\n    def test_search_equals_none(self):\n        \"Test search selection equals\"\n        Selection = Pool().get('test.multi_selection')\n        selection, = Selection.create([{\n                    'selects': None,\n                    }])\n\n        selections = Selection.search([\n                ('selects', '=', None),\n                ])\n\n        self.assertEqual(selections, [selection])\n\n    @with_transaction()\n    def test_search_in_string(self):\n        \"Test search selection in string\"\n        Selection = Pool().get('test.multi_selection')\n        selection, = Selection.create([{\n                    'selects': ['foo', 'bar'],\n                    }])\n\n        foo = Selection.search([\n                ('selects', 'in', 'foo'),\n                ])\n        baz = Selection.search([\n                ('selects', 'in', 'baz'),\n                ])\n\n        self.assertEqual(foo, [selection])\n        self.assertEqual(baz, [])\n\n    @with_transaction()\n    def test_search_not_in_string(self):\n        \"Test search selection not in string\"\n        Selection = Pool().get('test.multi_selection')\n        selection, = Selection.create([{\n                    'selects': ['foo', 'bar'],\n                    }])\n\n        foo = Selection.search([\n                ('selects', 'not in', 'foo'),\n                ])\n        baz = Selection.search([\n                ('selects', 'not in', 'baz'),\n                ])\n\n        self.assertEqual(foo, [])\n        self.assertEqual(baz, [selection])\n\n    @with_transaction()\n    def test_search_in_list(self):\n        \"Test search selection in list\"\n        Selection = Pool().get('test.multi_selection')\n        selection, = Selection.create([{\n                    'selects': ['foo', 'bar'],\n                    }])\n\n        foo = Selection.search([\n                ('selects', 'in', ['foo']),\n                ])\n        baz = Selection.search([\n                ('selects', 'in', ['baz']),\n                ])\n        foo_baz = Selection.search([\n                ('selects', 'in', ['foo', 'baz']),\n                ])\n        empty = Selection.search([\n                ('selects', 'in', []),\n                ])\n\n        self.assertEqual(foo, [selection])\n        self.assertEqual(baz, [])\n        self.assertEqual(foo_baz, [selection])\n        self.assertEqual(empty, [])\n\n    @with_transaction()\n    def test_search_not_in_list(self):\n        \"Test search selection not in list\"\n        Selection = Pool().get('test.multi_selection')\n        selection, = Selection.create([{\n                    'selects': ['foo', 'bar'],\n                    }])\n\n        foo = Selection.search([\n                ('selects', 'not in', ['foo']),\n                ])\n        baz = Selection.search([\n                ('selects', 'not in', ['baz']),\n                ])\n        foo_baz = Selection.search([\n                ('selects', 'not in', ['foo', 'baz']),\n                ])\n        empty = Selection.search([\n                ('selects', 'not in', []),\n                ])\n\n        self.assertEqual(foo, [])\n        self.assertEqual(baz, [selection])\n        self.assertEqual(foo_baz, [])\n        self.assertEqual(empty, [selection])\n\n\n@unittest.skipIf(\n    backend.name != 'postgresql', 'jsonb only supported by postgresql')\nclass FieldMultiSelectionJSONBTestCase(FieldMultiSelectionTestCase):\n\n    @classmethod\n    def setUpClass(cls):\n        super().setUpClass()\n        cls.setup_model()\n\n    @classmethod\n    @with_transaction()\n    def setup_model(cls):\n        connection = Transaction().connection\n        if backend.Database().get_version(connection) < (9, 2):\n            return\n        pool = Pool()\n        for model in ['test.multi_selection', 'test.multi_selection_required']:\n            Model = pool.get(model)\n            cursor = connection.cursor()\n            for name, field in Model._fields.items():\n                if field._type == 'multiselection':\n                    cursor.execute('ALTER TABLE \"%s\" '\n                        'ALTER COLUMN %s TYPE json USING %s::json' % (\n                            Model._table, name, name))\n        Transaction().commit()\n"
  },
  {
    "path": "trytond/tests/test_field_numeric.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\nfrom decimal import Decimal, InvalidOperation\n\nfrom sql import Literal\n\nfrom trytond.model.exceptions import (\n    DigitsValidationError, RequiredValidationError)\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass FieldNumericTestCase(unittest.TestCase):\n    \"Test Field Numeric\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create numeric\"\n        Numeric = Pool().get('test.numeric')\n\n        numeric_1_1, numeric_none = Numeric.create([{\n                    'numeric': Decimal('1.1'),\n                    }, {\n                    'numeric': None,\n                    }])\n\n        self.assertEqual(numeric_1_1.numeric, Decimal('1.1'))\n        self.assertEqual(numeric_none.numeric, None)\n\n    @with_transaction()\n    def test_create_20_digits(self):\n        \"Test create number 20 digits\"\n        Numeric = Pool().get('test.numeric')\n\n        numeric, = Numeric.create([{\n                    'numeric': Decimal('0.1234567890123456789'),\n                    }])\n\n        self.assertEqual(numeric.numeric, Decimal('0.1234567890123456789'))\n\n    @with_transaction()\n    def test_create_without_default(self):\n        \"Test create numeric without default\"\n        Numeric = Pool().get('test.numeric')\n\n        numeric, = Numeric.create([{}])\n\n        self.assertEqual(numeric.numeric, None)\n\n    @with_transaction()\n    def test_create_with_default(self):\n        \"Test create numeric with default\"\n        Numeric = Pool().get('test.numeric_default')\n\n        numeric, = Numeric.create([{}])\n\n        self.assertEqual(numeric.numeric, Decimal('5.5'))\n\n    @with_transaction()\n    def test_create_with_sql_value(self):\n        \"Test create numeric with SQL value\"\n        Numeric = Pool().get('test.numeric')\n\n        numeric, = Numeric.create([{'numeric': Literal(5.) / Literal(2.)}])\n\n        self.assertEqual(numeric.numeric, Decimal('2.5'))\n\n    @with_transaction()\n    def test_set_sql_value(self):\n        \"Test cannot set SQL value\"\n        Numeric = Pool().get('test.numeric')\n\n        numeric = Numeric()\n\n        with self.assertRaises(ValueError):\n            numeric.numeric = Literal(42)\n\n    @with_transaction()\n    def test_create_non_numeric(self):\n        \"Test create numeric with non numeric\"\n        Numeric = Pool().get('test.numeric')\n\n        with self.assertRaises(InvalidOperation):\n            Numeric.create([{\n                        'numeric': 'non numeric',\n                        }])\n\n    @with_transaction()\n    def test_create_required_with_value(self):\n        \"Test create numeric required with value\"\n        Numeric = Pool().get('test.numeric_required')\n\n        numeric, = Numeric.create([{\n                    'numeric': Decimal('0'),\n                    }])\n\n        self.assertEqual(numeric.numeric, Decimal('0'))\n\n    @with_transaction()\n    def test_create_required_without_value(self):\n        \"Test create numeric required without value\"\n        Numeric = Pool().get('test.numeric_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Numeric.create([{}])\n\n    @with_transaction()\n    def test_create_digits_valid(self):\n        \"Test create numeric with digits\"\n        Numeric = Pool().get('test.numeric_digits')\n\n        numeric, = Numeric.create([{\n                    'digits': 1,\n                    'numeric': Decimal('1.1'),\n                    }])\n\n        self.assertEqual(numeric.numeric, Decimal('1.1'))\n\n    @with_transaction()\n    def test_create_digits_invalid(self):\n        \"Test create numeric with invalid digits\"\n        Numeric = Pool().get('test.numeric_digits')\n\n        with self.assertRaises(DigitsValidationError):\n            Numeric.create([{\n                    'digits': 1,\n                    'numeric': Decimal('1.11'),\n                    }])\n\n    @with_transaction()\n    def test_create_digits_none(self):\n        \"Test create numeric with not digits\"\n        Numeric = Pool().get('test.numeric_digits')\n\n        numeric, = Numeric.create([{\n                    'digits': None,\n                    'numeric': Decimal('0.123456789012345'),\n                    }])\n\n        self.assertEqual(numeric.numeric, Decimal('0.123456789012345'))\n\n    @with_transaction()\n    def test_create_10_digits(self):\n        \"Test create a numeric with 10 digits\"\n        Numeric = Pool().get('test.numeric_digits')\n\n        numeric, = Numeric.create([{\n                    'digits': 10,\n                    'numeric': Decimal('0.04'),\n                    }])\n\n        self.assertEqual(numeric.numeric, Decimal('0.04'))\n\n    @with_transaction()\n    def test_create_10_digits_invalid(self):\n        \"Test create a numeric with 11 digits on with 10 limit\"\n        Numeric = Pool().get('test.numeric_digits')\n\n        with self.assertRaises(DigitsValidationError):\n            Numeric.create([{\n                        'digits': 10,\n                        'numeric': Decimal('1.11111111111'),\n                        }])\n\n    @with_transaction()\n    def test_search_equals(self):\n        \"Test search numeric equals\"\n        Numeric = Pool().get('test.numeric')\n        numeric, = Numeric.create([{\n                    'numeric': Decimal('1.1'),\n                    }])\n\n        numerics_1_1 = Numeric.search([\n                ('numeric', '=', Decimal('1.1')),\n                ])\n        numerics_0 = Numeric.search([\n                ('numeric', '=', Decimal('0')),\n                ])\n\n        self.assertListEqual(numerics_1_1, [numeric])\n        self.assertListEqual(numerics_0, [])\n\n    @with_transaction()\n    def test_search_equals_none(self):\n        \"Test search numeric equals None\"\n        Numeric = Pool().get('test.numeric')\n        numeric, = Numeric.create([{\n                    'numeric': None,\n                    }])\n\n        numerics = Numeric.search([\n                ('numeric', '=', None),\n                ])\n\n        self.assertListEqual(numerics, [numeric])\n\n    @with_transaction()\n    def test_search_non_equals(self):\n        \"Test search numeric non equals\"\n        Numeric = Pool().get('test.numeric')\n        numeric, = Numeric.create([{\n                    'numeric': Decimal('1.1'),\n                    }])\n\n        numerics_1_1 = Numeric.search([\n                ('numeric', '!=', Decimal('1.1')),\n                ])\n        numerics_0 = Numeric.search([\n                ('numeric', '!=', Decimal('0')),\n                ])\n\n        self.assertListEqual(numerics_1_1, [])\n        self.assertListEqual(numerics_0, [numeric])\n\n    @with_transaction()\n    def test_search_non_equals_none(self):\n        \"Test search numeric non equals None\"\n        Numeric = Pool().get('test.numeric')\n        numeric, = Numeric.create([{\n                    'numeric': None,\n                    }])\n\n        numerics = Numeric.search([\n                ('numeric', '!=', None),\n                ])\n\n        self.assertListEqual(numerics, [])\n\n    @with_transaction()\n    def test_search_in(self):\n        \"Test search numeric in\"\n        Numeric = Pool().get('test.numeric')\n        numeric, = Numeric.create([{\n                    'numeric': Decimal('1.1'),\n                    }])\n\n        numerics_1_1 = Numeric.search([\n                ('numeric', 'in', [Decimal('1.1')]),\n                ])\n        numerics_0 = Numeric.search([\n                ('numeric', 'in', [Decimal('0')]),\n                ])\n        numerics_empty = Numeric.search([\n                ('numeric', 'in', []),\n                ])\n\n        self.assertListEqual(numerics_1_1, [numeric])\n        self.assertListEqual(numerics_0, [])\n        self.assertListEqual(numerics_empty, [])\n\n    @with_transaction()\n    def test_search_in_none(self):\n        \"Test search numeric in [None]\"\n        Numeric = Pool().get('test.numeric')\n        numeric, = Numeric.create([{\n                    'numeric': None,\n                    }])\n\n        numerics = Numeric.search([\n                ('numeric', 'in', [None]),\n                ])\n\n        self.assertListEqual(numerics, [numeric])\n\n    @with_transaction()\n    def test_search_not_in(self):\n        \"Test search numeric not in\"\n        Numeric = Pool().get('test.numeric')\n        numeric, = Numeric.create([{\n                    'numeric': Decimal('1.1'),\n                    }])\n\n        numerics_1_1 = Numeric.search([\n                ('numeric', 'not in', [Decimal('1.1')]),\n                ])\n        numerics_0 = Numeric.search([\n                ('numeric', 'not in', [Decimal('0')]),\n                ])\n        numerics_empty = Numeric.search([\n                ('numeric', 'not in', []),\n                ])\n\n        self.assertListEqual(numerics_1_1, [])\n        self.assertListEqual(numerics_0, [numeric])\n        self.assertListEqual(numerics_empty, [numeric])\n\n    @with_transaction()\n    def test_search_not_in_none(self):\n        \"Test search numeric in [None]\"\n        Numeric = Pool().get('test.numeric')\n        numeric, = Numeric.create([{\n                    'numeric': None,\n                    }])\n\n        numerics = Numeric.search([\n                ('numeric', 'not in', [None]),\n                ])\n\n        self.assertListEqual(numerics, [])\n\n    @with_transaction()\n    def test_search_in_multi(self):\n        \"Test search numeric in multiple\"\n        Numeric = Pool().get('test.numeric')\n        numerics = Numeric.create([{\n                    'numeric': Decimal('1.1'),\n                    }, {\n                    'numeric': Decimal('0'),\n                    }])\n\n        numerics_in = Numeric.search([\n                ('numeric', 'in', [Decimal('0'), Decimal('1.1')]),\n                ])\n\n        self.assertListEqual(numerics_in, numerics)\n\n    @with_transaction()\n    def test_search_not_in_multi(self):\n        \"Test search numeric not in multiple\"\n        Numeric = Pool().get('test.numeric')\n        Numeric.create([{\n                    'numeric': Decimal('1.1'),\n                    }, {\n                    'numeric': Decimal('0'),\n                    }])\n\n        numerics = Numeric.search([\n                ('numeric', 'not in', [Decimal('0'), Decimal('1.1')]),\n                ])\n\n        self.assertListEqual(numerics, [])\n\n    @with_transaction()\n    def test_search_less(self):\n        \"Test search numeric less than\"\n        Numeric = Pool().get('test.numeric')\n        numeric, = Numeric.create([{\n                    'numeric': Decimal('1.1'),\n                    }])\n\n        numerics_5 = Numeric.search([\n                ('numeric', '<', Decimal('5')),\n                ])\n        numerics__5 = Numeric.search([\n                ('numeric', '<', Decimal('-5')),\n                ])\n        numerics_1_1 = Numeric.search([\n                ('numeric', '<', Decimal('1.1')),\n                ])\n\n        self.assertListEqual(numerics_5, [numeric])\n        self.assertListEqual(numerics__5, [])\n        self.assertListEqual(numerics_1_1, [])\n\n    @with_transaction()\n    def test_search_less_equals(self):\n        \"Test search numeric less than or equals\"\n        Numeric = Pool().get('test.numeric')\n        numeric, = Numeric.create([{\n                    'numeric': Decimal('1.1'),\n                    }])\n\n        numerics_5 = Numeric.search([\n                ('numeric', '<=', Decimal('5')),\n                ])\n        numerics__5 = Numeric.search([\n                ('numeric', '<=', Decimal('-5')),\n                ])\n        numerics_1_1 = Numeric.search([\n                ('numeric', '<=', Decimal('1.1')),\n                ])\n\n        self.assertListEqual(numerics_5, [numeric])\n        self.assertListEqual(numerics__5, [])\n        self.assertListEqual(numerics_1_1, [numeric])\n\n    @with_transaction()\n    def test_search_greater(self):\n        \"Test search numeric greater than\"\n        Numeric = Pool().get('test.numeric')\n        numeric, = Numeric.create([{\n                    'numeric': Decimal('1.1'),\n                    }])\n\n        numerics_5 = Numeric.search([\n                ('numeric', '>', Decimal('5')),\n                ])\n        numerics__5 = Numeric.search([\n                ('numeric', '>', Decimal('-5')),\n                ])\n        numerics_1_1 = Numeric.search([\n                ('numeric', '>', Decimal('1.1')),\n                ])\n\n        self.assertListEqual(numerics_5, [])\n        self.assertListEqual(numerics__5, [numeric])\n        self.assertListEqual(numerics_1_1, [])\n\n    @with_transaction()\n    def test_search_greater_equals(self):\n        \"Test search numeric greater than or equals\"\n        Numeric = Pool().get('test.numeric')\n        numeric, = Numeric.create([{\n                    'numeric': Decimal('1.1'),\n                    }])\n\n        numerics_5 = Numeric.search([\n                ('numeric', '>=', Decimal('5')),\n                ])\n        numerics__5 = Numeric.search([\n                ('numeric', '>=', Decimal('-5')),\n                ])\n        numerics_1_1 = Numeric.search([\n                ('numeric', '>=', Decimal('1.1')),\n                ])\n\n        self.assertListEqual(numerics_5, [])\n        self.assertListEqual(numerics__5, [numeric])\n        self.assertListEqual(numerics_1_1, [numeric])\n\n    @with_transaction()\n    def test_numeric_search_cast(self):\n        \"Test search numeric cast\"\n        pool = Pool()\n        Numeric = pool.get('test.numeric')\n        numeric1, numeric2 = Numeric.create([{\n                    'numeric': Decimal('1.1'),\n                    }, {\n                    'numeric': Decimal('100.0'),\n                    }])\n\n        numerics = Numeric.search([\n                ('numeric', '<', Decimal('5')),\n                ])\n\n        self.assertEqual(numerics, [numeric1])\n\n    @with_transaction()\n    def test_write(self):\n        \"Test write numeric\"\n        Numeric = Pool().get('test.numeric')\n        numeric, = Numeric.create([{\n                    'numeric': Decimal('1.1'),\n                    }])\n\n        Numeric.write([numeric], {\n                'numeric': Decimal('0'),\n                })\n\n        self.assertEqual(numeric.numeric, Decimal('0'))\n\n    @with_transaction()\n    def test_write_non_numeric(self):\n        \"Test write numeric with non numeric\"\n        Numeric = Pool().get('test.numeric')\n        numeric, = Numeric.create([{\n                    'numeric': Decimal('1.1'),\n                    }])\n\n        with self.assertRaises(InvalidOperation):\n            Numeric.write([numeric], {\n                    'numeric': 'non numeric',\n                    })\n\n    @with_transaction()\n    def test_write_digits_invalid_value(self):\n        \"Test write numeric with invalid value for digits\"\n        Numeric = Pool().get('test.numeric_digits')\n\n        numeric, = Numeric.create([{\n                    'digits': 1,\n                    'numeric': Decimal('1.1'),\n                    }])\n\n        with self.assertRaises(DigitsValidationError):\n            Numeric.write([numeric], {\n                    'numeric': Decimal('1.11'),\n                    })\n\n    @with_transaction()\n    def test_write_digits_invalid_value_small(self):\n        \"Test write numeric with invalid small value for digits\"\n        Numeric = Pool().get('test.numeric_digits')\n\n        numeric, = Numeric.create([{\n                    'digits': 1,\n                    'numeric': Decimal('1.1'),\n                    }])\n\n        with self.assertRaises(DigitsValidationError):\n            Numeric.write([numeric], {\n                    'numeric': Decimal('1.10000000000000001'),\n                    })\n\n    @with_transaction()\n    def test_write_digits_invalid_digits(self):\n        \"Test write number with invalid digits for value\"\n        Numeric = Pool().get('test.numeric_digits')\n\n        numeric, = Numeric.create([{\n                    'digits': 2,\n                    'numeric': Decimal('1.11'),\n                    }])\n\n        with self.assertRaises(DigitsValidationError):\n            Numeric.write([numeric], {\n                    'digits': 1,\n                    })\n\n    @with_transaction()\n    def test_write_digits_invalid_digits_0(self):\n        \"Test write number with invalid digits for value\"\n        Numeric = Pool().get('test.numeric_digits')\n\n        numeric, = Numeric.create([{\n                    'digits': 1,\n                    'numeric': Decimal('1.1'),\n                    }])\n\n        with self.assertRaises(DigitsValidationError):\n            Numeric.write([numeric], {\n                    'digits': 0,\n                    })\n"
  },
  {
    "path": "trytond/tests/test_field_one2many.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond.model.exceptions import (\n    RequiredValidationError, SizeValidationError)\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass CommonTestCaseMixin:\n\n    @with_transaction()\n    def test_set_reverse_field_instance(self):\n        \"Test reverse field is set on instance\"\n        One2Many = self.One2Many()\n        Target = self.One2ManyTarget()\n\n        record = One2Many()\n        target = Target()\n        record.targets = [target]\n\n        self.assertEqual(target.origin, record)\n\n    @with_transaction()\n    def test_save_reverse_field(self):\n        \"Test save with reverse field set\"\n        One2Many = self.One2Many()\n        Target = self.One2ManyTarget()\n\n        record = One2Many()\n        target = Target()\n        record.targets = [target]\n\n        record.save()\n\n    @with_transaction()\n    def test_save_reverse_field_saved(self):\n        \"Test save with reverse field set on saved\"\n        One2Many = self.One2Many()\n        Target = self.One2ManyTarget()\n\n        record = One2Many()\n        target = Target()\n        target.save()\n        record.targets = [target]\n\n        record.save()\n\n    @with_transaction()\n    def test_set_reverse_field_dict(self):\n        \"Test reverse field is set on dict\"\n        One2Many = self.One2Many()\n\n        record = One2Many()\n        record.targets = [{}]\n        target, = record.targets\n\n        self.assertEqual(target.origin, record)\n\n    @with_transaction()\n    def test_set_reverse_field_id(self):\n        \"Test reverse field is set on id\"\n        One2Many = self.One2Many()\n        Target = self.One2ManyTarget()\n\n        record = One2Many()\n        target = Target()\n        target.save()\n        record.targets = [target.id]\n        target, = record.targets\n\n        self.assertEqual(target.origin, record)\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create one2many\"\n        One2Many = self.One2Many()\n\n        one2many, = One2Many.create([{\n                    'targets': [\n                        ('create', [{\n                                    'name': \"Target\",\n                                    }]),\n                        ],\n                    }])\n\n        self.assertEqual(len(one2many.targets), 1)\n\n    @with_transaction()\n    def test_search_equals(self):\n        \"Test search one2many equals\"\n        One2Many = self.One2Many()\n        one2many, = One2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        one2manys = One2Many.search([\n                ('targets', '=', \"Target\"),\n                ])\n\n        self.assertListEqual(one2manys, [one2many])\n\n    @with_transaction()\n    def test_search_equals_no_link(self):\n        \"Test search one2many equals without link\"\n        One2Many = self.One2Many()\n        one2many, no_link = One2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }, {\n                    }])\n\n        one2manys = One2Many.search([\n                ('targets', '=', \"Target\"),\n                ])\n\n        self.assertListEqual(one2manys, [one2many])\n\n    @with_transaction()\n    def test_search_non_equals(self):\n        \"Test search one2many non equals\"\n        One2Many = self.One2Many()\n        one2many, = One2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        one2manys = One2Many.search([\n                ('targets', '!=', \"Target\"),\n                ])\n\n        self.assertListEqual(one2manys, [])\n\n    @with_transaction()\n    def test_search_equals_none(self):\n        \"Test search one2many equals None\"\n        One2Many = self.One2Many()\n        one2many1, one2many2 = One2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }, {\n                    'targets': None,\n                    }])\n\n        one2manys = One2Many.search([\n                ('targets', '=', None),\n                ])\n\n        self.assertListEqual(one2manys, [one2many2])\n\n    @with_transaction()\n    def test_search_non_equals_none(self):\n        \"Test search one2many non equals None\"\n        One2Many = self.One2Many()\n        one2many1, one2many2 = One2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }, {\n                    'targets': None,\n                    }])\n\n        one2manys = One2Many.search([\n                ('targets', '!=', None),\n                ])\n\n        self.assertListEqual(one2manys, [one2many1])\n\n    @with_transaction()\n    def test_search_non_equals_no_link(self):\n        \"Test search one2many non equals without link\"\n        One2Many = self.One2Many()\n        one2many, no_link = One2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }, {\n                    }])\n\n        one2manys = One2Many.search([\n                ('targets', '!=', \"Target\"),\n                ])\n\n        self.assertListEqual(one2manys, [no_link])\n\n    @with_transaction()\n    def test_search_in(self):\n        \"Test search one2many in\"\n        One2Many = self.One2Many()\n        one2many, = One2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n        target, = one2many.targets\n\n        one2manys = One2Many.search([\n                ('targets', 'in', [target.id]),\n                ])\n\n        self.assertListEqual(one2manys, [one2many])\n\n    @with_transaction()\n    def test_search_in_0(self):\n        \"Test search one2many in [0]\"\n        One2Many = self.One2Many()\n        one2many, = One2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        one2manys = One2Many.search([\n                ('targets', 'in', [0]),\n                ])\n\n        self.assertListEqual(one2manys, [])\n\n    @with_transaction()\n    def test_search_in_empty(self):\n        \"Test search one2many in []\"\n        One2Many = self.One2Many()\n        one2many, = One2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        one2manys = One2Many.search([\n                ('targets', 'in', []),\n                ])\n\n        self.assertListEqual(one2manys, [])\n\n    @with_transaction()\n    def test_search_not_in(self):\n        \"Test search one2many not in\"\n        One2Many = self.One2Many()\n        one2many, = One2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n        target, = one2many.targets\n\n        one2manys = One2Many.search([\n                ('targets', 'not in', [target.id]),\n                ])\n\n        self.assertListEqual(one2manys, [])\n\n    @with_transaction()\n    def test_search_not_in_0(self):\n        \"Test search one2many not in [0]\"\n        One2Many = self.One2Many()\n        one2many, = One2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        one2manys = One2Many.search([\n                ('targets', 'not in', [0]),\n                ])\n\n        self.assertListEqual(one2manys, [one2many])\n\n    @with_transaction()\n    def test_search_not_in_empty(self):\n        \"Test search one2many not in []\"\n        One2Many = self.One2Many()\n        one2many, = One2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        one2manys = One2Many.search([\n                ('targets', 'not in', []),\n                ])\n\n        self.assertListEqual(one2manys, [one2many])\n\n    @with_transaction()\n    def test_search_join(self):\n        \"Test search one2many equals\"\n        One2Many = self.One2Many()\n        one2many, = One2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        one2manys = One2Many.search([\n                ('targets.name', '=', \"Target\"),\n                ])\n\n        self.assertListEqual(one2manys, [one2many])\n\n    @with_transaction()\n    def test_search_where(self):\n        \"Test search one2many where\"\n        One2Many = self.One2Many()\n        one2many, = One2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        one2manys = One2Many.search([\n                ('targets', 'where', [('name', '=', \"Target\")]),\n                ])\n\n        self.assertListEqual(one2manys, [one2many])\n\n    @with_transaction()\n    def test_search_not_where(self):\n        \"Test search one2many not where\"\n        One2Many = self.One2Many()\n        one2many, = One2Many.create([{\n                    'targets': [('create', [{'name': \"Target\"}])],\n                    }])\n\n        one2manys = One2Many.search([\n                ('targets', 'not where', [('name', '=', \"Target\")]),\n                ])\n\n        self.assertListEqual(one2manys, [])\n\n    @with_transaction()\n    def test_search_not_where_others(self):\n        \"Test search one2many not where with others\"\n        One2Many = self.One2Many()\n        one2many, = One2Many.create([{\n                    'targets': [('create', [\n                                {'name': \"Target\"}, {'name': \"Foo\"}])],\n                    }])\n\n        one2manys = One2Many.search([\n                ('targets', 'not where', [('name', '=', \"Target\")]),\n                ])\n\n        self.assertListEqual(one2manys, [])\n\n    @with_transaction()\n    def test_write_write(self):\n        \"Test write one2many write\"\n        One2Many = self.One2Many()\n        one2many, = One2Many.create([{\n                    'targets': [('create', [{'name': \"Foo\"}])],\n                    }])\n        target, = one2many.targets\n\n        One2Many.write([one2many], {\n                'targets': [\n                    ('write', [target.id], {\n                            'name': \"Bar\",\n                            }),\n                    ],\n                })\n\n        self.assertEqual(target.name, \"Bar\")\n\n    @with_transaction()\n    def test_write_add(self):\n        \"Test write one2many add\"\n        One2Many = self.One2Many()\n        Target = self.One2ManyTarget()\n        one2many, = One2Many.create([{}])\n        target, = Target.create([{}])\n\n        One2Many.write([one2many], {\n                'targets': [\n                    ('add', [target.id]),\n                    ],\n                })\n\n        self.assertTupleEqual(one2many.targets, (target,))\n\n    @with_transaction()\n    def test_write_remove(self):\n        \"Test write one2many remove\"\n        One2Many = self.One2Many()\n        Target = self.One2ManyTarget()\n        one2many, = One2Many.create([{\n                    'targets': [('create', [{'name': \"Foo\"}])],\n                    }])\n        target, = one2many.targets\n\n        One2Many.write([one2many], {\n                'targets': [\n                    ('remove', [target.id]),\n                    ],\n                })\n        targets = Target.search([('id', '=', target.id)])\n\n        self.assertTupleEqual(one2many.targets, ())\n        self.assertListEqual(targets, [target])\n\n    @with_transaction()\n    def test_write_copy(self):\n        \"Test write one2many copy\"\n        One2Many = self.One2Many()\n        Target = self.One2ManyTarget()\n        one2many, = One2Many.create([{\n                    'targets': [('create', [{'name': \"Foo\"}])],\n                    }])\n        target1, = one2many.targets\n\n        One2Many.write([one2many], {\n                'targets': [\n                    ('copy', [target1.id], {'name': \"Bar\"}),\n                    ],\n                })\n        target2, = Target.search([('id', '!=', target1.id)])\n\n        self.assertTupleEqual(one2many.targets, (target1, target2))\n\n    @with_transaction()\n    def test_write_delete(self):\n        \"Test write one2many delete\"\n        One2Many = self.One2Many()\n        Target = self.One2ManyTarget()\n        one2many, = One2Many.create([{\n                    'targets': [(\n                            'create', [{'name': \"Foo\"}, {'name': \"Bar\"}])],\n                    }])\n        target1, target2 = one2many.targets\n\n        One2Many.write([one2many], {\n                'targets': [\n                    ('delete', [target1.id]),\n                    ],\n                })\n        targets = Target.search([])\n\n        self.assertTupleEqual(one2many.targets, (target2,))\n        self.assertListEqual(targets, [target2])\n\n    @with_transaction()\n    def test_write_not_readd(self):\n        \"Test write one2many do not re-add existing\"\n        One2Many = self.One2Many()\n        one2many, = One2Many.create([{\n                    'targets': [('create', [{}])],\n                    }])\n\n        target, = one2many.targets\n\n        One2Many.write([one2many], {\n                    'targets': [('add', {target.id})],\n                    })\n\n        target, = one2many.targets\n        self.assertIsNone(target.write_date)\n\n\nclass FieldOne2ManyTestCase(unittest.TestCase, CommonTestCaseMixin):\n    \"Test Field One2Many\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    def One2Many(self):\n        return Pool().get('test.one2many')\n\n    def One2ManyTarget(self):\n        return Pool().get('test.one2many.target')\n\n    @with_transaction()\n    def test_create_required_with_value(self):\n        \"Test create one2many required with value\"\n        One2Many = Pool().get('test.one2many_required')\n\n        one2many, = One2Many.create([{\n                    'targets': [\n                        ('create', [{\n                                    'name': \"Target\",\n                                    }]),\n                        ],\n                    }])\n\n        self.assertEqual(len(one2many.targets), 1)\n\n    @with_transaction()\n    def test_create_required_without_value(self):\n        \"Test create one2many required without value\"\n        One2Many = Pool().get('test.one2many_required')\n\n        with self.assertRaises(RequiredValidationError):\n            One2Many.create([{}])\n\n    @with_transaction()\n    def test_create_size_valid(self):\n        \"Test create one2many size valid\"\n        One2Many = Pool().get('test.one2many_size')\n\n        one2many, = One2Many.create([{\n                    'targets': [\n                        ('create', [{}] * 3),\n                        ],\n                    }])\n\n        self.assertEqual(len(one2many.targets), 3)\n\n    @with_transaction()\n    def test_create_size_invalid(self):\n        \"Test create one2many size invalid\"\n        One2Many = Pool().get('test.one2many_size')\n\n        with self.assertRaises(SizeValidationError):\n            One2Many.create([{\n                        'targets': [\n                            ('create', [{}] * 4),\n                            ],\n                        }])\n\n    @with_transaction()\n    def test_create_size_pyson_valid(self):\n        \"Test create one2many size pyson valid\"\n        One2Many = Pool().get('test.one2many_size_pyson')\n\n        one2many, = One2Many.create([{\n                    'limit': 4,\n                    'targets': [\n                        ('create', [{}] * 4),\n                        ],\n                    }])\n\n        self.assertEqual(len(one2many.targets), 4)\n\n    @with_transaction()\n    def test_create_size_pyson_invalid(self):\n        \"Test create one2many size pyson invalid\"\n        One2Many = Pool().get('test.one2many_size_pyson')\n\n        with self.assertRaises(SizeValidationError):\n            One2Many.create([{\n                        'limit': 3,\n                        'targets': [\n                            ('create', [{}] * 4),\n                            ],\n                        }])\n\n    @with_transaction()\n    def test_create_size_pyson_none(self):\n        \"Test create one2many with PYSON size as None\"\n        pool = Pool()\n        One2Many = pool.get('test.one2many_size_pyson')\n\n        one2many, = One2Many.create([{\n                    'limit': None,\n                    'targets': [\n                        ('create', [{}]),\n                        ],\n                    }])\n\n    @with_transaction()\n    def test_create_filter(self):\n        \"Test create one2many with filter\"\n        One2Many = Pool().get('test.one2many_filter')\n\n        filtered, = One2Many.create([{\n                    'targets': [\n                        ('create', [{'value': x} for x in range(4)])],\n                    }])\n        filtered_target, = filtered.filtered_targets\n\n        self.assertEqual(len(filtered.targets), 4)\n        self.assertEqual(filtered_target.value, 3)\n\n    @with_transaction()\n    def test_create_filter_domain(self):\n        \"Test create one2many with filter and domain\"\n        One2Many = Pool().get('test.one2many_filter_domain')\n\n        filtered, = One2Many.create([{\n                    'targets': [\n                        ('create', [{'value': x} for x in range(4)])],\n                    }])\n        filtered_target, = filtered.filtered_targets\n\n        self.assertEqual(len(filtered.targets), 4)\n        self.assertEqual(filtered_target.value, 3)\n\n    @with_transaction()\n    def test_search_non_equals_filter(self):\n        \"Test search one2many non equals with filter\"\n        One2Many = Pool().get('test.one2many_filter')\n        one2many, = One2Many.create([{\n                    'targets': [('create', [{'value': -1}])],\n                    }])\n\n        one2manys = One2Many.search([('targets', '!=', None)])\n        one2manys_filtered = One2Many.search(\n            [('filtered_targets', '!=', None)])\n\n        self.assertListEqual(one2manys, [one2many])\n        self.assertListEqual(one2manys_filtered, [])\n\n    @with_transaction()\n    def test_search_join_filter(self):\n        \"Test search one2many join with filter\"\n        One2Many = Pool().get('test.one2many_filter')\n        one2many, = One2Many.create([{\n                    'targets': [('create', [{'value': -1}])],\n                    }])\n\n        one2manys = One2Many.search([('targets.value', '=', -1)])\n        one2manys_filtered = One2Many.search(\n            [('filtered_targets.value', '=', -1)])\n\n        self.assertListEqual(one2manys, [one2many])\n        self.assertListEqual(one2manys_filtered, [])\n\n    @with_transaction()\n    def test_context_attribute(self):\n        \"Test context on one2many attribute\"\n        pool = Pool()\n        Many2One = pool.get('test.one2many_context')\n\n        record, = Many2One.create([{\n                    'targets': [('create', [{}])],\n                    }])\n\n        self.assertEqual(record.targets[0].context, record.id)\n\n    @with_transaction()\n    def test_context_read(self):\n        \"Test context on one2many read\"\n        pool = Pool()\n        Many2One = pool.get('test.one2many_context')\n\n        record, = Many2One.create([{\n                    'targets': [('create', [{}])],\n                    }])\n        data, = Many2One.read([record.id], ['targets.context'])\n\n        self.assertEqual(data['targets.'][0]['context'], record.id)\n\n    @with_transaction()\n    def test_context_read_multi(self):\n        \"Test context on one2many read multiple records\"\n        pool = Pool()\n        Many2One = pool.get('test.one2many_context')\n\n        records = Many2One.create([{\n                    'targets': [('create', [{}])],\n                    }, {\n                    'targets': [('create', [{}])],\n                    }])\n        data = Many2One.read([r.id for r in records], ['targets.context'])\n\n        self.assertEqual(data[0]['targets.'][0]['context'], records[0].id)\n        self.assertEqual(data[1]['targets.'][0]['context'], records[1].id)\n\n    @with_transaction()\n    def test_context_set(self):\n        \"Test context on one2many set\"\n        pool = Pool()\n        Many2One = pool.get('test.one2many_context')\n        Target = pool.get('test.one2many_context.target')\n\n        target, = Target.create([{}])\n        record = Many2One(targets=[target.id])\n\n        self.assertEqual(record.targets[0].context, record.id)\n\n\nclass FieldOne2ManyReferenceTestCase(unittest.TestCase, CommonTestCaseMixin):\n    \"Test Field One2Many Reference\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    def One2Many(self):\n        return Pool().get('test.one2many_reference')\n\n    def One2ManyTarget(self):\n        return Pool().get('test.one2many_reference.target')\n"
  },
  {
    "path": "trytond/tests/test_field_one2one.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond.model.exceptions import (\n    DomainValidationError, RequiredValidationError, SQLConstraintError)\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass FieldOne2OneTestCase(unittest.TestCase):\n    \"Test Field One2One\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_create_id(self):\n        \"Test create one2one with id\"\n        pool = Pool()\n        Target = pool.get('test.one2one.target')\n        One2One = pool.get('test.one2one')\n        target, = Target.create([{}])\n\n        one2one, = One2One.create([{\n                    'one2one': target.id,\n                    }])\n\n        self.assertEqual(one2one.one2one, target)\n\n    @with_transaction()\n    def test_create_instance(self):\n        \"Test create one2one with instance\"\n        pool = Pool()\n        Target = pool.get('test.one2one.target')\n        One2One = pool.get('test.one2one')\n        target, = Target.create([{}])\n\n        one2one, = One2One.create([{\n                    'one2one': target,\n                    }])\n\n        self.assertEqual(one2one.one2one, target)\n\n    @with_transaction()\n    def test_create_with_default(self):\n        \"Test create one2one with instance\"\n        pool = Pool()\n        One2One = pool.get('test.one2one')\n\n        one2one, = One2One.create([{}])\n\n        self.assertEqual(one2one.one2one, None)\n\n    @with_transaction()\n    def test_create_duplicate(self):\n        \"Test create one2one duplicate\"\n        pool = Pool()\n        Target = pool.get('test.one2one.target')\n        One2One = pool.get('test.one2one')\n        target, = Target.create([{}])\n        One2One.create([{\n                    'one2one': target,\n                    }])\n\n        with self.assertRaises(SQLConstraintError):\n            One2One.create([{\n                        'one2one': target,\n                        }])\n\n    @with_transaction()\n    def test_create_required_with_value(self):\n        \"Test create one2one required with value\"\n        pool = Pool()\n        Target = pool.get('test.one2one.target')\n        One2One = pool.get('test.one2one_required')\n        target, = Target.create([{}])\n\n        one2one, = One2One.create([{\n                    'one2one': target.id,\n                    }])\n\n        self.assertEqual(one2one.one2one, target)\n\n    @with_transaction()\n    def test_create_required_without_value(self):\n        \"Test create one2one required without value\"\n        pool = Pool()\n        Target = pool.get('test.one2one.target')\n        One2One = pool.get('test.one2one_required')\n        target, = Target.create([{}])\n\n        with self.assertRaises(RequiredValidationError):\n            One2One.create([{}])\n\n    @with_transaction()\n    def test_create_with_domain_valid(self):\n        \"Test create one2one with domain valid\"\n        pool = Pool()\n        Target = pool.get('test.one2one.target')\n        One2One = pool.get('test.one2one_domain')\n        target, = Target.create([{\n                    'name': \"domain\",\n                    }])\n\n        one2one, = One2One.create([{\n                    'one2one': target.id,\n                    }])\n\n        self.assertEqual(one2one.one2one, target)\n\n    @with_transaction()\n    def test_create_with_domain_invalid(self):\n        \"Test create one2one with domain invalid\"\n        pool = Pool()\n        Target = pool.get('test.one2one.target')\n        One2One = pool.get('test.one2one_domain')\n        target, = Target.create([{\n                    'name': \"invalid domain\",\n                    }])\n\n        with self.assertRaises(DomainValidationError):\n            One2One.create([{\n                        'one2one': target.id,\n                        }])\n\n    @with_transaction()\n    def test_search_equals(self):\n        \"Test search one2one equals\"\n        pool = Pool()\n        Target = pool.get('test.one2one.target')\n        One2One = pool.get('test.one2one')\n        target, = Target.create([{'name': \"Target\"}])\n        one2one, = One2One.create([{\n                    'one2one': target,\n                    }])\n\n        one2ones = One2One.search([\n                ('one2one', '=', \"Target\"),\n                ])\n\n        self.assertListEqual(one2ones, [one2one])\n\n    @with_transaction()\n    def test_search_non_equals(self):\n        \"Test search one2one non equals\"\n        pool = Pool()\n        Target = pool.get('test.one2one.target')\n        One2One = pool.get('test.one2one')\n        target, = Target.create([{'name': \"Target\"}])\n        one2one, = One2One.create([{\n                    'one2one': target,\n                    }])\n\n        one2ones = One2One.search([\n                ('one2one', '!=', \"Target\"),\n                ])\n\n        self.assertListEqual(one2ones, [])\n\n    @with_transaction()\n    def test_search_equals_none(self):\n        \"Test search one2one equals None\"\n        pool = Pool()\n        One2One = pool.get('test.one2one')\n        one2one, = One2One.create([{}])\n\n        one2ones = One2One.search([\n                ('one2one', '=', None),\n                ])\n\n        self.assertListEqual(one2ones, [one2one])\n\n    @with_transaction()\n    def test_search_non_equals_none(self):\n        \"Test search one2one non equals None\"\n        pool = Pool()\n        One2One = pool.get('test.one2one')\n        one2one, = One2One.create([{}])\n\n        one2ones = One2One.search([\n                ('one2one', '!=', None),\n                ])\n\n        self.assertListEqual(one2ones, [])\n\n    @with_transaction()\n    def test_search_in(self):\n        \"Test search one2one in\"\n        pool = Pool()\n        Target = pool.get('test.one2one.target')\n        One2One = pool.get('test.one2one')\n        target, = Target.create([{'name': \"Target\"}])\n        one2one, = One2One.create([{\n                    'one2one': target,\n                    }])\n\n        one2ones = One2One.search([\n                ('one2one', 'in', [target.id]),\n                ])\n\n        self.assertListEqual(one2ones, [one2one])\n\n    @with_transaction()\n    def test_search_not_in(self):\n        \"Test search one2one not in\"\n        pool = Pool()\n        Target = pool.get('test.one2one.target')\n        One2One = pool.get('test.one2one')\n        target, = Target.create([{'name': \"Target\"}])\n        one2one, = One2One.create([{\n                    'one2one': target,\n                    }])\n\n        one2ones = One2One.search([\n                ('one2one', 'not in', [target.id]),\n                ])\n\n        self.assertListEqual(one2ones, [])\n\n    @with_transaction()\n    def test_search_in_none(self):\n        \"Test search one2one in [None]\"\n        pool = Pool()\n        Target = pool.get('test.one2one.target')\n        One2One = pool.get('test.one2one')\n        target, = Target.create([{'name': \"Target\"}])\n        one2one, = One2One.create([{\n                    'one2one': target,\n                    }])\n\n        one2ones = One2One.search([\n                ('one2one', 'in', [None]),\n                ])\n\n        self.assertListEqual(one2ones, [])\n\n    @with_transaction()\n    def test_search_not_in_none(self):\n        \"Test search one2one not in [None]\"\n        pool = Pool()\n        Target = pool.get('test.one2one.target')\n        One2One = pool.get('test.one2one')\n        target, = Target.create([{'name': \"Target\"}])\n        one2one, = One2One.create([{\n                    'one2one': target,\n                    }])\n\n        one2ones = One2One.search([\n                ('one2one', 'not in', [None]),\n                ])\n\n        self.assertListEqual(one2ones, [one2one])\n\n    @with_transaction()\n    def test_search_join(self):\n        \"Test search by one2one join\"\n        pool = Pool()\n        Target = pool.get('test.one2one.target')\n        One2One = pool.get('test.one2one')\n        target, = Target.create([{'name': \"Target\"}])\n        one2one, = One2One.create([{\n                    'one2one': target,\n                    }])\n\n        one2ones = One2One.search([\n                ('one2one.name', '=', \"Target\"),\n                ])\n\n        self.assertListEqual(one2ones, [one2one])\n\n    @with_transaction()\n    def test_write_integer(self):\n        \"Test write one2one integer\"\n        pool = Pool()\n        Target = pool.get('test.one2one.target')\n        One2One = pool.get('test.one2one')\n        target, = Target.create([{}])\n        one2one, = One2One.create([{}])\n\n        One2One.write([one2one], {\n                'one2one': target.id,\n                })\n\n        self.assertEqual(one2one.one2one, target)\n\n    @with_transaction()\n    def test_write_none(self):\n        \"Test write one2one None\"\n        pool = Pool()\n        Target = pool.get('test.one2one.target')\n        One2One = pool.get('test.one2one')\n        target, = Target.create([{}])\n        one2one, = One2One.create([{\n                    'one2one': target.id,\n                    }])\n\n        One2One.write([one2one], {\n                'one2one': None,\n                })\n\n        self.assertEqual(one2one.one2one, None)\n\n    @with_transaction()\n    def test_write_duplicate(self):\n        \"Test write one2one duplicate\"\n        pool = Pool()\n        Target = pool.get('test.one2one.target')\n        One2One = pool.get('test.one2one')\n        target, = Target.create([{}])\n        one2one1, one2one2 = One2One.create([{\n                    'one2one': target,\n                    }, {}])\n\n        with self.assertRaises(SQLConstraintError):\n            One2One.write([one2one2], {\n                    'one2one': target.id,\n                    })\n"
  },
  {
    "path": "trytond/tests/test_field_reference.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond.model.exceptions import (\n    DomainValidationError, RequiredValidationError)\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass FieldReferenceTestCase(unittest.TestCase):\n    \"Test Field Reference\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create reference\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n\n        self.assertEqual(reference.reference, target)\n\n    @with_transaction()\n    def test_create_without_default(self):\n        \"Test create reference without default\"\n        pool = Pool()\n        Reference = pool.get('test.reference')\n\n        reference, = Reference.create([{}])\n\n        self.assertEqual(reference.reference, None)\n\n    @with_transaction()\n    def test_create_required_with_value(self):\n        \"Test create reference required with value\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference_required')\n        target, = Target.create([{'name': \"Target\"}])\n\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n\n        self.assertEqual(reference.reference, target)\n\n    @with_transaction()\n    def test_create_required_without_value(self):\n        \"Test create reference required without value\"\n        pool = Pool()\n        Reference = pool.get('test.reference_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Reference.create([{}])\n\n    @with_transaction()\n    def test_create_required_with_none(self):\n        \"Test create reference required with none\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Reference.create([{\n                        'reference': str(Target()),\n                        }])\n\n    @with_transaction()\n    def test_create_required_with_negative(self):\n        \"Test create reference required with negative\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Reference.create([{\n                        'reference': str(Target(id=-1)),\n                        }])\n\n    @with_transaction()\n    def test_create_partial(self):\n        \"Test create reference partial\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n\n        reference, = Reference.create([{\n                    'reference': 'test.reference.target,',\n                    }])\n\n        self.assertEqual(reference.reference, 'test.reference.target,')\n\n    @with_transaction()\n    def test_create_negative(self):\n        \"Test create reference negative\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n\n        reference, = Reference.create([{\n                    'reference': 'test.reference.target,-1',\n                    }])\n\n        self.assertEqual(reference.reference, 'test.reference.target,-1')\n\n    @with_transaction()\n    def test_search_equals_string(self):\n        \"Test search reference equals string\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n\n        references = Reference.search([\n                ('reference', '=', str(target)),\n                ])\n\n        self.assertListEqual(references, [reference])\n\n    @with_transaction()\n    def test_search_equals_tuple(self):\n        \"Test search reference equals tuple\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n\n        references = Reference.search([\n                ('reference', '=', (Target.__name__, target.id)),\n                ])\n\n        self.assertListEqual(references, [reference])\n\n    @with_transaction()\n    def test_search_equals_list(self):\n        \"Test search reference equals list\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n\n        references = Reference.search([\n                ('reference', '=', [Target.__name__, target.id]),\n                ])\n\n        self.assertListEqual(references, [reference])\n\n    @with_transaction()\n    def test_search_equals_none(self):\n        \"Test search reference equals None\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n\n        references = Reference.search([\n                ('reference', '=', None),\n                ])\n\n        self.assertListEqual(references, [])\n\n    @with_transaction()\n    def test_search_non_equals_string(self):\n        \"Test search reference non equals string\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n\n        references = Reference.search([\n                ('reference', '!=', str(target)),\n                ])\n\n        self.assertListEqual(references, [])\n\n    @with_transaction()\n    def test_search_non_equals_tuple(self):\n        \"Test search reference non equals tuple\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n\n        references = Reference.search([\n                ('reference', '!=', (Target.__name__, target.id)),\n                ])\n\n        self.assertListEqual(references, [])\n\n    @with_transaction()\n    def test_search_non_equals_none(self):\n        \"Test search reference non equals None\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n\n        references = Reference.search([\n                ('reference', '!=', None),\n                ])\n\n        self.assertListEqual(references, [reference])\n\n    @with_transaction()\n    def test_search_in_string(self):\n        \"Test search reference in string\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n\n        references = Reference.search([\n                ('reference', 'in', [str(target)]),\n                ])\n\n        self.assertListEqual(references, [reference])\n\n    @with_transaction()\n    def test_search_in_tuple(self):\n        \"Test search reference in tuple\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n\n        references = Reference.search([\n                ('reference', 'in', [(Target.__name__, target.id)]),\n                ])\n\n        self.assertListEqual(references, [reference])\n\n    @with_transaction()\n    def test_search_in_none(self):\n        \"Test search reference in [None]\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n\n        references = Reference.search([\n                ('reference', 'in', [None]),\n                ])\n\n        self.assertListEqual(references, [])\n\n    @with_transaction()\n    def test_search_not_in_string(self):\n        \"Test search reference not in string\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n\n        references = Reference.search([\n                ('reference', 'not in', [str(target)]),\n                ])\n\n        self.assertListEqual(references, [])\n\n    @with_transaction()\n    def test_search_not_in_tuple(self):\n        \"Test search reference not in tuple\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n\n        references = Reference.search([\n                ('reference', 'not in', [(Target.__name__, target.id)]),\n                ])\n\n        self.assertListEqual(references, [])\n\n    @with_transaction()\n    def test_search_not_in_none(self):\n        \"Test search reference not in [None]\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n\n        references = Reference.search([\n                ('reference', 'not in', [None]),\n                ])\n\n        self.assertListEqual(references, [reference])\n\n    @with_transaction()\n    def test_search_join(self):\n        \"Test search reference join\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n\n        references = Reference.search([\n                ('reference.name', '=', \"Target\", Target.__name__),\n                ])\n\n        self.assertListEqual(references, [reference])\n\n    @with_transaction()\n    def test_write_string(self):\n        \"Test write reference string\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n        reference, = Reference.create([{}])\n\n        Reference.write([reference], {\n                'reference': str(target),\n                })\n\n        self.assertEqual(reference.reference, target)\n\n    @with_transaction()\n    def test_write_tuple(self):\n        \"Test write reference string\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n        reference, = Reference.create([{}])\n\n        Reference.write([reference], {\n                'reference': (Target.__name__, target.id),\n                })\n\n        self.assertEqual(reference.reference, target)\n\n    @with_transaction()\n    def test_write_none(self):\n        \"Test write reference None\"\n        pool = Pool()\n        Target = pool.get('test.reference.target')\n        Reference = pool.get('test.reference')\n        target, = Target.create([{'name': \"Target\"}])\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n\n        Reference.write([reference], {\n                'reference': None\n                })\n\n        self.assertEqual(reference.reference, None)\n\n    @with_transaction()\n    def test_context_attribute(self):\n        \"Test context on reference attribute\"\n        pool = Pool()\n        Reference = pool.get('test.reference_context')\n        Target = pool.get('test.reference_context.target')\n\n        target, = Target.create([{}])\n        record, = Reference.create([{\n                    'target': str(target),\n                    }])\n\n        self.assertEqual(record.target.context, 'foo')\n\n    @with_transaction()\n    def test_context_read(self):\n        \"Test context on reference read\"\n        pool = Pool()\n        Reference = pool.get('test.reference_context')\n        Target = pool.get('test.reference_context.target')\n\n        target, = Target.create([{}])\n        record, = Reference.create([{\n                    'target': str(target),\n                    }])\n        data, = Reference.read([record.id], ['target.context'])\n\n        self.assertEqual(data['target.']['context'], 'foo')\n\n    @with_transaction()\n    def test_context_read_multi(self):\n        \"Test context on reference read with value and None\"\n        pool = Pool()\n        Reference = pool.get('test.reference_context')\n        Target = pool.get('test.reference_context.target')\n\n        target, = Target.create([{}])\n        records = Reference.create([{\n                    'target': str(target),\n                    }, {\n                    'target': None,\n                    }])\n        data = Reference.read([r.id for r in records], ['target.context'])\n\n        self.assertEqual(data[0]['target.']['context'], 'foo')\n        self.assertEqual(data[1]['target.'], None)\n\n    @with_transaction()\n    def test_context_set(self):\n        \"Test context on reference set\"\n        pool = Pool()\n        Reference = pool.get('test.reference_context')\n        Target = pool.get('test.reference_context.target')\n\n        target, = Target.create([{}])\n        record = Reference(target=str(target))\n\n        self.assertEqual(record.target.context, 'foo')\n\n    @with_transaction()\n    def test_domain_valid(self):\n        \"Test reference with valid domain\"\n        pool = Pool()\n        Reference = pool.get('test.reference_domainvalidation')\n        Target = pool.get('test.reference_domainvalidation.target')\n        target = Target(value=42)\n        target.save()\n\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n        self.assertEqual(reference.reference, target)\n\n    @with_transaction()\n    def test_domain_invalid(self):\n        \"Test reference with invalid domain\"\n        pool = Pool()\n        Reference = pool.get('test.reference_domainvalidation')\n        Target = pool.get('test.reference_domainvalidation.target')\n        target = Target(value=1)\n        target.save()\n\n        reference = Reference(reference=target)\n        with self.assertRaises(DomainValidationError):\n            reference.save()\n\n    @with_transaction()\n    def test_no_domain(self):\n        \"Test reference with no domain\"\n        pool = Pool()\n        Reference = pool.get('test.reference_domainvalidation')\n        Target = pool.get('test.reference.target')\n        target = Target(name=\"Test\")\n        target.save()\n\n        reference, = Reference.create([{\n                    'reference': str(target),\n                    }])\n        self.assertEqual(reference.reference, target)\n\n    @with_transaction()\n    def test_domain_none_value(self):\n        \"Test reference with domain and None value\"\n        pool = Pool()\n        Reference = pool.get('test.reference_domainvalidation')\n\n        reference, = Reference.create([{\n                    'reference': None,\n                    }])\n        self.assertEqual(reference.reference, None)\n\n    @with_transaction()\n    def test_domain_different_targets(self):\n        \"Test reference with domain and different targets\"\n        pool = Pool()\n        Reference = pool.get('test.reference_domainvalidation')\n        Target1 = pool.get('test.reference.target')\n        target1 = Target1(name=\"Test\")\n        target1.save()\n        Target2 = pool.get('test.reference_domainvalidation.target')\n        target2 = Target2(value=6)\n        target2.save()\n\n        references = Reference.create([{\n                    'reference': str(target1),\n                    }, {\n                    'reference': str(target2),\n                    }])\n        self.assertEqual(len(references), 2)\n\n    @with_transaction()\n    def test_domain_pyson(self):\n        \"Test reference with pyson domain\"\n        pool = Pool()\n        Reference = pool.get('test.reference_domainvalidation_pyson')\n        Target = pool.get('test.reference_domainvalidation.target')\n        target = Target(value=42)\n        target.save()\n\n        reference, = Reference.create([{\n                    'value': 1,\n                    'reference': str(target),\n                    }])\n        self.assertEqual(reference.reference, target)\n\n    @with_transaction()\n    def test_domain_pyson_different_targets(self):\n        \"Test reference with pyson domain and different targets\"\n        pool = Pool()\n        Reference = pool.get('test.reference_domainvalidation_pyson')\n        Target1 = pool.get('test.reference.target')\n        target1 = Target1(name=\"Test\")\n        target1.save()\n        Target2 = pool.get('test.reference_domainvalidation.target')\n        target2 = Target2(value=42)\n        target2.save()\n\n        references = Reference.create([{\n                    'reference': str(target1),\n                    }, {\n                    'value': 1,\n                    'reference': str(target2),\n                    }])\n        self.assertEqual(len(references), 2)\n"
  },
  {
    "path": "trytond/tests/test_field_selection.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond.model.exceptions import (\n    RequiredValidationError, SelectionValidationError)\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass FieldSelectionTestCase(unittest.TestCase):\n    \"Test Field Selection\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create selection\"\n        Selection = Pool().get('test.selection')\n\n        selection, selection_none = Selection.create([{\n                    'select': 'arabic',\n                    }, {\n                    'select': None,\n                    }])\n\n        self.assertEqual(selection.select, 'arabic')\n        self.assertEqual(selection_none.select, None)\n\n    @with_transaction()\n    def test_create_not_in(self):\n        \"Test create selection not in selection\"\n        Selection = Pool().get('test.selection')\n\n        with self.assertRaises(SelectionValidationError):\n            Selection.create([{\n                        'select': 'chinese',\n                        }])\n\n    @with_transaction()\n    def test_create_dynamic(self):\n        \"Test create dynamic selection\"\n        Selection = Pool().get('test.selection')\n\n        selection_arabic, selection_hexa = Selection.create([{\n                    'select': 'arabic',\n                    'dyn_select': '1',\n                    }, {\n                    'select': 'hexa',\n                    'dyn_select': '0x3',\n                    }])\n\n        self.assertEqual(selection_arabic.dyn_select, '1')\n        self.assertEqual(selection_hexa.dyn_select, '0x3')\n\n    @with_transaction()\n    def test_create_dynamic_none(self):\n        \"Test create dynamic selection None\"\n        Selection = Pool().get('test.selection')\n\n        selection, = Selection.create([{\n                    'select': 'hexa',\n                    'dyn_select': None,\n                    }])\n\n        self.assertEqual(selection.dyn_select, None)\n\n    @with_transaction()\n    def test_create_dynamic_static(self):\n        \"Test create dynamic selection static\"\n        Selection = Pool().get('test.selection')\n\n        selection, = Selection.create([{\n                    'dyn_select_static': '1',\n                    }])\n\n        self.assertEqual(selection.dyn_select_static, '1')\n\n    @with_transaction()\n    def test_create_dynamic_not_in(self):\n        \"Test create selection not in\"\n        Selection = Pool().get('test.selection')\n\n        with self.assertRaises(SelectionValidationError):\n            Selection.create([{\n                        'select': 'arabic',\n                        'dyn_select': '0x3',\n                        }])\n\n    @with_transaction()\n    def test_create_required_with_value(self):\n        \"Test create selection required with value\"\n        Selection = Pool().get('test.selection_required')\n\n        selection, = Selection.create([{\n                    'select': 'latin',\n                    }])\n\n        self.assertEqual(selection.select, 'latin')\n\n    @with_transaction()\n    def test_create_required_without_value(self):\n        \"Test create selection required without value\"\n        Selection = Pool().get('test.selection_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Selection.create([{}])\n\n    @with_transaction()\n    def test_create_required_none(self):\n        \"Test create selection required without value\"\n        Selection = Pool().get('test.selection_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Selection.create([{\n                        'select': None,\n                        }])\n\n    @with_transaction()\n    def test_search_order_label(self):\n        \"Test search order by label\"\n        pool = Pool()\n        Selection = pool.get('test.selection_label')\n\n        Selection.create([{'select': v} for v in ['a', 'b', 'c']])\n        records = Selection.search([], order=[('select', 'ASC')])\n        values = [r.select for r in records]\n\n        self.assertListEqual(values, ['c', 'b', 'a'])\n\n    @with_transaction()\n    def test_search_order_fixed_selection(self):\n        \"Test search order by fixed selection\"\n        pool = Pool()\n        Selection = pool.get('test.selection')\n\n        Selection.create([{'select': v} for v in ['', 'arabic', 'hexa']])\n        records = Selection.search([], order=[('select', 'DESC')])\n        values = [r.select for r in records]\n\n        self.assertListEqual(values, ['hexa', 'arabic', ''])\n\n    @with_transaction()\n    def test_search_order_static_selection(self):\n        \"Test search order by static selection\"\n        pool = Pool()\n        Selection = pool.get('test.selection')\n\n        Selection.create([\n                {'dyn_select_static': str(i)} for i in range(1, 4)])\n        records = Selection.search([], order=[('dyn_select_static', 'DESC')])\n        values = [r.dyn_select_static for r in records]\n\n        self.assertListEqual(values, ['3', '2', '1'])\n\n    @with_transaction()\n    def test_search_order_dynamic_selection(self):\n        \"Test search order by dynamic selection\"\n        pool = Pool()\n        Selection = pool.get('test.selection')\n\n        Selection.create([\n                {'select': 'arabic', 'dyn_select': str(i)}\n                for i in range(1, 4)])\n        Selection.create([\n                {'select': 'hexa', 'dyn_select': hex(i)}\n                for i in range(1, 4)])\n        records = Selection.search([], order=[('dyn_select', 'DESC')])\n        values = [r.dyn_select for r in records]\n\n        self.assertListEqual(values, ['3', '2', '1', '0x3', '0x2', '0x1'])\n\n    @with_transaction()\n    def test_search_order_unsorted(self):\n        \"Test search order with unsorted selection\"\n        pool = Pool()\n        Selection = pool.get('test.selection')\n\n        Selection.create([{\n                    'unsorted_select': 'second',\n                    }, {\n                    'unsorted_select': 'last',\n                    }, {\n                    'unsorted_select': 'first',\n                    }])\n\n        records = Selection.search([], order=[('unsorted_select', 'ASC')])\n        values = [r.unsorted_select for r in records]\n\n        self.assertListEqual(values, ['first', 'second', 'last'])\n\n    @with_transaction()\n    def test_string(self):\n        \"Test string selection\"\n        Selection = Pool().get('test.selection')\n        selection, selection_none = Selection.create([{\n                    'select': 'arabic',\n                    }, {\n                    'select': None,\n                    }])\n\n        self.assertEqual(selection.select_string, 'Arabic')\n        self.assertEqual(selection_none.select_string, '')\n\n    @with_transaction()\n    def test_string_dynamic(self):\n        \"Test string dynamic selection\"\n        Selection = Pool().get('test.selection')\n\n        selection_arabic, selection_hexa = Selection.create([{\n                    'select': 'arabic',\n                    'dyn_select': '1',\n                    }, {\n                    'select': 'hexa',\n                    'dyn_select': '0x3',\n                    }])\n\n        self.assertEqual(selection_arabic.dyn_select_string, '1')\n        self.assertEqual(selection_hexa.dyn_select_string, '0x3')\n\n    @with_transaction()\n    def test_string_dynamic_none(self):\n        \"Test string dynamic selection None\"\n        Selection = Pool().get('test.selection')\n\n        selection, = Selection.create([{\n                    'select': 'hexa',\n                    'dyn_select': None,\n                    }])\n\n        self.assertEqual(selection.dyn_select_string, '')\n\n    @with_transaction()\n    def test_string_dynamic_selection_static(self):\n        \"Test string dynamic selection static\"\n        Selection = Pool().get('test.selection')\n\n        selection, = Selection.create([{\n                    'dyn_select_static': '1',\n                    }])\n\n        self.assertEqual(selection.dyn_select_static_string, '1')\n"
  },
  {
    "path": "trytond/tests/test_field_text.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond import backend\nfrom trytond.model.exceptions import (\n    RequiredValidationError, SizeValidationError)\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\n\nclass CommonTestCaseMixin:\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create text\"\n        Text = self.Text()\n\n        text, text_none = Text.create([{\n                    'text': \"Test\",\n                    }, {\n                    'text': None,\n                    }])\n\n        self.assertEqual(text.text, \"Test\")\n        self.assertEqual(text_none.text, None)\n\n    @with_transaction()\n    def test_create_unicode(self):\n        \"Test create unicode\"\n        Text = self.Text()\n\n        text, = Text.create([{\n                    'text': \"é\",\n                    }])\n\n        self.assertEqual(text.text, \"é\")\n\n    @with_transaction()\n    def test_create_multiline(self):\n        \"Test create multilibe\"\n        Text = self.Text()\n\n        text, = Text.create([{\n                    'text': \"Foo\\nBar\",\n                    }])\n\n        self.assertEqual(text.text, \"Foo\\nBar\")\n\n    @with_transaction()\n    def test_search_equals(self):\n        \"Test search text equals\"\n        Text = self.Text()\n        text, = Text.create([{\n                    'text': \"Foo\",\n                    }])\n\n        texts_foo = Text.search([\n                ('text', '=', \"Foo\"),\n                ])\n        texts_bar = Text.search([\n                ('text', '=', \"Bar\"),\n                ])\n\n        self.assertListEqual(texts_foo, [text])\n        self.assertListEqual(texts_bar, [])\n\n    @with_transaction()\n    def test_search_equals_none(self):\n        \"Test search text equals None\"\n        Text = self.Text()\n        text, = Text.create([{\n                    'text': None,\n                    }])\n\n        texts = Text.search([\n                ('text', '=', None),\n                ])\n\n        self.assertListEqual(texts, [text])\n\n    @with_transaction()\n    def test_search_equals_unicode(self):\n        \"Test search text equals unicode\"\n        Text = self.Text()\n        text, = Text.create([{\n                    'text': \"é\",\n                    }])\n\n        texts = Text.search([\n                ('text', '=', \"é\"),\n                ])\n\n        self.assertListEqual(texts, [text])\n\n    @with_transaction()\n    def test_search_equals_non_unicode(self):\n        \"Test search text equals non unicode\"\n        Text = self.Text()\n        text, = Text.create([{\n                    'text': \"é\",\n                    }])\n\n        texts = Text.search([\n                ('text', '=', \"é\"),\n                ])\n\n        self.assertListEqual(texts, [text])\n\n    @with_transaction()\n    def test_search_non_equals(self):\n        \"Test search text non equals\"\n        Text = self.Text()\n        text, = Text.create([{\n                    'text': \"Foo\",\n                    }])\n\n        texts_foo = Text.search([\n                ('text', '!=', \"Foo\"),\n                ])\n        texts_bar = Text.search([\n                ('text', '!=', \"Bar\"),\n                ])\n\n        self.assertListEqual(texts_foo, [])\n        self.assertListEqual(texts_bar, [text])\n\n    @with_transaction()\n    def test_search_non_equals_none(self):\n        \"Test search text non equals None\"\n        Text = self.Text()\n        text, = Text.create([{\n                    'text': None,\n                    }])\n\n        texts = Text.search([\n                ('text', '!=', None),\n                ])\n\n        self.assertListEqual(texts, [])\n\n    @with_transaction()\n    def test_search_in(self):\n        \"Test search text in\"\n        Text = self.Text()\n        text, = Text.create([{\n                    'text': \"Foo\",\n                    }])\n\n        texts_foo = Text.search([\n                ('text', 'in', [\"Foo\"]),\n                ])\n        texts_bar = Text.search([\n                ('text', 'in', [\"Bar\"]),\n                ])\n        texts_empty = Text.search([\n                ('text', 'in', []),\n                ])\n\n        self.assertListEqual(texts_foo, [text])\n        self.assertListEqual(texts_bar, [])\n        self.assertListEqual(texts_empty, [])\n\n    @with_transaction()\n    def test_search_in_none(self):\n        \"Test search text in [None]\"\n        Text = self.Text()\n        text, = Text.create([{\n                    'text': None,\n                    }])\n\n        texts = Text.search([\n                ('text', 'in', [None]),\n                ])\n\n        self.assertListEqual(texts, [text])\n\n    @with_transaction()\n    def test_search_not_in(self):\n        \"Test search text not in\"\n        Text = self.Text()\n        text, = Text.create([{\n                    'text': \"Foo\",\n                    }])\n\n        texts_foo = Text.search([\n                ('text', 'not in', [\"Foo\"]),\n                ])\n        texts_bar = Text.search([\n                ('text', 'not in', [\"Bar\"]),\n                ])\n        texts_empty = Text.search([\n                ('text', 'not in', []),\n                ])\n\n        self.assertListEqual(texts_foo, [])\n        self.assertListEqual(texts_bar, [text])\n        self.assertListEqual(texts_empty, [text])\n\n    @with_transaction()\n    def test_search_not_in_none(self):\n        \"Test search text not in [None]\"\n        Text = self.Text()\n        text, = Text.create([{\n                    'text': None,\n                    }])\n\n        texts = Text.search([\n                ('text', 'not in', [None]),\n                ])\n\n        self.assertListEqual(texts, [])\n\n    @with_transaction()\n    def test_search_like(self):\n        \"Test search text like\"\n        Text = self.Text()\n        text, = Text.create([{\n                    'text': \"Bar\",\n                    }])\n\n        texts_bar = Text.search([\n                ('text', 'like', \"Bar\"),\n                ])\n        texts_b = Text.search([\n                ('text', 'like', \"B%\"),\n                ])\n        texts_foo = Text.search([\n                ('text', 'like', \"Foo\"),\n                ])\n        texts_f = Text.search([\n                ('text', 'like', \"F%\"),\n                ])\n\n        self.assertListEqual(texts_bar, [text])\n        self.assertListEqual(texts_b, [text])\n        self.assertListEqual(texts_foo, [])\n        self.assertListEqual(texts_f, [])\n\n    @with_transaction()\n    def test_search_ilike(self):\n        \"Test search text ilike\"\n        Text = self.Text()\n        text, sambreville = Text.create([{\n                    'text': \"Bar\",\n                    }, {\n                    'text': \"Sambreville\",\n                    }])\n        with Transaction().set_context({\n                    '%s.text.search_full_text' % Text.__name__: False,\n                }):\n            texts_bar = Text.search([\n                    ('text', 'ilike', \"bar\"),\n                    ])\n            texts_b = Text.search([\n                    ('text', 'ilike', \"b%\"),\n                    ])\n            texts_foo = Text.search([\n                    ('text', 'ilike', \"foo\"),\n                    ])\n            texts_f = Text.search([\n                    ('text', 'ilike', \"f%\"),\n                    ])\n\n        self.assertListEqual(texts_bar, [text])\n        self.assertListEqual(texts_b, [text])\n        self.assertListEqual(texts_foo, [])\n        self.assertListEqual(texts_f, [])\n\n        self.assertListEqual(\n            Text.search([('text', 'ilike', \"%Sambreville%\")]),\n            [sambreville])\n\n    @unittest.skipIf(backend.name == 'sqlite',\n        \"SQLite does not have full text search\")\n    @with_transaction()\n    def test_search_full_text(self):\n        \"Test search full text\"\n        Text = self.Text()\n        fat_cat, = Text.create([{\n                    'text': \"a fat cat sat on a mat and ate a fat rat\",\n                    }])\n        sad_cat, = Text.create([{\n                    'text': \"a sad cat sat\",\n                    }])\n\n        for value, result in [\n                (\"Fat rat\", [fat_cat]),\n                ('\"sad cat\" or \"fat rat\"', [fat_cat, sad_cat]),\n                ]:\n            with self.subTest(value=value):\n                self.assertListEqual(Text.search([\n                            ('text', 'ilike', value),\n                            ]), result)\n\n    @unittest.skipIf(backend.name == 'sqlite',\n        \"SQLite does not have full text search\")\n    @with_transaction()\n    def test_search_full_text_order(self):\n        \"Test order search full text\"\n        Text = self.Text()\n        sad_cat, = Text.create([{\n                    'text': \"a sad cat sat\",\n                    }])\n        dog, = Text.create([{\n                    'text': \"a dog\",\n                    }])\n        fat_cat, = Text.create([{\n                    'text': \"a fat cat sat on a mat and ate a fat rat\",\n                    }])\n\n        with Transaction().set_context({\n                    '%s.text.order' % Text.__name__: (\n                        '\"sad cat\" or \"fat rat\"'),\n                    }):\n            self.assertListEqual(\n                Text.search([], order=[('text', 'DESC')]),\n                [fat_cat, sad_cat, dog])\n\n    @with_transaction()\n    def test_search_not_like(self):\n        \"Test search text not like\"\n        Text = self.Text()\n        text, = Text.create([{\n                    'text': \"Bar\",\n                    }])\n\n        texts_bar = Text.search([\n                ('text', 'not like', \"Bar\"),\n                ])\n        texts_b = Text.search([\n                ('text', 'not like', \"B%\"),\n                ])\n        texts_foo = Text.search([\n                ('text', 'not like', \"Foo\"),\n                ])\n        texts_f = Text.search([\n                ('text', 'not like', \"F%\"),\n                ])\n\n        self.assertListEqual(texts_bar, [])\n        self.assertListEqual(texts_b, [])\n        self.assertListEqual(texts_foo, [text])\n        self.assertListEqual(texts_f, [text])\n\n    @with_transaction()\n    def test_search_not_ilike(self):\n        \"Test search text not like\"\n        Text = self.Text()\n        text, = Text.create([{\n                    'text': \"Bar\",\n                    }])\n\n        with Transaction().set_context({\n                    '%s.text.search_full_text' % Text.__name__: False,\n                    }):\n            texts_bar = Text.search([\n                    ('text', 'not ilike', \"bar\"),\n                    ])\n            texts_b = Text.search([\n                    ('text', 'not ilike', \"b%\"),\n                    ])\n            texts_foo = Text.search([\n                    ('text', 'not ilike', \"foo\"),\n                    ])\n            texts_f = Text.search([\n                    ('text', 'not ilike', \"f%\"),\n                    ])\n\n        self.assertListEqual(texts_bar, [])\n        self.assertListEqual(texts_b, [])\n        self.assertListEqual(texts_foo, [text])\n        self.assertListEqual(texts_f, [text])\n\n    @with_transaction()\n    def test_write_unicode(self):\n        \"Test write text unicode\"\n        Text = self.Text()\n        text, = Text.create([{\n                    'text': \"Foo\",\n                    }])\n\n        Text.write([text], {\n                'text': \"é\",\n                })\n\n        self.assertEqual(text.text, \"é\")\n\n\nclass FieldTextTestCase(unittest.TestCase, CommonTestCaseMixin):\n    \"Test Field Text\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    def Text(self):\n        return Pool().get('test.text')\n\n    @with_transaction()\n    def test_create_without_default(self):\n        \"Test create text without default\"\n        Text = Pool().get('test.text')\n\n        text, = Text.create([{}])\n\n        self.assertEqual(text.text, None)\n\n    @with_transaction()\n    def test_create_with_default(self):\n        \"Test create text without default\"\n        Text = Pool().get('test.text_default')\n\n        text, = Text.create([{}])\n\n        self.assertEqual(text.text, \"Test\")\n\n    @with_transaction()\n    def test_create_required_with_value(self):\n        \"Test create text required with value\"\n        Text = Pool().get('test.text_required')\n\n        text, = Text.create([{\n                    'text': \"Test\",\n                    }])\n\n        self.assertEqual(text.text, \"Test\")\n\n    @with_transaction()\n    def test_create_required_without_value(self):\n        \"Test create text required without value\"\n        Text = Pool().get('test.text_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Text.create([{}])\n\n    @with_transaction()\n    def test_create_required_with_empty(self):\n        \"Test create text required with empty\"\n        Text = Pool().get('test.text_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Text.create([{\n                        'text': '',\n                        }])\n\n    @with_transaction()\n    def test_create_size_valid(self):\n        \"Test create text with size\"\n        Text = Pool().get('test.text_size')\n\n        text, = Text.create([{\n                    'text': \"Test\",\n                    }])\n\n        self.assertEqual(text.text, \"Test\")\n\n    @with_transaction()\n    def test_create_size_invalid(self):\n        \"Test create text with invalid size\"\n        Text = Pool().get('test.text_size')\n\n        with self.assertRaises(SizeValidationError):\n            Text.create([{\n                        'text': \"foobar\",\n                        }])\n\n    @with_transaction()\n    def test_write(self):\n        \"Test write text\"\n        Text = Pool().get('test.text')\n        text, = Text.create([{\n                    'text': \"Foo\",\n                    }])\n\n        Text.write([text], {\n                'text': \"Bar\",\n                })\n\n        self.assertEqual(text.text, \"Bar\")\n\n    @with_transaction()\n    def test_write_none(self):\n        \"Test write text None\"\n        Text = Pool().get('test.text')\n        text, = Text.create([{\n                    'text': \"Foo\",\n                    }])\n\n        Text.write([text], {\n                'text': None,\n                })\n\n        self.assertEqual(text.text, None)\n\n    @with_transaction()\n    def test_write_size_invalid(self):\n        \"Test write text with invalid size\"\n        Text = Pool().get('test.text_size')\n\n        text, = Text.create([{\n                    'text': \"Test\",\n                    }])\n\n        with self.assertRaises(SizeValidationError):\n            Text.write([text], {\n                    'text': 'foobar',\n                    })\n\n\nclass FieldTextTranslatedTestCase(unittest.TestCase, CommonTestCaseMixin):\n    \"Test Field Text Translated\"\n\n    def Text(self):\n        return Pool().get('test.text_translate')\n\n\nclass FieldFullTextTestCase(unittest.TestCase):\n    \"Test Field FullText\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create full text\"\n        pool = Pool()\n        Model = pool.get('test.text_full')\n\n        record, = Model.create([{\n                    'full_text': \"a fat cat sat on a mat and ate a fat rat\",\n                    }])\n\n        self.assertTrue(record.full_text)\n\n    @with_transaction()\n    def test_create_list(self):\n        \"Test create full text with a list\"\n        pool = Pool()\n        Model = pool.get('test.text_full')\n\n        record, = Model.create([{\n                    'full_text': [\n                        \"The Fat Cats\",\n                        \"a fat cat sat on a mat and ate a fat rat\",\n                        ],\n                    }])\n\n        self.assertTrue(record.full_text)\n\n    @with_transaction()\n    def test_search(self):\n        \"Test search full text\"\n        pool = Pool()\n        Model = pool.get('test.text_full')\n\n        fat_cat, sad_cat = Model.create([{\n                    'full_text': \"a fat cat sat on a mat and ate a fat rat\",\n                    }, {\n                    'full_text': \"a sad cat sat\",\n                    }])\n\n        for clause, result, neg_result in [\n                ('fat', [fat_cat], [sad_cat]),\n                ('cat', [fat_cat, sad_cat], []),\n                ]:\n            with self.subTest(clause=clause):\n                self.assertListEqual(Model.search([\n                            ('full_text', 'ilike', clause),\n                            ]), result)\n                self.assertListEqual(Model.search([\n                            ('full_text', 'not ilike', clause),\n                            ]), neg_result)\n\n    @unittest.skipIf(backend.name == 'sqlite',\n        \"SQLite does not have full text search\")\n    @with_transaction()\n    def test_search_full_text(self):\n        \"Test search full text\"\n        pool = Pool()\n        Model = pool.get('test.text_full')\n\n        fat_cat, sad_cat = Model.create([{\n                    'full_text': \"a fat cat sat on a mat and ate a fat rat\",\n                    }, {\n                    'full_text': \"a sad cat sat\",\n                    }])\n\n        for clause, result in [\n                (\"Fat rat\", [fat_cat]),\n                ('\"sad cat\" or \"fat rat\"', [fat_cat, sad_cat]),\n                ]:\n            with self.subTest(clause=clause):\n                self.assertListEqual(Model.search([\n                            ('full_text', 'ilike', clause),\n                            ]), result)\n\n    @unittest.skipIf(backend.name == 'sqlite',\n        \"SQLite does not have full text search\")\n    @with_transaction()\n    def test_search_full_text_filter(self):\n        \"Test search full text\"\n        pool = Pool()\n        Model = pool.get('test.text_full')\n\n        fat_cat, sad_cat = Model.create([{\n                    'full_text': \"a fat cat sat on a mat and ate a fat rat\",\n                    }, {\n                    'full_text': \"a sad cat sat\",\n                    }])\n\n        for clause, result in [\n                (\"Fat rat\", [fat_cat]),\n                ('\"sad cat\" or \"fat rat\"', [fat_cat, sad_cat]),\n                ]:\n            with self.subTest(clause=clause):\n                with Transaction().set_context({\n                            '%s.full_text.order' % Model.__name__: clause,\n                            }):\n                    self.assertListEqual(Model.search([\n                                ('full_text', '>', 0.01),\n                                ]), result)\n\n    @unittest.skipIf(backend.name == 'sqlite',\n        \"SQLite does not have full text search\")\n    @with_transaction()\n    def test_search_full_text_order(self):\n        \"Test order full text\"\n        pool = Pool()\n        Model = pool.get('test.text_full')\n\n        sad_cat, fat_cat, dog = Model.create([{\n                    'full_text': [\n                        None,\n                        \"a fat cat sat on a mat and ate a fat rat\",\n                        ],\n                    }, {\n                    'full_text': [\n                        \"The Fat Cats\",\n                        \"a fat cat sat on a mat and ate a fat rat\",\n                        ]\n                    }, {\n                    'full_text': \"a dog\",\n                    }])\n\n        with Transaction().set_context({\n                    '%s.full_text.order' % Model.__name__: (\n                        '\"sad cat\" or \"fat rat\"'),\n                    }):\n            self.assertListEqual(\n                Model.search([], order=[('full_text', 'DESC')]),\n                [fat_cat, sad_cat, dog])\n"
  },
  {
    "path": "trytond/tests/test_field_time.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport unittest\n\nfrom sql.functions import CurrentTimestamp\n\nfrom trytond.model.exceptions import (\n    RequiredValidationError, TimeFormatValidationError)\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\npre_evening = datetime.time(16, 30)\nevening = datetime.time(18, 45, 3)\nnight = datetime.time(20, 00)\ndefault_time = datetime.time(16, 30)\n\n\nclass FieldTimeTestCase(unittest.TestCase):\n    \"Test Field Time\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create time\"\n        Time = Pool().get('test.time')\n\n        time, timenone = Time.create([{\n                    'time': evening,\n                    }, {\n                    'time': None\n                    }])\n\n        self.assertEqual(time.time, evening)\n        self.assertEqual(timenone.time, None)\n\n    @with_transaction()\n    def test_create_timestring(self):\n        \"Test create time with time string\"\n        Time = Pool().get('test.time')\n\n        time, = Time.create([{\n                    'time': str(evening),\n                    }])\n\n        self.assertEqual(time.time, evening)\n\n    @with_transaction()\n    def test_create_invalid_timestring(self):\n        \"Test create time with invalid time string\"\n        Time = Pool().get('test.time')\n\n        with self.assertRaises(ValueError):\n            Time.create([{\n                        'time': '2009-02-29',\n                        }])\n\n    @with_transaction()\n    def test_create_without_default(self):\n        \"Test create time without default\"\n        Time = Pool().get('test.time')\n\n        time, = Time.create([{}])\n\n        self.assertEqual(time.time, None)\n\n    @with_transaction()\n    def test_create_with_default(self):\n        \"Test create time with default\"\n        Time = Pool().get('test.time_default')\n\n        time, = Time.create([{}])\n\n        self.assertEqual(time.time, default_time)\n\n    @with_transaction()\n    def test_create_with_sql_value(self):\n        \"Test create time with SQL value\"\n        Time = Pool().get('test.time_precision')\n\n        time, = Time.create([{'time': Time.time.sql_cast(CurrentTimestamp())}])\n\n        self.assertTrue(time.time)\n\n    @with_transaction()\n    def test_set_sql_value(self):\n        \"Test cannot set SQL value\"\n        Time = Pool().get('test.time')\n\n        time = Time()\n\n        with self.assertRaises(ValueError):\n            time.time = Time.time.sql_cast(CurrentTimestamp())\n\n    @with_transaction()\n    def test_create_non_time(self):\n        \"Test create time with non time\"\n        Time = Pool().get('test.time')\n\n        with self.assertRaises(ValueError):\n            Time.create([{\n                        'time': 'non time',\n                        }])\n\n    @with_transaction()\n    def test_create_integer(self):\n        \"Test create time with integer\"\n        Time = Pool().get('test.time')\n\n        with self.assertRaises(ValueError):\n            Time.create([{\n                        'time': 42,\n                        }])\n\n    @with_transaction()\n    def test_create_date(self):\n        \"Test create time with date\"\n        Time = Pool().get('test.time')\n\n        with self.assertRaises(TypeError):\n            Time.create([{\n                        'time': datetime.date(2009, 1, 1),\n                        }])\n\n    @with_transaction()\n    def test_create_microsecond(self):\n        \"Test create time with microsecond\"\n        Time = Pool().get('test.time_required')\n\n        time, = Time.create([{\n                    'time': evening.replace(microsecond=1),\n                    }])\n\n        self.assertEqual(time.time, evening)\n\n    @with_transaction()\n    def test_create_required_with_value(self):\n        \"Test create time required with value\"\n        Time = Pool().get('test.time_required')\n\n        time, = Time.create([{\n                    'time': evening,\n                    }])\n\n        self.assertEqual(time.time, evening)\n\n    @with_transaction()\n    def test_create_required_without_value(self):\n        \"Test create time required without value\"\n        Time = Pool().get('test.time_required')\n\n        with self.assertRaises(RequiredValidationError):\n            Time.create([{}])\n\n    @with_transaction()\n    def test_create_format_valid(self):\n        \"Test create time with valid format\"\n        Time = Pool().get('test.time_format')\n\n        time, = Time.create([{\n                    'time': datetime.time(12, 30),\n                    }])\n\n        self.assertEqual(\n            time.time, datetime.time(12, 30))\n\n    @with_transaction()\n    def test_create_format_invalid(self):\n        \"Test create time with invalid format\"\n        Time = Pool().get('test.time_format')\n\n        with self.assertRaises(TimeFormatValidationError):\n            Time.create([{\n                        'time': datetime.time(12, 30, 25),\n                        }])\n\n    @with_transaction()\n    def test_search_equals(self):\n        \"Test search time equals\"\n        Time = Pool().get('test.time')\n        time, = Time.create([{\n                    'time': evening,\n                    }])\n\n        times_evening = Time.search([\n                ('time', '=', evening),\n                ])\n        times_night = Time.search([\n                ('time', '=', night),\n                ])\n\n        self.assertListEqual(times_evening, [time])\n        self.assertListEqual(times_night, [])\n\n    @with_transaction()\n    def test_search_equals_none(self):\n        \"Test search time equals None\"\n        Time = Pool().get('test.time')\n        time, = Time.create([{\n                    'time': None,\n                    }])\n\n        times = Time.search([\n                ('time', '=', None),\n                ])\n\n        self.assertListEqual(times, [time])\n\n    @with_transaction()\n    def test_search_non_equals(self):\n        \"Test search time non equals\"\n        Time = Pool().get('test.time')\n        time, = Time.create([{\n                    'time': evening,\n                    }])\n\n        times_evening = Time.search([\n                ('time', '!=', evening),\n                ])\n        times_night = Time.search([\n                ('time', '!=', night),\n                ])\n\n        self.assertListEqual(times_evening, [])\n        self.assertListEqual(times_night, [time])\n\n    @with_transaction()\n    def test_search_non_equals_none(self):\n        \"Test search time non equals None\"\n        Time = Pool().get('test.time')\n        time, = Time.create([{\n                    'time': None,\n                    }])\n\n        times = Time.search([\n                ('time', '!=', None),\n                ])\n\n        self.assertListEqual(times, [])\n\n    @with_transaction()\n    def test_search_in(self):\n        \"Test search time in\"\n        Time = Pool().get('test.time')\n        time, = Time.create([{\n                    'time': evening,\n                    }])\n\n        times_evening = Time.search([\n                ('time', 'in', [evening]),\n                ])\n        times_night = Time.search([\n                ('time', 'in', [night]),\n                ])\n        times_empty = Time.search([\n                ('time', 'in', []),\n                ])\n\n        self.assertListEqual(times_evening, [time])\n        self.assertListEqual(times_night, [])\n        self.assertListEqual(times_empty, [])\n\n    @with_transaction()\n    def test_search_in_none(self):\n        \"Test search time in [None]\"\n        Time = Pool().get('test.time')\n        time, = Time.create([{\n                    'time': None,\n                    }])\n\n        times = Time.search([\n                ('time', 'in', [None]),\n                ])\n\n        self.assertListEqual(times, [time])\n\n    @with_transaction()\n    def test_search_not_in(self):\n        \"Test search time not in\"\n        Time = Pool().get('test.time')\n        time, = Time.create([{\n                    'time': evening,\n                    }])\n\n        times_evening = Time.search([\n                ('time', 'not in', [evening]),\n                ])\n        times_night = Time.search([\n                ('time', 'not in', [night]),\n                ])\n        times_empty = Time.search([\n                ('time', 'not in', []),\n                ])\n\n        self.assertListEqual(times_evening, [])\n        self.assertListEqual(times_night, [time])\n        self.assertListEqual(times_empty, [time])\n\n    @with_transaction()\n    def test_search_not_in_none(self):\n        \"Test search time not in [None]\"\n        Time = Pool().get('test.time')\n        time, = Time.create([{\n                    'time': None,\n                    }])\n\n        times = Time.search([\n                ('time', 'not in', [None]),\n                ])\n\n        self.assertListEqual(times, [])\n\n    @with_transaction()\n    def test_search_in_multi(self):\n        \"Test search time in multiple\"\n        Time = Pool().get('test.time')\n        times = Time.create([{\n                    'time': evening,\n                    }, {\n                    'time': night,\n                    }])\n\n        times_in = Time.search([\n                ('time', 'in', [evening, night]),\n                ])\n\n        self.assertListEqual(times_in, times)\n\n    @with_transaction()\n    def test_search_not_in_multi(self):\n        \"Test search time not in multiple\"\n        Time = Pool().get('test.time')\n        Time.create([{\n                    'time': evening,\n                    }, {\n                    'time': night,\n                    }])\n\n        times = Time.search([\n                ('time', 'not in', [evening, night]),\n                ])\n\n        self.assertListEqual(times, [])\n\n    @with_transaction()\n    def test_search_less(self):\n        \"Test search time less than\"\n        Time = Pool().get('test.time')\n        time, = Time.create([{\n                    'time': evening,\n                    }])\n\n        times_night = Time.search([\n                ('time', '<', night),\n                ])\n        times_pre_evening = Time.search([\n                ('time', '<', pre_evening),\n                ])\n        times_evening = Time.search([\n                ('time', '<', evening),\n                ])\n\n        self.assertListEqual(times_night, [time])\n        self.assertListEqual(times_pre_evening, [])\n        self.assertListEqual(times_evening, [])\n\n    @with_transaction()\n    def test_search_less_equals(self):\n        \"Test search time less than or equals\"\n        Time = Pool().get('test.time')\n        time, = Time.create([{\n                    'time': evening,\n                    }])\n\n        times_night = Time.search([\n                ('time', '<=', night),\n                ])\n        times_pre_evening = Time.search([\n                ('time', '<=', pre_evening),\n                ])\n        times_evening = Time.search([\n                ('time', '<=', evening),\n                ])\n\n        self.assertListEqual(times_night, [time])\n        self.assertListEqual(times_pre_evening, [])\n        self.assertListEqual(times_evening, [time])\n\n    @with_transaction()\n    def test_search_greater(self):\n        \"Test search time greater than\"\n        Time = Pool().get('test.time')\n        time, = Time.create([{\n                    'time': evening,\n                    }])\n\n        times_night = Time.search([\n                ('time', '>', night),\n                ])\n        times_pre_evening = Time.search([\n                ('time', '>', pre_evening),\n                ])\n        times_evening = Time.search([\n                ('time', '>', evening),\n                ])\n\n        self.assertListEqual(times_night, [])\n        self.assertListEqual(times_pre_evening, [time])\n        self.assertListEqual(times_evening, [])\n\n    @with_transaction()\n    def test_search_greater_equals(self):\n        \"Test search time greater than or equals\"\n        Time = Pool().get('test.time')\n        time, = Time.create([{\n                    'time': evening,\n                    }])\n\n        times_night = Time.search([\n                ('time', '>=', night),\n                ])\n        times_pre_evening = Time.search([\n                ('time', '>=', pre_evening),\n                ])\n        times_evening = Time.search([\n                ('time', '>=', evening),\n                ])\n\n        self.assertListEqual(times_night, [])\n        self.assertListEqual(times_pre_evening, [time])\n        self.assertListEqual(times_evening, [time])\n\n    @with_transaction()\n    def test_write(self):\n        \"Test write time\"\n        Time = Pool().get('test.time')\n        time, = Time.create([{\n                    'time': evening,\n                    }])\n\n        Time.write([time], {\n                'time': pre_evening,\n                })\n\n        self.assertEqual(time.time, pre_evening)\n\n    @with_transaction()\n    def test_write_non_time(self):\n        \"Test write time with non time\"\n        Time = Pool().get('test.time')\n        time, = Time.create([{\n                    'time': evening,\n                    }])\n\n        with self.assertRaises(ValueError):\n            Time.write([time], {\n                    'time': 'non time',\n                    })\n\n    @with_transaction()\n    def test_write_integer(self):\n        \"Test write time with integer\"\n        Time = Pool().get('test.time')\n        time, = Time.create([{\n                    'time': evening,\n                    }])\n\n        with self.assertRaises(ValueError):\n            Time.write([time], {\n                    'time': 42,\n                    })\n\n    @with_transaction()\n    def test_write_date(self):\n        \"Test write time with date\"\n        Time = Pool().get('test.time')\n        time, = Time.create([{\n                    'time': evening,\n                    }])\n\n        with self.assertRaises(TypeError):\n            Time.write([time], {\n                    'time': datetime.date(2009, 1, 1),\n                    })\n"
  },
  {
    "path": "trytond/tests/test_field_timedelta.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport unittest\n\nfrom trytond.model.exceptions import RequiredValidationError\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\nminute = datetime.timedelta(minutes=1)\nhour = datetime.timedelta(hours=1)\nday = datetime.timedelta(days=1)\ndefault_timedelta = datetime.timedelta(seconds=3600)\n\n\nclass FieldTimeDeltaTestCase(unittest.TestCase):\n    \"Test Field TimeDelta\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create timedelta\"\n        TimeDelta = Pool().get('test.timedelta')\n\n        timedelta, timedelta_none = TimeDelta.create([{\n                    'timedelta': hour,\n                    }, {\n                    'timedelta': None\n                    }])\n\n        self.assertEqual(timedelta.timedelta, hour)\n        self.assertEqual(timedelta_none.timedelta, None)\n\n    @with_transaction()\n    def test_create_without_default(self):\n        \"Test create timedelta without default\"\n        TimeDelta = Pool().get('test.timedelta')\n\n        timedelta, = TimeDelta.create([{}])\n\n        self.assertEqual(timedelta.timedelta, None)\n\n    @with_transaction()\n    def test_create_with_default(self):\n        \"Test create timedelta with default\"\n        TimeDelta = Pool().get('test.timedelta_default')\n\n        timedelta, = TimeDelta.create([{}])\n\n        self.assertEqual(timedelta.timedelta, default_timedelta)\n\n    @with_transaction()\n    def test_create_string(self):\n        \"Test create timedelta with timedelta string\"\n        TimeDelta = Pool().get('test.timedelta')\n\n        timedelta, = TimeDelta.create([{\n                    'timedelta': '1:20:30.5',\n                    }])\n\n        self.assertEqual(\n            timedelta.timedelta,\n            datetime.timedelta(hours=1, minutes=20, seconds=30.5))\n\n    @with_transaction()\n    def test_create_string_simplet(self):\n        \"Test create timedelta with simple timedelta string\"\n        TimeDelta = Pool().get('test.timedelta')\n\n        timedelta, = TimeDelta.create([{\n                    'timedelta': '1:20',\n                    }])\n\n        self.assertEqual(\n            timedelta.timedelta,\n            datetime.timedelta(hours=1, minutes=20))\n\n    @with_transaction()\n    def test_create_invalid_string(self):\n        \"Test create timedelta with invalid timedelta string\"\n        TimeDelta = Pool().get('test.timedelta')\n\n        with self.assertRaises(ValueError):\n            TimeDelta.create([{\n                        'timedelta': 'non timedelta',\n                        }])\n\n    @with_transaction()\n    def test_create_integer(self):\n        \"Test create timedelta with integer\"\n        TimeDelta = Pool().get('test.timedelta')\n\n        timedelta, = TimeDelta.create([{\n                    'timedelta': 42,\n                    }])\n\n        self.assertEqual(timedelta.timedelta, datetime.timedelta(seconds=42))\n\n    @with_transaction()\n    def test_create_float(self):\n        \"Test create timedelta with float\"\n        TimeDelta = Pool().get('test.timedelta')\n\n        timedelta, = TimeDelta.create([{\n                    'timedelta': 42.5,\n                    }])\n\n        self.assertEqual(timedelta.timedelta, datetime.timedelta(seconds=42.5))\n\n    @with_transaction()\n    def test_create_required_with_value(self):\n        \"Test create timedelta required with value\"\n        TimeDelta = Pool().get('test.timedelta_required')\n\n        timedelta, = TimeDelta.create([{\n                    'timedelta': hour,\n                    }])\n\n        self.assertEqual(timedelta.timedelta, hour)\n\n    @with_transaction()\n    def test_create_required_without_value(self):\n        \"Test create timedelta required without value\"\n        TimeDelta = Pool().get('test.timedelta_required')\n\n        with self.assertRaises(RequiredValidationError):\n            TimeDelta.create([{}])\n\n    @with_transaction()\n    def test_search_equals(self):\n        \"Test search timedelta equals\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': hour,\n                    }])\n\n        timedeltas_hour = TimeDelta.search([\n                ('timedelta', '=', hour),\n                ])\n        timedeltas_day = TimeDelta.search([\n                ('timedelta', '=', day),\n                ])\n\n        self.assertListEqual(timedeltas_hour, [timedelta])\n        self.assertListEqual(timedeltas_day, [])\n\n    @with_transaction()\n    def test_search_equals_none(self):\n        \"Test search timedelta equals None\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': None,\n                    }])\n\n        timedeltas = TimeDelta.search([\n                ('timedelta', '=', None),\n                ])\n\n        self.assertListEqual(timedeltas, [timedelta])\n\n    @with_transaction()\n    def test_search_non_equals(self):\n        \"Test search timedelta non equals\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': hour,\n                    }])\n\n        timedeltas_hour = TimeDelta.search([\n                ('timedelta', '!=', hour),\n                ])\n        timedeltas_day = TimeDelta.search([\n                ('timedelta', '!=', day),\n                ])\n\n        self.assertListEqual(timedeltas_hour, [])\n        self.assertListEqual(timedeltas_day, [timedelta])\n\n    @with_transaction()\n    def test_search_non_equals_none(self):\n        \"Test search timedelta non equals None\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': None,\n                    }])\n\n        timedeltas = TimeDelta.search([\n                ('timedelta', '!=', None),\n                ])\n\n        self.assertListEqual(timedeltas, [])\n\n    @with_transaction()\n    def test_search_in(self):\n        \"Test search timedelta in\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': hour,\n                    }])\n\n        timedeltas_hour = TimeDelta.search([\n                ('timedelta', 'in', [hour]),\n                ])\n        timedeltas_day = TimeDelta.search([\n                ('timedelta', 'in', [day]),\n                ])\n        timedeltas_empty = TimeDelta.search([\n                ('timedelta', 'in', []),\n                ])\n\n        self.assertListEqual(timedeltas_hour, [timedelta])\n        self.assertListEqual(timedeltas_day, [])\n        self.assertListEqual(timedeltas_empty, [])\n\n    @with_transaction()\n    def test_search_in_none(self):\n        \"Test search timedelta in [None]\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': None,\n                    }])\n\n        timedeltas = TimeDelta.search([\n                ('timedelta', 'in', [None]),\n                ])\n\n        self.assertListEqual(timedeltas, [timedelta])\n\n    @with_transaction()\n    def test_search_not_in(self):\n        \"Test search timedelta not in\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': hour,\n                    }])\n\n        timedeltas_hour = TimeDelta.search([\n                ('timedelta', 'not in', [hour]),\n                ])\n        timedeltas_day = TimeDelta.search([\n                ('timedelta', 'not in', [day]),\n                ])\n        timedeltas_empty = TimeDelta.search([\n                ('timedelta', 'not in', []),\n                ])\n\n        self.assertListEqual(timedeltas_hour, [])\n        self.assertListEqual(timedeltas_day, [timedelta])\n        self.assertListEqual(timedeltas_empty, [timedelta])\n\n    @with_transaction()\n    def test_search_not_in_none(self):\n        \"Test search timedelta not in [None]\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': None,\n                    }])\n\n        timedeltas = TimeDelta.search([\n                ('timedelta', 'not in', [None]),\n                ])\n\n        self.assertListEqual(timedeltas, [])\n\n    @with_transaction()\n    def test_search_in_multi(self):\n        \"Test search timedelta in multiple\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedeltas = TimeDelta.create([{\n                    'timedelta': hour,\n                    }, {\n                    'timedelta': day,\n                    }])\n\n        timedeltas_in = TimeDelta.search([\n                ('timedelta', 'in', [hour, day]),\n                ])\n\n        self.assertListEqual(timedeltas_in, timedeltas)\n\n    @with_transaction()\n    def test_search_not_in_multi(self):\n        \"Test search timedelta not in multiple\"\n        TimeDelta = Pool().get('test.timedelta')\n        TimeDelta.create([{\n                    'timedelta': hour,\n                    }, {\n                    'timedelta': day,\n                    }])\n\n        timedeltas = TimeDelta.search([\n                ('timedelta', 'not in', [hour, day]),\n                ])\n\n        self.assertListEqual(timedeltas, [])\n\n    @with_transaction()\n    def test_search_less(self):\n        \"Test search timedelta less than\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': hour,\n                    }])\n\n        timedeltas_day = TimeDelta.search([\n                ('timedelta', '<', day),\n                ])\n        timedeltas_minute = TimeDelta.search([\n                ('timedelta', '<', minute),\n                ])\n        timedeltas_hour = TimeDelta.search([\n                ('timedelta', '<', hour),\n                ])\n\n        self.assertListEqual(timedeltas_day, [timedelta])\n        self.assertListEqual(timedeltas_minute, [])\n        self.assertListEqual(timedeltas_hour, [])\n\n    @with_transaction()\n    def test_search_less_equals(self):\n        \"Test search timedelta less than or equals\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': hour,\n                    }])\n\n        timedeltas_day = TimeDelta.search([\n                ('timedelta', '<=', day),\n                ])\n        timedeltas_minute = TimeDelta.search([\n                ('timedelta', '<=', minute),\n                ])\n        timedeltas_hour = TimeDelta.search([\n                ('timedelta', '<=', hour),\n                ])\n\n        self.assertListEqual(timedeltas_day, [timedelta])\n        self.assertListEqual(timedeltas_minute, [])\n        self.assertListEqual(timedeltas_hour, [timedelta])\n\n    @with_transaction()\n    def test_search_greater(self):\n        \"Test search timedelta greater than\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': hour,\n                    }])\n\n        timedeltas_day = TimeDelta.search([\n                ('timedelta', '>', day),\n                ])\n        timedeltas_minute = TimeDelta.search([\n                ('timedelta', '>', minute),\n                ])\n        timedeltas_hour = TimeDelta.search([\n                ('timedelta', '>', hour),\n                ])\n\n        self.assertListEqual(timedeltas_day, [])\n        self.assertListEqual(timedeltas_minute, [timedelta])\n        self.assertListEqual(timedeltas_hour, [])\n\n    @with_transaction()\n    def test_search_greater_equals(self):\n        \"Test search timedelta greater than or equals\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': hour,\n                    }])\n\n        timedeltas_day = TimeDelta.search([\n                ('timedelta', '>=', day),\n                ])\n        timedeltas_minute = TimeDelta.search([\n                ('timedelta', '>=', minute),\n                ])\n        timedeltas_hour = TimeDelta.search([\n                ('timedelta', '>=', hour),\n                ])\n\n        self.assertListEqual(timedeltas_day, [])\n        self.assertListEqual(timedeltas_minute, [timedelta])\n        self.assertListEqual(timedeltas_hour, [timedelta])\n\n    @with_transaction()\n    def test_write(self):\n        \"Test write timedelta\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': hour,\n                    }])\n\n        TimeDelta.write([timedelta], {\n                'timedelta': minute,\n                })\n\n        self.assertEqual(timedelta.timedelta, minute)\n\n    @with_transaction()\n    def test_write_string(self):\n        \"Test write timedelta with timedelta string\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': hour,\n                    }])\n\n        TimeDelta.write([timedelta], {\n                'timedelta': '1:20:30.5',\n                })\n\n        self.assertEqual(\n            timedelta.timedelta,\n            datetime.timedelta(hours=1, minutes=20, seconds=30.5))\n\n    @with_transaction()\n    def test_write_string_simple(self):\n        \"Test write timedelta with simple timedelta string\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': hour,\n                    }])\n\n        TimeDelta.write([timedelta], {\n                'timedelta': '1:20',\n                })\n\n        self.assertEqual(\n            timedelta.timedelta,\n            datetime.timedelta(hours=1, minutes=20))\n\n    @with_transaction()\n    def test_write_invalid_string(self):\n        \"Test write timedelta with invalid timedelta string\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': hour,\n                    }])\n\n        with self.assertRaises(ValueError):\n            TimeDelta.write([timedelta], {\n                    'timedelta': 'non timedelta',\n                    })\n\n    @with_transaction()\n    def test_write_interger(self):\n        \"Test write timedelta with integer\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': hour,\n                    }])\n\n        TimeDelta.write([timedelta], {\n                'timedelta': 42,\n                })\n\n        self.assertEqual(\n            timedelta.timedelta,\n            datetime.timedelta(seconds=42))\n\n    @with_transaction()\n    def test_write_float(self):\n        \"Test write timedelta with float\"\n        TimeDelta = Pool().get('test.timedelta')\n        timedelta, = TimeDelta.create([{\n                    'timedelta': hour,\n                    }])\n\n        TimeDelta.write([timedelta], {\n                'timedelta': 42.5,\n                })\n\n        self.assertEqual(\n            timedelta.timedelta,\n            datetime.timedelta(seconds=42.5))\n"
  },
  {
    "path": "trytond/tests/test_filestore.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport os\nimport shutil\nimport tempfile\nimport unittest\nfrom unittest.mock import patch\n\nfrom trytond.config import config\nfrom trytond.filestore import filestore\n\n\nclass FileStoreTestCase(unittest.TestCase):\n    \"Test FileStore\"\n\n    def setUp(self):\n        path = config.get('database', 'path')\n        dtemp = tempfile.mkdtemp()\n        config.set('database', 'path', dtemp)\n        self.addCleanup(config.set, 'database', 'path', path)\n        self.addCleanup(shutil.rmtree, dtemp)\n\n    def data(self):\n        return os.urandom(10)\n\n    def test_set(self):\n        \"Test set\"\n        result = filestore.set(self.data(), prefix='test')\n        self.assertTrue(result)\n        self.assertIsInstance(result, str)\n\n    def test_setmany(self):\n        \"Test setmany\"\n        result = filestore.setmany([self.data(), self.data()], prefix='test')\n        self.assertIsInstance(result, list)\n        self.assertEqual(len(result), 2)\n        self.assertIsInstance(result[0], str)\n\n    def test_get(self):\n        \"Test get\"\n        data = self.data()\n        id = filestore.set(data, prefix='test')\n        self.assertEqual(filestore.get(id, prefix='test'), data)\n\n    def test_getmany(self):\n        \"Test getmany\"\n        data = [self.data(), self.data()]\n        ids = filestore.setmany(data, prefix='test')\n        self.assertListEqual(filestore.getmany(ids, prefix='test'), data)\n\n    def test_size(self):\n        \"Test size\"\n        data = self.data()\n        id = filestore.set(data, prefix='test')\n        self.assertEqual(filestore.size(id, prefix='test'), len(data))\n\n    def test_sizemany(self):\n        \"Test sizemany\"\n        data = [self.data(), self.data()]\n        lens = [len(d) for d in data]\n        ids = filestore.setmany(data, prefix='test')\n        self.assertListEqual(filestore.sizemany(ids, prefix='test'), lens)\n\n    def test_prefix(self):\n        \"Test prefix\"\n        data = self.data()\n        id = filestore.set(data, prefix='foo')\n        with self.assertRaises(IOError):\n            filestore.get(id, prefix='bar')\n\n    def test_bad_prefix(self):\n        \"Test bad prefix\"\n        with self.assertRaises(ValueError):\n            filestore.set(self.data(), prefix='../')\n\n    def test_duplicate(self):\n        \"Test duplicate\"\n        data = self.data()\n        id = filestore.set(data, prefix='test')\n        self.assertEqual(filestore.set(data, prefix='test'), id)\n\n    def test_collision(self):\n        \"Test collision\"\n        data1 = self.data()\n        data2 = self.data()\n\n        id1 = filestore.set(data1, prefix='test')\n\n        with patch.object(filestore, '_id') as _id:\n            _id.return_value = id1\n\n            id2 = filestore.set(data2, prefix='test')\n\n        self.assertNotEqual(id1, id2)\n        self.assertEqual(filestore.get(id1, prefix='test'), data1)\n        self.assertEqual(filestore.get(id2, prefix='test'), data2)\n"
  },
  {
    "path": "trytond/tests/test_history.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport unittest\n\nfrom trytond import backend\nfrom trytond.model.exceptions import AccessError\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\n\nclass HistoryTestCase(unittest.TestCase):\n    'Test History'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def tearDown(self):\n        pool = Pool()\n        History = pool.get('test.history')\n        HistoryLine = pool.get('test.history.line')\n        transaction = Transaction()\n        cursor = transaction.connection.cursor()\n        for Model in [History, HistoryLine]:\n            table = Model.__table__()\n            history_table = Model.__table_history__()\n            cursor.execute(*table.delete())\n            cursor.execute(*history_table.delete())\n        transaction.commit()\n\n    @with_transaction()\n    def test_read(self):\n        'Test read history'\n        pool = Pool()\n        History = pool.get('test.history')\n        transaction = Transaction()\n\n        # Create some history entry\n        # It is needed to commit to have different timestamps\n        history = History(value=1)\n        history.save()\n        history_id = history.id\n        first = history.create_date\n\n        transaction.commit()\n\n        history = History(history_id)\n        history.value = 2\n        history.save()\n        second = history.write_date\n\n        transaction.commit()\n\n        history = History(history_id)\n        history.value = 3\n        history.save()\n        third = history.write_date\n\n        transaction.commit()\n\n        for timestamp, value in [\n                (first, 1),\n                (second, 2),\n                (third, 3),\n                (datetime.datetime.now(), 3),\n                (datetime.datetime.max, 3),\n                ]:\n            with Transaction().set_context(_datetime=timestamp):\n                history = History(history_id)\n                self.assertEqual(history.value, value)\n\n        with Transaction().set_context(_datetime=datetime.datetime.min):\n            with self.assertRaises(AccessError):\n                History.read([history_id], ['value'])\n\n    @unittest.skipUnless(backend.name == 'postgresql',\n        'CURRENT_TIMESTAMP as transaction_timestamp is specific to postgresql')\n    @with_transaction()\n    def test_read_same_timestamp(self):\n        'Test read history with same timestamp'\n        pool = Pool()\n        History = pool.get('test.history')\n        transaction = Transaction()\n\n        history = History(value=1)\n        history.save()\n        history_id = history.id\n        first = history.create_date\n\n        history.value = 2\n        history.save()\n        second = history.write_date\n\n        self.assertEqual(first, second)\n\n        transaction.commit()\n\n        history = History(history_id)\n        history.value = 3\n        history.save()\n        third = history.write_date\n\n        transaction.commit()\n\n        for timestamp, value in [\n                (first, 2),\n                (third, 3),\n                ]:\n            with Transaction().set_context(_datetime=timestamp):\n                history = History(history_id)\n                self.assertEqual(history.value, value)\n\n    @with_transaction()\n    def test_history_revisions(self):\n        'Test history revisions'\n        pool = Pool()\n        History = pool.get('test.history')\n        transaction = Transaction()\n\n        history = History(value=1)\n        history.save()\n        history_id = history.id\n        first = history.create_date\n\n        transaction.commit()\n\n        history = History(history_id)\n        history.value = 2\n        history.save()\n        second = history.write_date\n\n        transaction.commit()\n\n        history = History(history_id)\n        history.value = 3\n        history.save()\n        third = history.write_date\n\n        transaction.commit()\n\n        revisions = History.history_revisions([history_id])\n        self.assertEqual(revisions, [\n                (third, history_id, 'Administrator'),\n                (second, history_id, 'Administrator'),\n                (first, history_id, 'Administrator'),\n                ])\n\n    @with_transaction()\n    def test_restore_history(self):\n        'Test restore history'\n        pool = Pool()\n        History = pool.get('test.history')\n        transaction = Transaction()\n\n        history = History(value=1)\n        history.save()\n        history_id = history.id\n        first = history.create_date\n\n        transaction.commit()\n\n        history = History(history_id)\n        history.value = 2\n        history.save()\n\n        transaction.commit()\n\n        History.restore_history([history_id], first)\n        history = History(history_id)\n        self.assertEqual(history.value, 1)\n\n        transaction.rollback()\n\n        History.restore_history([history_id], datetime.datetime.min)\n        with self.assertRaises(AccessError):\n            History.read([history_id], ['value'])\n\n        transaction.rollback()\n\n        History.delete([History(history_id)])\n\n        transaction.commit()\n\n        History.restore_history([history_id], datetime.datetime.max)\n        with self.assertRaises(AccessError):\n            History.read([history_id], ['value'])\n\n    @with_transaction()\n    def test_restore_history_before(self):\n        'Test restore history before'\n        pool = Pool()\n        History = pool.get('test.history')\n        transaction = Transaction()\n\n        history = History(value=1)\n        history.save()\n        history_id = history.id\n\n        transaction.commit()\n\n        history = History(history_id)\n        history.value = 2\n        history.save()\n        second = history.write_date\n\n        transaction.commit()\n\n        history = History(history_id)\n        history.value = 3\n        history.save()\n\n        transaction.commit()\n\n        History.restore_history_before([history_id], second)\n        history = History(history_id)\n        self.assertEqual(history.value, 1)\n\n    @unittest.skipUnless(backend.name == 'postgresql',\n        'CURRENT_TIMESTAMP as transaction_timestamp is specific to postgresql')\n    @with_transaction()\n    def test_restore_history_same_timestamp(self):\n        'Test restore history with same timestamp'\n        pool = Pool()\n        History = pool.get('test.history')\n        transaction = Transaction()\n\n        history = History(value=1)\n        history.save()\n        history_id = history.id\n        first = history.create_date\n        history.value = 2\n        history.save()\n        second = history.create_date\n\n        self.assertEqual(first, second)\n\n        transaction.commit()\n\n        history = History(history_id)\n        history.value = 3\n        history.save()\n\n        transaction.commit()\n\n        History.restore_history([history_id], first)\n        history = History(history_id)\n        self.assertEqual(history.value, 2)\n\n    @with_transaction()\n    def test_ordered_search(self):\n        'Test ordered search of history models'\n        pool = Pool()\n        History = pool.get('test.history')\n        transaction = Transaction()\n        order = [('value', 'ASC')]\n\n        history = History(value=1)\n        history.save()\n        first_id = history.id\n        first_stamp = history.create_date\n        transaction.commit()\n\n        history = History(value=2)\n        history.save()\n        second_id = history.id\n        second_stamp = history.create_date\n\n        transaction.commit()\n\n        first, second = History.search([], order=order)\n\n        self.assertEqual(first.id, first_id)\n        self.assertEqual(second.id, second_id)\n\n        first.value = 3\n        first.save()\n        third_stamp = first.write_date\n        transaction.commit()\n\n        results = [\n            (first_stamp, [first]),\n            (second_stamp, [first, second]),\n            (third_stamp, [second, first]),\n            (datetime.datetime.now(), [second, first]),\n            (datetime.datetime.max, [second, first]),\n            ]\n        for timestamp, instances in results:\n            with Transaction().set_context(_datetime=timestamp):\n                records = History.search([], order=order)\n                self.assertEqual(records, instances)\n            transaction.rollback()\n\n        to_delete, _ = History.search([], order=order)\n\n        self.assertEqual(to_delete.id, second.id)\n\n        History.delete([to_delete])\n        transaction.commit()\n\n        results = [\n            (first_stamp, [first]),\n            (second_stamp, [first, second]),\n            (third_stamp, [second, first]),\n            (datetime.datetime.now(), [first]),\n            (datetime.datetime.max, [first]),\n            ]\n        for timestamp, instances in results:\n            with Transaction().set_context(_datetime=timestamp,\n                    from_test=True):\n                records = History.search([], order=order)\n                self.assertEqual(records, instances)\n            transaction.rollback()\n\n    @unittest.skipUnless(backend.name == 'postgresql',\n        'CURRENT_TIMESTAMP as transaction_timestamp is specific to postgresql')\n    @with_transaction()\n    def test_ordered_search_same_timestamp(self):\n        'Test ordered search  with same timestamp'\n        pool = Pool()\n        History = pool.get('test.history')\n        transaction = Transaction()\n        order = [('value', 'ASC')]\n\n        history = History(value=1)\n        history.save()\n        first_stamp = history.create_date\n        history.value = 4\n        history.save()\n        second_stamp = history.write_date\n\n        self.assertEqual(first_stamp, second_stamp)\n        transaction.commit()\n\n        results = [\n            (second_stamp, [history], [4]),\n            (datetime.datetime.now(), [history], [4]),\n            (datetime.datetime.max, [history], [4]),\n            ]\n\n        for timestamp, instances, values in results:\n            with Transaction().set_context(_datetime=timestamp,\n                    last_test=True):\n                records = History.search([], order=order)\n                self.assertEqual(records, instances)\n                self.assertEqual([x.value for x in records], values)\n            transaction.rollback()\n\n    @with_transaction()\n    def test_ordered_search_nested(self):\n        \"Test ordered search nested\"\n        pool = Pool()\n        History = pool.get('test.history')\n        HistoryLine = pool.get('test.history.line')\n        transaction = Transaction()\n        order = [('history.value', 'ASC')]\n\n        history = History(value=1)\n        history.save()\n        history2 = History(value=2)\n        history2.save()\n        line = HistoryLine(history=history)\n        line.save()\n        line2 = HistoryLine(history=history2)\n        line2.save()\n        first_stamp = line2.create_date\n        transaction.commit()\n\n        history.value = 3\n        history.save()\n        second_stamp = history.write_date\n        transaction.commit()\n\n        results = [\n            (first_stamp, [line, line2]),\n            (second_stamp, [line2, line]),\n            ]\n        for timestamp, instances in results:\n            with Transaction().set_context(_datetime=timestamp):\n                records = HistoryLine.search([], order=order)\n                self.assertListEqual(records, instances)\n\n    @with_transaction()\n    def test_browse(self):\n        'Test browsing history'\n        pool = Pool()\n        History = pool.get('test.history')\n        Line = pool.get('test.history.line')\n        transaction = Transaction()\n\n        history = History(value=1)\n        history.save()\n        history_id = history.id\n        line_a = Line(name='a', history=history)\n        line_a.save()\n        line_a_id = line_a.id\n        line_b = Line(name='b', history=history)\n        line_b.save()\n        line_b_id = line_b.id\n\n        first_stamp = line_b.create_date\n\n        history.stamp = first_stamp\n        history.save()\n\n        transaction.commit()\n\n        history = History(history_id)\n        history.value = 2\n        history.save()\n\n        Line.delete([Line(line_b_id)])\n\n        line_a = Line(line_a_id)\n        line_a.name = 'c'\n        line_a.save()\n\n        second_stamp = line_a.write_date\n\n        transaction.commit()\n\n        history = History(history_id)\n        self.assertEqual(history.value, 2)\n        self.assertEqual([l.name for l in history.lines], ['c'])\n        self.assertEqual(history.stamp, first_stamp)\n        self.assertEqual(\n            [l.name for l in history.lines_at_stamp], ['a', 'b'])\n\n        with Transaction().set_context(_datetime=first_stamp):\n            history = History(history_id)\n        self.assertEqual(history.value, 1)\n        self.assertEqual([l.name for l in history.lines], ['a', 'b'])\n\n        with Transaction().set_context(_datetime=second_stamp):\n            history = History(history_id)\n        self.assertEqual(history.value, 2)\n        self.assertEqual([l.name for l in history.lines], ['c'])\n        self.assertEqual(history.stamp, first_stamp)\n        self.assertEqual(\n            [l.name for l in history.lines_at_stamp], ['a', 'b'])\n\n    @with_transaction()\n    def test_search_cursor_max(self):\n        'Test search with number of history entries at database.IN_MAX'\n        pool = Pool()\n        History = pool.get('test.history')\n        transaction = Transaction()\n        database = transaction.database\n\n        history = History(value=-1)\n        history.save()\n\n        for history.value in range(database.IN_MAX + 1):\n            history.save()\n\n        with transaction.set_context(_datetime=datetime.datetime.max):\n            record, = History.search([])\n\n            self.assertEqual(record.value, database.IN_MAX)\n\n    @with_transaction()\n    def test_search_cursor_max_entries(self):\n        'Test search for skipping first history entries at database.IN_MAX'\n        pool = Pool()\n        History = pool.get('test.history')\n        transaction = Transaction()\n        database = transaction.database\n\n        for i in range(0, 2):\n            history = History(value=-1)\n            history.save()\n\n            for history.value in range(database.IN_MAX + 1):\n                history.save()\n\n        with transaction.set_context(_datetime=datetime.datetime.max):\n            records = History.search([])\n\n            self.assertEqual({r.value for r in records}, {database.IN_MAX})\n            self.assertEqual(len(records), 2)\n\n    @with_transaction()\n    def test_search_cursor_max_histories(self):\n        'Test search with number of histories at database.IN_MAX'\n        pool = Pool()\n        History = pool.get('test.history')\n        transaction = Transaction()\n        database = transaction.database\n\n        n = database.IN_MAX + 1\n        History.create([{'value': 1}] * n)\n\n        with transaction.set_context(_datetime=datetime.datetime.max):\n            records = History.search([])\n\n            self.assertEqual({r.value for r in records}, {1})\n            self.assertEqual(len(records), n)\n"
  },
  {
    "path": "trytond/tests/test_i18n.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond.i18n import gettext, lazy_gettext\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.tools.string_ import LazyString\n\n\nclass I18nTestCase(unittest.TestCase):\n    'Test Model Access'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_gettext_with_translation(self):\n        \"gettext returns the translated text\"\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        Translation = pool.get('ir.translation')\n        ModelData = pool.get('ir.model.data')\n\n        lang, = Lang.search([('code', '!=', 'en')], limit=1)\n        Translation.create([{\n                    'name': 'ir.message,text',\n                    'lang': lang.code,\n                    'type': 'model',\n                    'res_id': ModelData.get_id('tests', 'msg_test'),\n                    'src': 'Message',\n                    'value': 'Translated Message',\n                    'module': 'tests',\n                    'fuzzy': False,\n                    }])\n\n        message = gettext('tests.msg_test', lang.code)\n\n        self.assertEqual(message, 'Translated Message')\n\n    @with_transaction()\n    def test_gettext_with_translation_format(self):\n        \"gettext returns the translated and formatted text\"\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        Translation = pool.get('ir.translation')\n        ModelData = pool.get('ir.model.data')\n\n        lang, = Lang.search([('code', '!=', 'en')], limit=1)\n        Translation.create([{\n                    'name': 'ir.message,text',\n                    'lang': lang.code,\n                    'type': 'model',\n                    'res_id': ModelData.get_id('tests', 'msg_test'),\n                    'src': 'Message',\n                    'value': 'Translated Message %(variable)s',\n                    'module': 'tests',\n                    'fuzzy': False,\n                    }])\n\n        message1 = gettext(\n            'tests.msg_test', lang.code, variable='foo')\n        message2 = gettext(\n            'tests.msg_test', lang.code, variable='bar')\n\n        self.assertEqual(message1, 'Translated Message foo')\n        self.assertEqual(message2, 'Translated Message bar')\n\n    @with_transaction()\n    def test_gettext_no_translation(self):\n        \"gettext returns original string when no translation\"\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n\n        lang, = Lang.search([('code', '!=', 'en')], limit=1)\n\n        message = gettext('tests.msg_test', lang.code)\n\n        self.assertEqual(message, 'Message')\n\n    @with_transaction()\n    def test_gettest_wrong_id_format(self):\n        \"gettext returns the id if it has wrong format\"\n        message = gettext(\"Wrong Format\")\n\n        self.assertEqual(message, \"Wrong Format\")\n\n    @with_transaction()\n    def test_gettext_wrong_id(self):\n        \"gettext returns the id if it does not exist\"\n        message = gettext('tests.not_exist')\n\n        self.assertEqual(message, 'tests.not_exist')\n\n    def test_gettext_without_transaction(self):\n        \"gettext return the id if there is no transaction\"\n        message = gettext('test.msg_test')\n\n        self.assertEqual(message, 'test.msg_test')\n\n    @with_transaction()\n    def test_lazy_gettext(self):\n        \"lazy_gettext returns a LazyString\"\n        lazy = lazy_gettext('tests.msg_test')\n\n        self.assertIsInstance(lazy, LazyString)\n        self.assertEqual(str(lazy), \"Message\")\n"
  },
  {
    "path": "trytond/tests/test_importdata.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime as dt\nimport unittest\nfrom decimal import Decimal\n\nfrom trytond.model.exceptions import ImportDataError\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass ImportDataTestCase(unittest.TestCase):\n    'Test import_data'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_boolean(self):\n        'Test boolean'\n        pool = Pool()\n        Boolean = pool.get('test.import_data.boolean')\n\n        for value in ['True', '1', 'False', '0', '']:\n            with self.subTest(value=value):\n                self.assertEqual(\n                    Boolean.import_data(['boolean'], [[value]]), 1)\n\n    @with_transaction()\n    def test_boolean_many_rows(self):\n        \"Test boolean many rows\"\n        pool = Pool()\n        Boolean = pool.get('test.import_data.boolean')\n\n        self.assertEqual(\n            Boolean.import_data(['boolean'], [['True'], ['False']]), 2)\n\n    @with_transaction()\n    def test_boolean_invalid(self):\n        \"Test boolean invalid value\"\n        pool = Pool()\n        Boolean = pool.get('test.import_data.boolean')\n\n        with self.assertRaises(ImportDataError):\n            Boolean.import_data(['boolean'], [['foo']])\n\n    @with_transaction()\n    def test_integer(self):\n        'Test integer'\n        pool = Pool()\n        Integer = pool.get('test.import_data.integer')\n\n        for value in ['1', '0', 0, 1, '-1', '', None]:\n            with self.subTest(value=value):\n                self.assertEqual(\n                    Integer.import_data(['integer'], [[value]]), 1)\n\n    @with_transaction()\n    def test_integer_many_rows(self):\n        \"Test integer many rows\"\n        pool = Pool()\n        Integer = pool.get('test.import_data.integer')\n\n        self.assertEqual(\n            Integer.import_data(['integer'], [['1'], ['2']]), 2)\n\n    @with_transaction()\n    def test_integer_invalid(self):\n        \"Test integer invalid value\"\n        pool = Pool()\n        Integer = pool.get('test.import_data.integer')\n\n        for value in ['1.1', '-1.1', 'foo']:\n            with self.subTest(value=value):\n                with self.assertRaises(ImportDataError):\n                    Integer.import_data(['integer'], [[value]])\n\n    @with_transaction()\n    def test_float(self):\n        'Test float'\n        pool = Pool()\n        Float = pool.get('test.import_data.float')\n\n        for value in [\n                '1.1', 0.0, 1.1, '-1.1', '1', '', '1.1', '0', '0.0', None]:\n            with self.subTest(value=value):\n                self.assertEqual(\n                    Float.import_data(['float'], [[value]]), 1)\n\n    @with_transaction()\n    def test_float_invalid(self):\n        \"Test float invalid value\"\n        pool = Pool()\n        Float = pool.get('test.import_data.float')\n\n        with self.assertRaises(ImportDataError):\n            Float.import_data(['float'], [['foo']])\n\n    @with_transaction()\n    def test_numeric(self):\n        'Test numeric'\n        pool = Pool()\n        Numeric = pool.get('test.import_data.numeric')\n\n        for value in [\n                '1.1', Decimal('1.1'), '-1.1', '1',\n                Decimal('0.0'), '0', '0.0', '', None]:\n            with self.subTest(value=value):\n                self.assertEqual(\n                    Numeric.import_data(['numeric'], [[value]]), 1)\n\n    @with_transaction()\n    def test_numeric_invalid(self):\n        pool = Pool()\n        Numeric = pool.get('test.import_data.numeric')\n\n        with self.assertRaises(ImportDataError):\n            Numeric.import_data(['numeric'], [['foo']])\n\n    @with_transaction()\n    def test_char(self):\n        'Test char'\n        pool = Pool()\n        Char = pool.get('test.import_data.char')\n\n        for value in ['test', '']:\n            with self.subTest(value=value):\n                self.assertEqual(\n                    Char.import_data(['char'], [[value]]), 1)\n\n    @with_transaction()\n    def test_char_many_rows(self):\n        \"Test char many rows\"\n        pool = Pool()\n        Char = pool.get('test.import_data.char')\n\n        self.assertEqual(\n            Char.import_data(['char'], [['test'], ['foo'], ['bar']]), 3)\n\n    @with_transaction()\n    def test_text(self):\n        'Test text'\n        pool = Pool()\n        Text = pool.get('test.import_data.text')\n\n        for value in ['test', '']:\n            with self.subTest(value=value):\n                self.assertEqual(\n                    Text.import_data(['text'], [[value]]), 1)\n\n    @with_transaction()\n    def test_text_many_rows(self):\n        \"Test text many rows\"\n        pool = Pool()\n        Text = pool.get('test.import_data.text')\n\n        self.assertEqual(\n            Text.import_data(['text'], [['test'], ['foo'], ['bar']]), 3)\n\n    @with_transaction()\n    def test_date(self):\n        'Test date'\n        pool = Pool()\n        Date = pool.get('test.import_data.date')\n\n        for value in ['2010-01-01', dt.date(2019, 3, 13), '']:\n            with self.subTest(value=value):\n                self.assertEqual(\n                    Date.import_data(['date'], [[value]]), 1)\n\n    @with_transaction()\n    def test_date_many_rows(self):\n        \"Test date many rows\"\n        pool = Pool()\n        Date = pool.get('test.import_data.date')\n\n        self.assertEqual(\n            Date.import_data(['date'], [['2010-01-01'], ['2010-02-01']]), 2)\n\n    @with_transaction()\n    def test_date_invalid(self):\n        \"Test date invalid value\"\n        pool = Pool()\n        Date = pool.get('test.import_data.date')\n\n        with self.assertRaises(ImportDataError):\n            Date.import_data(['date'], [['foo']])\n\n    @with_transaction()\n    def test_datetime(self):\n        'Test datetime'\n        pool = Pool()\n        Datetime = pool.get('test.import_data.datetime')\n\n        for value in [\n                '2010-01-01 12:00:00', dt.datetime(2019, 3, 13, 12, 0), '']:\n            with self.subTest(value=value):\n                self.assertEqual(\n                    Datetime.import_data(['datetime'], [[value]]), 1)\n\n    @with_transaction()\n    def test_datetime_many_rows(self):\n        \"Test datetime many rows\"\n        pool = Pool()\n        Datetime = pool.get('test.import_data.datetime')\n\n        self.assertEqual(\n            Datetime.import_data(\n                ['datetime'], [\n                    ['2010-01-01 12:00:00'], ['2010-01-01 13:30:00']]), 2)\n\n    @with_transaction()\n    def test_datetime_invalid(self):\n        \"Test datetime invalid value\"\n        pool = Pool()\n        Datetime = pool.get('test.import_data.datetime')\n\n        with self.assertRaises(ImportDataError):\n            Datetime.import_data(['datetime'], [['foo']])\n\n    @with_transaction()\n    def test_timedelta(self):\n        'Test timedelta'\n        pool = Pool()\n        Timedelta = pool.get('test.import_data.timedelta')\n\n        for value in [\n                '00:00', '0:00:00', '01:00:00', '36:00:00', '0:00:00.0001',\n                dt.timedelta(\n                    weeks=2, days=3, hours=8, minutes=50, seconds=30.45),\n                30.45]:\n            with self.subTest(value=value):\n                self.assertEqual(\n                    Timedelta.import_data(['timedelta'], [[value]]), 1)\n\n    @with_transaction()\n    def test_timedelta_invalid(self):\n        'Test timedelta'\n        pool = Pool()\n        Timedelta = pool.get('test.import_data.timedelta')\n\n        with self.assertRaises(ImportDataError):\n            Timedelta.import_data(['timedelta'], [['foo']])\n\n    @with_transaction()\n    def test_selection(self):\n        'Test selection'\n        pool = Pool()\n        Selection = pool.get('test.import_data.selection')\n\n        for value in ['select1', '']:\n            with self.subTest(value=value):\n                self.assertEqual(\n                    Selection.import_data(['selection'], [[value]]), 1)\n\n    @with_transaction()\n    def test_selection_many_rows(self):\n        'Test selection many rows'\n        pool = Pool()\n        Selection = pool.get('test.import_data.selection')\n\n        self.assertEqual(\n            Selection.import_data(['selection'], [['select1'], ['select2']]),\n            2)\n\n    @with_transaction()\n    def test_many2one(self):\n        'Test many2one'\n        pool = Pool()\n        Many2one = pool.get('test.import_data.many2one')\n\n        for value in ['Test', '']:\n            with self.subTest(value=value):\n                self.assertEqual(\n                    Many2one.import_data(['many2one'], [[value]]), 1)\n\n    @with_transaction()\n    def test_many2one_id(self):\n        \"Test many2one with id\"\n        pool = Pool()\n        Many2one = pool.get('test.import_data.many2one')\n\n        self.assertEqual(\n            Many2one.import_data(\n                ['many2one:id'], [['tests.import_data_many2one_target_test']]),\n            1)\n\n    @with_transaction()\n    def test_many2one_many_rows(self):\n        \"Test many2one many rows\"\n        pool = Pool()\n        Many2one = pool.get('test.import_data.many2one')\n\n        self.assertEqual(\n            Many2one.import_data(['many2one'], [['Test'], ['Test']]), 2)\n\n    @with_transaction()\n    def test_many2one_invalid(self):\n        \"Test many2one invalid value\"\n        pool = Pool()\n        Many2one = pool.get('test.import_data.many2one')\n\n        for value in ['foo', 'Duplicate']:\n            with self.subTest(value=value):\n                with self.assertRaises(ImportDataError):\n                    Many2one.import_data(['many2one'], [[value]])\n\n    @with_transaction()\n    def test_many2one_id_invalid(self):\n        \"Test many2one invalid id\"\n        pool = Pool()\n        Many2one = pool.get('test.import_data.many2one')\n\n        for value in ['foo', 'tests.foo']:\n            with self.subTest(value=value):\n                with self.assertRaises(ImportDataError):\n                    Many2one.import_data(['many2one:id'], [[value]])\n\n    @with_transaction()\n    def test_many2many(self):\n        'Test many2many'\n        pool = Pool()\n        Many2many = pool.get('test.import_data.many2many')\n\n        for value in [\n                'Test 1', 'Test\\\\, comma', 'Test\\\\, comma,Test 1',\n                'Test 1,Test 2', '']:\n            with self.subTest(value=value):\n                self.assertEqual(\n                    Many2many.import_data(['many2many'], [[value]]), 1)\n\n    @with_transaction()\n    def test_many2many_id(self):\n        \"Test many2many with id\"\n        pool = Pool()\n        Many2many = pool.get('test.import_data.many2many')\n\n        for value in [\n                'tests.import_data_many2many_target_test1',\n                'tests.import_data_many2many_target_test1,'\n                'tests.import_data_many2many_target_test2']:\n            with self.subTest(value=value):\n                self.assertEqual(\n                    Many2many.import_data(['many2many:id'], [[value]]), 1)\n\n    @with_transaction()\n    def test_many2many_many_rows(self):\n        \"Test many2many many rows\"\n        pool = Pool()\n        Many2many = pool.get('test.import_data.many2many')\n\n        self.assertEqual(\n            Many2many.import_data(['many2many'], [['Test 1'], ['Test 2']]), 2)\n\n    @with_transaction()\n    def test_many2many_invalid(self):\n        \"Test many2many invalid value\"\n        pool = Pool()\n        Many2many = pool.get('test.import_data.many2many')\n\n        for value in ['foo', 'Test 1,foo', 'Duplicate', 'Test 1,Duplicate']:\n            with self.subTest(value=value):\n                with self.assertRaises(ImportDataError):\n                    Many2many.import_data(['many2many'], [[value]])\n\n    @with_transaction()\n    def test_one2many(self):\n        'Test one2many'\n        pool = Pool()\n        One2many = pool.get('test.import_data.one2many')\n\n        self.assertEqual(One2many.import_data(\n                ['name', 'one2many/name'], [['Test', 'Test 1']]), 1)\n\n    @with_transaction()\n    def test_one2many_many_targets(self):\n        \"Test one2many with many targets\"\n        pool = Pool()\n        One2many = pool.get('test.import_data.one2many')\n\n        self.assertEqual(One2many.import_data(\n                ['name', 'one2many/name'],\n                [['Test', 'Test 1'], ['', 'Test 2']]), 1)\n\n    @with_transaction()\n    def test_one2many_many_rows(self):\n        \"Test one2many many rows\"\n        pool = Pool()\n        One2many = pool.get('test.import_data.one2many')\n\n        self.assertEqual(One2many.import_data(\n                ['name', 'one2many/name'],\n                [\n                    ['Test 1', 'Test 1'],\n                    ['', 'Test 2'],\n                    ['Test 2', 'Test 1']]), 2)\n\n    @with_transaction()\n    def test_many_one2many(self):\n        \"Test many one2many\"\n        pool = Pool()\n        One2many = pool.get('test.import_data.one2manies')\n\n        self.assertEqual(One2many.import_data(\n                ['name', 'one2many1/name', 'one2many2/name'],\n                [[\"Test\", \"Test 1\", \"Test 2\"],\n                    ['', '', \"Test 3\"]]), 1)\n\n        record, = One2many.search([])\n\n        self.assertEqual(len(record.one2many1), 1)\n        self.assertEqual(len(record.one2many2), 2)\n\n    @with_transaction()\n    def test_many_one2many_empty_last(self):\n        \"Test many one2many with empty last\"\n        pool = Pool()\n        One2many = pool.get('test.import_data.one2manies')\n\n        self.assertEqual(One2many.import_data(\n                ['name', 'one2many1/name', 'one2many2/name'],\n                [[\"Test\", \"Test 1\", \"Test 2\"],\n                    ['', \"Test 3\", '']]), 1)\n\n        record, = One2many.search([])\n\n        self.assertEqual(len(record.one2many1), 2)\n        self.assertEqual(len(record.one2many2), 1)\n\n    @with_transaction()\n    def test_many_one2many_multiple_empty(self):\n        \"Test many one2many with multiple empty\"\n        pool = Pool()\n        One2many = pool.get('test.import_data.one2manies')\n\n        self.assertEqual(One2many.import_data(\n                ['name', 'one2many1/name', 'one2many2/name'],\n                [[\"Test\", \"Test 1\", \"Test 2\"],\n                    ['', \"Test 3\", ''],\n                    ['', '', \"Test 4\"]]), 1)\n\n        record, = One2many.search([])\n\n        self.assertEqual(len(record.one2many1), 2)\n        self.assertEqual(len(record.one2many2), 2)\n\n    @with_transaction()\n    def test_reference(self):\n        'Test reference'\n        pool = Pool()\n        Reference = pool.get('test.import_data.reference')\n\n        self.assertEqual(Reference.import_data(['reference'],\n            [['test.import_data.reference.selection,Test']]), 1)\n        reference, = Reference.search([])\n        self.assertEqual(reference.reference.__name__,\n            'test.import_data.reference.selection')\n\n    @with_transaction()\n    def test_reference_id(self):\n        \"Test reference with id\"\n        pool = Pool()\n        Reference = pool.get('test.import_data.reference')\n\n        self.assertEqual(Reference.import_data(['reference:id'],\n            [['test.import_data.reference.selection,'\n                'tests.import_data_reference_selection_test']]), 1)\n        reference, = Reference.search([])\n        self.assertEqual(reference.reference.__name__,\n            'test.import_data.reference.selection')\n\n    @with_transaction()\n    def test_reference_empty(self):\n        \"Test reference empty\"\n        pool = Pool()\n        Reference = pool.get('test.import_data.reference')\n\n        self.assertEqual(Reference.import_data(['reference'],\n            [['']]), 1)\n        reference, = Reference.search([])\n        self.assertEqual(reference.reference, None)\n\n    @with_transaction()\n    def test_reference_many_rows(self):\n        \"Test reference many rows\"\n        pool = Pool()\n        Reference = pool.get('test.import_data.reference')\n\n        self.assertEqual(Reference.import_data(['reference'],\n            [['test.import_data.reference.selection,Test'],\n                ['test.import_data.reference.selection,Test']]), 2)\n        for reference in Reference.search([]):\n            self.assertEqual(reference.reference.__name__,\n                'test.import_data.reference.selection')\n\n    @with_transaction()\n    def test_reference_invalid(self):\n        \"Test reference invalid value\"\n        pool = Pool()\n        Reference = pool.get('test.import_data.reference')\n\n        for value in [\n                'test.import_data.reference.selection,foo',\n                'test.import_data.reference.selection,Duplicate',\n                'test.import_data.reference.selection,test.foo']:\n            with self.subTest(value=value):\n                with self.assertRaises(ImportDataError):\n                    Reference.import_data(['reference'], [[value]])\n\n    @with_transaction()\n    def test_reference_id_invalid(self):\n        \"Test reference invalid id\"\n        pool = Pool()\n        Reference = pool.get('test.import_data.reference')\n\n        with self.assertRaises(ImportDataError):\n            Reference.import_data(\n                ['reference:id'],\n                [['test.import_data.reference.selection,foo']])\n\n    @with_transaction()\n    def test_binary_bytes(self):\n        \"Test binary bytes\"\n        pool = Pool()\n        Binary = pool.get('test.import_data.binary')\n\n        self.assertEqual(Binary.import_data(['data'], [[b'data']]), 1)\n        record, = Binary.search([])\n        self.assertEqual(record.data, b'data')\n\n    @with_transaction()\n    def test_binary_base64(self):\n        \"Test binary base64\"\n        pool = Pool()\n        Binary = pool.get('test.import_data.binary')\n\n        self.assertEqual(Binary.import_data(['data'], [['ZGF0YQ==']]), 1)\n        record, = Binary.search([])\n        self.assertEqual(record.data, b'data')\n\n    @with_transaction()\n    def test_update_id(self):\n        \"Test update with ID\"\n        pool = Pool()\n        Char = pool.get('test.import_data.update')\n        record = Char(name=\"foo\")\n        record.save()\n\n        count = Char.import_data(['id', 'name'], [[str(record.id), \"bar\"]])\n\n        record, = Char.search([])\n        self.assertEqual(count, 1)\n        self.assertEqual(record.name, \"bar\")\n\n    @with_transaction()\n    def test_update_rec_name(self):\n        \"Test update with rec_name\"\n        pool = Pool()\n        Char = pool.get('test.import_data.update')\n        record = Char(name=\"foo\")\n        record.save()\n\n        count = Char.import_data(['id', 'name'], [[record.rec_name, \"bar\"]])\n\n        record, = Char.search([])\n        self.assertEqual(count, 1)\n        self.assertEqual(record.name, \"bar\")\n\n    @with_transaction()\n    def test_update_one2many(self):\n        \"Test update one2many\"\n        pool = Pool()\n        One2many = pool.get('test.import_data.one2many')\n        Target = pool.get('test.import_data.one2many.target')\n        record = One2many(name=\"test\", one2many=[Target(name=\"foo\")])\n        record.save()\n        target, = record.one2many\n\n        count = One2many.import_data(\n            ['id', 'one2many/id', 'one2many/name'],\n            [[record.id, target.id, \"bar\"],\n                ['', '', \"baz\"]])\n\n        self.assertEqual(count, 1)\n        self.assertEqual(len(record.one2many), 2)\n        self.assertEqual([t.name for t in record.one2many], [\"bar\", \"baz\"])\n"
  },
  {
    "path": "trytond/tests/test_ir.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport unittest\nfrom decimal import Decimal\nfrom unittest.mock import ANY, Mock, patch\n\ntry:\n    import zoneinfo\nexcept ImportError:\n    zoneinfo = None\n\nfrom dateutil.relativedelta import relativedelta\n\nfrom trytond.config import config\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval, If, PYSONEncoder\nfrom trytond.tools import timezone\nfrom trytond.transaction import Transaction\n\nfrom .test_tryton import (\n    ModuleTestCase, activate_module, drop_db, with_transaction)\n\n\nclass IrTestCase(ModuleTestCase):\n    'Test ir module'\n    module = 'ir'\n\n    @with_transaction()\n    def test_model_search_name(self):\n        \"Test searching on name of model\"\n        pool = Pool()\n        Model = pool.get('ir.model')\n\n        record, = Model.search([\n                ('name', '=', \"Language\"),\n                ('module', '=', 'ir'),\n                ])\n        self.assertEqual(record.name, \"Language\")\n\n    @with_transaction()\n    def test_model_search_order(self):\n        \"Test searching and ordering on name of model\"\n        pool = Pool()\n        Model = pool.get('ir.model')\n\n        records = Model.search([\n                ('name', 'in', [\"Language\", \"Module\"]),\n                ('module', '=', 'ir'),\n                ],\n            order=[('name', 'ASC')])\n        self.assertEqual([r.name for r in records], [\"Language\", \"Module\"])\n\n    @with_transaction()\n    def test_model_field_search_description(self):\n        \"Test searching on description of model field\"\n        pool = Pool()\n        ModelField = pool.get('ir.model.field')\n\n        field, = ModelField.search([\n                ('field_description', '=', \"Name\"),\n                ('model.model', '=', 'ir.lang'),\n                ('module', '=', 'ir'),\n                ])\n        self.assertEqual(field.field_description, \"Name\")\n\n    @with_transaction()\n    def test_model_field_search_order_description(self):\n        \"Test searching and ordering on description of model field\"\n        pool = Pool()\n        ModelField = pool.get('ir.model.field')\n\n        fields = ModelField.search([\n                ('field_description', 'in', [\"Name\", \"Code\"]),\n                ('model.model', '=', 'ir.lang'),\n                ('module', '=', 'ir'),\n                ])\n        self.assertEqual(\n            [f.field_description for f in fields], [\"Code\", \"Name\"])\n\n    @with_transaction()\n    def test_model_field_lazy(self):\n        \"Test searching on lazy string of model field\"\n        pool = Pool()\n        ModelField = pool.get('ir.model.field')\n\n        field, = ModelField.search([\n                ('field_description', '=', \"ID\"),\n                ('model.model', '=', 'ir.lang'),\n                ('module', '=', 'ir'),\n                ])\n        self.assertEqual(field.field_description, \"ID\")\n\n    @with_transaction()\n    def test_sequence_substitutions(self):\n        'Test Sequence Substitutions'\n        pool = Pool()\n        Sequence = pool.get('ir.sequence')\n        SequenceType = pool.get('ir.sequence.type')\n        Date = pool.get('ir.date')\n        try:\n            Group = pool.get('res.group')\n            groups = Group.search([])\n        except KeyError:\n            groups = []\n\n        sequence_type = SequenceType(name='Test', groups=groups)\n        sequence_type.save()\n        sequence = Sequence(name='Test Sequence', sequence_type=sequence_type)\n        sequence.save()\n        self.assertEqual(sequence.get(), '1')\n        today = Date.today()\n        sequence.prefix = '${year}'\n        sequence.save()\n        self.assertEqual(sequence.get(), '%s2' % str(today.year))\n        next_year = today + relativedelta(years=1)\n        with Transaction().set_context(date=next_year):\n            self.assertEqual(sequence.get(), '%s3' % str(next_year.year))\n\n    @with_transaction()\n    def test_global_search(self):\n        'Test Global Search'\n        pool = Pool()\n        Model = pool.get('ir.model')\n        Model.global_search('User', 10)\n\n    @with_transaction()\n    def test_lang_currency(self):\n        \"Test Lang.currency\"\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        lang = Lang.get('en')\n        currency = Mock()\n        currency.digits = 2\n        currency.symbol = '$'\n        test_data = [\n            (Decimal('10.50'), True, False, None, '$10.50'),\n            (Decimal('10.50'), True, False, 4, '$10.5000'),\n            ]\n        for value, symbol, grouping, digits, result in test_data:\n            self.assertEqual(\n                lang.currency(value, currency, symbol, grouping, digits),\n                result)\n\n    @with_transaction()\n    def test_lang_format(self):\n        \"Test Lang.format\"\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        lang = Lang.get('en')\n        test_data = [\n            ('%i', 42, False, False, [], \"42\"),\n            ]\n        for percent, value, grouping, monetary, add, result in test_data:\n            self.assertEqual(\n                lang.format(percent, value, grouping, monetary, *add), result)\n\n    @with_transaction()\n    def test_lang_strftime(self):\n        \"Test Lang.strftime\"\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        lang = Lang.get('en')\n        test_data = [\n            (datetime.date(2016, 8, 3), '%d %B %Y', \"03 August 2016\"),\n            (datetime.time(8, 20), '%I:%M %p', \"08:20 AM\"),\n            (datetime.datetime(2018, 11, 1, 14, 30), '%a %d %b %Y %I:%M %p',\n                \"Thu 01 Nov 2018 02:30 PM\"),\n            (datetime.date(2018, 11, 1), '%x', \"11/01/2018\"),\n            (datetime.datetime(2018, 11, 1, 14, 30, 12),\n                '%x %X', \"11/01/2018 14:30:12\"),\n            (datetime.datetime(2018, 11, 1, 14, 30, 12),\n                '%H:%M:%S', \"14:30:12\"),\n            (datetime.datetime(2018, 11, 1, 14, 30, 12), None,\n                \"11/01/2018 14:30:12\"),\n            ]\n        for date, format_, result in test_data:\n            self.assertEqual(lang.strftime(date, format_), result)\n\n    @with_transaction()\n    def test_lang_format_number(self):\n        \"Test Lang.format_number\"\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        lang = Lang.get('en')\n        test_data = [\n            (Decimal('10.50'), False, None, '10.50'),\n            (Decimal('10.50'), False, 4, '10.5000'),\n            (Decimal('1000.50'), True, 4, '1,000.5000'),\n            ]\n        for value, grouping, digits, result in test_data:\n            self.assertEqual(\n                lang.format_number(value, digits, grouping), result)\n\n    @with_transaction()\n    def test_lang_format_number_symbol(self):\n        \"Test Lang.format_number_symbol\"\n        pool = Pool()\n        Lang = pool.get('ir.lang')\n        lang = Lang.get('en')\n        unit = Mock()\n        unit.symbol = 'Kg'\n        unit.get_symbol = Mock()\n        unit.get_symbol.return_value = 'Kg', 1\n        test_data = [\n            (Decimal('10.50'), False, None, '10.50Kg'),\n            (Decimal('1000.50'), True, 4, '1,000.5000Kg'),\n            ]\n        for value, grouping, digits, result in test_data:\n            self.assertEqual(\n                lang.format_number_symbol(value, unit, digits, grouping),\n                result)\n\n    @with_transaction()\n    def test_model_data_get_id(self):\n        \"Test ModelData.get_id\"\n        pool = Pool()\n        ModelData = pool.get('ir.model.data')\n        User = pool.get('res.user')\n\n        admin_id = ModelData.get_id('res', 'user_admin')\n        admin, = User.search([('login', '=', 'admin')])\n\n        self.assertEqual(admin_id, admin.id)\n\n    @with_transaction()\n    def test_model_data_get_id_dot(self):\n        \"Test ModelData.get_id with dot\"\n        pool = Pool()\n        ModelData = pool.get('ir.model.data')\n        User = pool.get('res.user')\n\n        admin_id = ModelData.get_id('res.user_admin')\n        admin, = User.search([('login', '=', 'admin')])\n\n        self.assertEqual(admin_id, admin.id)\n\n    @with_transaction()\n    def test_email_send(self):\n        \"Test sending email\"\n        pool = Pool()\n        Email = pool.get('ir.email')\n        Report = pool.get('ir.action.report')\n        Attachment = pool.get('ir.attachment')\n\n        report = Report(\n            name=\"Test Email\",\n            model='res.user',\n            report_name='tests.email_send',\n            report_content=b'report',\n            template_extension='txt',\n            )\n        report.save()\n\n        with patch('trytond.ir.email_.sendmail_transactional') as sendmail:\n            email = Email.send(\n                to='\"John Doe\" <john@example.com>, Jane <jane@example.com>',\n                cc='User <user@example.com>',\n                bcc='me@example.com',\n                subject=\"Email subject\",\n                body='<p>Hello</p>',\n                files=[('file.txt', b'data')],\n                record=('res.user', 1),\n                reports=[report.id])\n\n            attachments = Attachment.search([\n                    ('resource', '=', str(email)),\n                    ])\n\n        addresses = [\n            'john@example.com',\n            'jane@example.com',\n            'user@example.com',\n            'me@example.com']\n        sendmail.assert_called_once_with(\n            config.get('email', 'from'), addresses, ANY, datamanager=ANY)\n        self.assertEqual(\n            email.recipients,\n            '\"John Doe\" <john@example.com>, Jane <jane@example.com>')\n        self.assertEqual(email.recipients_secondary, 'User <user@example.com>')\n        self.assertEqual(email.recipients_hidden, 'me@example.com')\n        self.assertEqual(\n            [a.address for a in email.addresses],\n            addresses)\n        self.assertEqual(email.subject, \"Email subject\")\n        self.assertEqual(email.body, '<p>Hello</p>')\n        self.assertEqual(len(attachments), 2)\n        self.assertEqual(\n            {a.name for a in attachments},\n            {'file.txt', 'Test Email-Administrator.txt'})\n        self.assertEqual(\n            {a.data for a in attachments}, {b'data', b'report'})\n\n    @with_transaction()\n    def test_email_template_get(self):\n        \"Test email template get\"\n        pool = Pool()\n        Template = pool.get('ir.email.template')\n        IrModel = pool.get('ir.model')\n        IrModelField = pool.get('ir.model.field')\n        User = pool.get('res.user')\n\n        admin = User(1)\n        admin.email = 'admin@example.com'\n        admin.save()\n        model, = IrModel.search([('model', '=', 'res.user')])\n        field, = IrModelField.search([\n                ('model', '=', model.id),\n                ('name', '=', 'id'),\n                ])\n\n        template = Template(\n            model=model,\n            name=\"Test\",\n            recipients=field,\n            subject=\"Subject: ${record.login}\",\n            body=\"<p>Hello, ${record.name}</p>\")\n        template.save()\n\n        values = template.get(admin)\n\n        self.assertEqual(\n            values, {\n                'to': ['Administrator <admin@example.com>'],\n                'subject': \"Subject: admin\",\n                'body': '<p>Hello, Administrator</p>',\n                })\n\n    @with_transaction()\n    def test_email_template_get_default(self):\n        \"Test email template get default\"\n        pool = Pool()\n        Template = pool.get('ir.email.template')\n        IrModel = pool.get('ir.model')\n        IrModelField = pool.get('ir.model.field')\n        User = pool.get('res.user')\n\n        admin = User(1)\n        admin.email = 'admin@example.com'\n        admin.save()\n        model, = IrModel.search([('model', '=', 'res.user')])\n        field, = IrModelField.search([\n                ('model', '=', model.id),\n                ('name', '=', 'id'),\n                ])\n\n        values = Template.get_default(User.__name__, admin.id)\n\n        self.assertEqual(\n            values, {\n                'to': ['Administrator <admin@example.com>'],\n                'subject': \"User: Administrator\",\n                })\n\n    @with_transaction()\n    def test_email_template_get_pyson(self):\n        \"Test email template get with pyson\"\n        pool = Pool()\n        Template = pool.get('ir.email.template')\n        IrModel = pool.get('ir.model')\n        IrModelField = pool.get('ir.model.field')\n        User = pool.get('res.user')\n\n        admin = User(1)\n        admin.email = 'admin@example.com'\n        admin.save()\n        model, = IrModel.search([('model', '=', 'res.user')])\n        field, = IrModelField.search([\n                ('model', '=', model.id),\n                ('name', '=', 'id'),\n                ])\n\n        template = Template(\n            model=model,\n            name=\"Test\",\n            recipients_pyson=PYSONEncoder().encode(\n                [Eval('self.email')]),\n            recipients_secondary_pyson=PYSONEncoder().encode(\n                If(Eval('self.email'),\n                    ['fallback@example.com'],\n                    [])),\n            )\n        template.save()\n\n        values = template.get(admin)\n\n        self.assertEqual(\n            values, {\n                'to': ['admin@example.com'],\n                'cc': ['fallback@example.com'],\n                })\n\n\nclass IrCronTestCase(unittest.TestCase):\n    \"Test ir.cron features\"\n\n    @classmethod\n    def setUpClass(cls):\n        drop_db()\n        activate_module(['ir'])\n        super().setUpClass()\n\n    @classmethod\n    def tearDownClass(cls):\n        super().tearDownClass()\n        drop_db()\n\n    def setUp(self):\n        server_tz = timezone.SERVER\n        timezone.SERVER = timezone.ZoneInfo('Canada/Eastern')\n        self.addCleanup(setattr, timezone, 'SERVER', server_tz)\n\n    def _get_cron(self):\n        pool = Pool()\n        Cron = pool.get('ir.cron')\n\n        cron = Cron()\n        for attribute in [\n                'interval_number', 'interval_type', 'minute', 'hour',\n                'weekday', 'day']:\n            setattr(cron, attribute, None)\n        return cron\n\n    @with_transaction()\n    def test_scheduling_non_utc(self):\n        \"Test scheduling with a non UTC timezone\"\n        cron = self._get_cron()\n        cron.interval_number = 1\n        cron.interval_type = 'days'\n        cron.hour = 1\n\n        # Quebec is UTC-5\n        self.assertEqual(\n            cron.compute_next_call(datetime.datetime(2021, 12, 31, 5, 0)),\n            datetime.datetime(2022, 1, 1, 6, 0))\n\n    @unittest.skipIf(not zoneinfo, \"dateutil does not compute correctly\")\n    @with_transaction()\n    def test_scheduling_on_dst_change(self):\n        \"Test scheduling while the DST change occurs\"\n        cron = self._get_cron()\n        cron.interval_number = 1\n        cron.interval_type = 'days'\n        cron.hour = 2\n\n        # 2022-03-13 is the day of DST switch\n        # Quebec is UTC-4\n        self.assertEqual(\n            cron.compute_next_call(datetime.datetime(2022, 3, 12, 6, 30)),\n            datetime.datetime(2022, 3, 13, 7, 30))\n\n    @with_transaction()\n    def test_scheduling_on_standard_time(self):\n        \"Test scheduling while the calendar returns to the standard time\"\n        cron = self._get_cron()\n        cron.interval_number = 1\n        cron.interval_type = 'hours'\n\n        # 2022-11-06 is the day of DST switch\n        # Quebec is UTC-5\n        self.assertEqual(\n            cron.compute_next_call(datetime.datetime(2022, 11, 6, 7, 30)),\n            datetime.datetime(2022, 11, 6, 8, 30))\n\n\ndel ModuleTestCase\n"
  },
  {
    "path": "trytond/tests/test_mixins.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport unittest\nimport urllib.parse\n\nfrom trytond.model import ModelView\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\nfrom trytond.url import HOSTNAME, http_host\n\nfrom .mixin import NotMixin, ReportMixin, TestMixin, TestSecondMixin\n\n\nclass UrlTestCase(unittest.TestCase):\n    \"Test URL generation\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def testModelURL(self):\n        \"Test model URLs\"\n        pool = Pool()\n        UrlObject = pool.get('test.urlobject')\n        db_name = Transaction().database.name\n\n        self.assertEqual(UrlObject.__url__,\n            'tryton://%s/%s/model/test.urlobject' % (\n                HOSTNAME, urllib.parse.quote(db_name)))\n\n        self.assertEqual(UrlObject(1).__url__,\n            'tryton://%s/%s/model/test.urlobject/1' % (\n                HOSTNAME, urllib.parse.quote(db_name)))\n\n    @with_transaction()\n    def testModelHref(self):\n        \"Test model href\"\n        pool = Pool()\n        UrlObject = pool.get('test.urlobject')\n        db_name = Transaction().database.name\n\n        self.assertEqual(UrlObject.__href__,\n            '%s/#%s/model/test.urlobject' % (\n                http_host(), urllib.parse.quote(db_name)))\n\n        self.assertEqual(UrlObject(1).__href__,\n            '%s/#%s/model/test.urlobject/1' % (\n                http_host(), urllib.parse.quote(db_name)))\n\n    @with_transaction()\n    def testWizardURL(self):\n        \"Test wizard URLs\"\n        pool = Pool()\n        UrlWizard = pool.get('test.test_wizard', type='wizard')\n        db_name = Transaction().database.name\n\n        self.assertEqual(UrlWizard.__url__,\n            'tryton://%s/%s/wizard/test.test_wizard' % (\n                HOSTNAME, urllib.parse.quote(db_name)))\n\n    @with_transaction()\n    def testWizardHref(self):\n        \"Test wizard href\"\n        pool = Pool()\n        UrlWizard = pool.get('test.test_wizard', type='wizard')\n        db_name = Transaction().database.name\n\n        self.assertEqual(UrlWizard.__href__,\n            '%s/#%s/wizard/test.test_wizard' % (\n                http_host(), urllib.parse.quote(db_name)))\n\n\nclass MixinTestCase(unittest.TestCase):\n    \"Test Mixin\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_mixin_on_modelview(self):\n        \"Test all ModelView and only ModelView are subclass of TestMixin\"\n        for _, model in Pool().iterobject():\n            self.assertEqual(\n                issubclass(model, ModelView),\n                issubclass(model, TestMixin))\n\n    @with_transaction()\n    def test_second_mixin_on_modelview(self):\n        \"Test all ModelView and only ModelView are subclass of TestSecondMixin\"\n        for _, model in Pool().iterobject():\n            self.assertEqual(\n                issubclass(model, ModelView),\n                issubclass(model, TestSecondMixin))\n\n    @with_transaction()\n    def test_no_mixin(self):\n        \"Test any model are subclass of NotMixin\"\n        for _, model in Pool().iterobject():\n            self.assertFalse(issubclass(model, NotMixin))\n\n    @with_transaction()\n    def test_report_mixin(self):\n        \"Test mixin applies on default report\"\n        pool = Pool()\n        Report = pool.get('test.report.mixin', type='report')\n\n        self.assertTrue(issubclass(Report, ReportMixin))\n\n\nclass DeactivableMixinTestCase(unittest.TestCase):\n    \"Test DeactivableMixin\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_deactivable_default_active(self):\n        pool = Pool()\n        Deactivable = pool.get('test.deactivable.modelsql')\n\n        deactivable = Deactivable()\n        deactivable.save()\n\n        self.assertEqual(deactivable.active, True)\n\n    @with_transaction()\n    def test_search_deactivable(self):\n        pool = Pool()\n        Deactivable = pool.get('test.deactivable.modelsql')\n\n        active = Deactivable()\n        active.save()\n        inactive = Deactivable()\n        inactive.active = False\n        inactive.save()\n\n        for domain, founds in [\n                ([], [active]),\n                ([('active', '=', False)], [inactive]),\n                ([('active', 'in', [True, False])], [active, inactive]),\n                ]:\n            self.assertListEqual(Deactivable.search(domain), founds)\n"
  },
  {
    "path": "trytond/tests/test_model.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of this\n# repository contains the full copyright notices and license terms.\nimport unittest\nfrom copy import copy\n\nfrom trytond.model.model import record\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\n\nclass ModelTestCase(unittest.TestCase):\n    'Test Model'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_repr(self):\n        'Test repr'\n        pool = Pool()\n        Model = pool.get('test.model')\n\n        record = Model(name='foo')\n        self.assertEqual(\n            repr(record), \"Pool().get('test.model')(**{'name': 'foo'})\")\n\n        record.save()\n        self.assertEqual(\n            repr(record), \"Pool().get('test.model')(%s)\" % record.id)\n\n    @with_transaction()\n    def test_hash_with_id(self):\n        \"Test hash with id\"\n        pool = Pool()\n        Model = pool.get('test.model')\n\n        record1 = Model(id=1)\n        record1bis = Model(id=1)\n        record2 = Model(id=2)\n\n        self.assertEqual(hash(record1), hash(record1bis))\n        self.assertNotEqual(hash(record1), hash(record2))\n\n    @with_transaction()\n    def test_hash_without_id(self):\n        \"Test hash without id\"\n        pool = Pool()\n        Model = pool.get('test.model')\n\n        record1 = Model()\n        record2 = Model()\n\n        self.assertNotEqual(hash(record1), hash(record2))\n\n    @with_transaction()\n    def test_init_parent(self):\n        \"Test __init__ with _parent_\"\n        pool = Pool()\n        Model = pool.get('test.model_child')\n\n        values = {\n            '_parent_parent.name': \"Test\",\n            }\n        record = Model(**values)\n\n        self.assertEqual(record.parent.name, \"Test\")\n\n    @with_transaction()\n    def test_init_parent_parent(self):\n        \"Test __init__ with _parent_._parent_\"\n        pool = Pool()\n        Model = pool.get('test.model_child_child')\n\n        values = {\n            '_parent_parent.name': \"Test 1\",\n            '_parent_parent._parent_parent.name': \"Test 2\",\n            }\n        record = Model(**values)\n\n        self.assertEqual(record.parent.name, \"Test 1\")\n        self.assertEqual(record.parent.parent.name, \"Test 2\")\n\n    @with_transaction()\n    def test_init_context(self):\n        \"Test __init__ for field with context\"\n        pool = Pool()\n        Model = pool.get('test.model')\n        ModelContext = pool.get('test.model_context')\n\n        target, = Model.create([{'name': \"Test Context\"}])\n        # The dictionary order is important\n        values = {\n            'target': target.id,\n            'name': \"foo\",\n            }\n        record = ModelContext(**values)\n\n        self.assertEqual(record.target._context, {'name': \"foo\"})\n\n    @with_transaction()\n    def test_init_parent_context(self):\n        \"Test __init__ with _parent for field with context\"\n        pool = Pool()\n        ModelContext = pool.get('test.model_context')\n\n        # The dictionary order is important\n        values = {\n            '_parent_target.name': \"Test Context\",\n            'name': \"foo\",\n            }\n        record = ModelContext(**values)\n\n        self.assertEqual(record.target._context, {'name': \"foo\"})\n\n    @with_transaction()\n    def test_init_context_parent(self):\n        \"Test __init__ for field with context from _parent\"\n        pool = Pool()\n        Model = pool.get('test.model')\n        ModelContext = pool.get('test.model_context_parent')\n\n        target, = Model.create([{'name': \"Test Context\"}])\n        # The dictionary order is important\n        values = {\n            'target': target.id,\n            '_parent_parent.name': \"bar\",\n            }\n        record = ModelContext(**values)\n\n        self.assertEqual(record.target._context, {'name': \"bar\"})\n\n    @with_transaction()\n    def test_init_parent_context_parent(self):\n        \"Test __init__ with _parent for field with context from _parent\"\n        pool = Pool()\n        ModelContext = pool.get('test.model_context_parent')\n\n        # The dictionary order is important\n        values = {\n            '_parent_target.name': \"Test Context\",\n            '_parent_parent.name': \"bar\",\n            }\n        record = ModelContext(**values)\n\n        self.assertEqual(record.parent.name, \"bar\")\n        self.assertEqual(record.target._context, {'name': \"bar\"})\n\n    @with_transaction()\n    def test_names_model(self):\n        \"Test __names__ for model only\"\n        pool = Pool()\n        Model = pool.get('test.model')\n\n        names = Model.__names__()\n\n        self.assertEqual(names, {'model': \"Model\"})\n\n    @with_transaction()\n    def test_names_field(self):\n        \"Test __names__ with field\"\n        pool = Pool()\n        Model = pool.get('test.model')\n\n        names = Model.__names__('name')\n\n        self.assertEqual(names, {'model': \"Model\", 'field': \"Name\"})\n\n    @with_transaction()\n    def test_names_record(self):\n        \"test __names__ with record\"\n        pool = Pool()\n        Model = pool.get('test.model')\n\n        record = Model(name=\"Test\")\n        record.save()\n        names = Model.__names__(record=record)\n\n        self.assertEqual(names, {'model': \"Model\", 'record': \"Test\"})\n\n    @with_transaction()\n    def test_names_unsaved_record(self):\n        \"test __names__ with unsaved record\"\n        pool = Pool()\n        Model = pool.get('test.model')\n\n        record = Model()\n        names = Model.__names__(record=record)\n\n        self.assertEqual(names, {'model': \"Model\", 'record': record.id})\n\n    @with_transaction()\n    def test_names_value(self):\n        \"test __names__ with value\"\n        pool = Pool()\n        Model = pool.get('test.model')\n\n        record = Model(name=\"Test\")\n        names = Model.__names__(field='name', record=record)\n\n        self.assertEqual(\n            names, {\n                'model': \"Model\", 'field': \"Name\",\n                'record': record.id, 'value': \"Test\"})\n\n    @with_transaction()\n    def test_names_unset_value(self):\n        \"test __names__ with unset value\"\n        pool = Pool()\n        Model = pool.get('test.model')\n\n        record = Model()\n        names = Model.__names__(field='name', record=record)\n\n        self.assertEqual(\n            names, {\n                'model': \"Model\", 'field': \"Name\",\n                'record': record.id, 'value': None})\n\n    @with_transaction()\n    def test_fields_get_no_write_access(self):\n        \"Test field is readonly when no write access on it\"\n        pool = Pool()\n        Model = pool.get('test.model')\n        Field = pool.get('ir.model.field')\n        FieldAccess = pool.get('ir.model.field.access')\n\n        field, = Field.search([\n                ('name', '=', 'name'),\n                ('model.model', '=', Model.__name__),\n                ])\n        FieldAccess.create([{\n                    'field': field.id,\n                    'perm_write': False,\n                    }])\n\n        definition = Model.fields_get(['name'])\n\n        self.assertTrue(definition['name']['readonly'])\n\n    @with_transaction()\n    def test_copy(self):\n        \"Test copy an instance\"\n        pool = Pool()\n        Model = pool.get('test.model')\n\n        record = Model(name='foo')\n\n        record_copied = copy(record)\n\n        self.assertEqual(record.name, record_copied.name)\n        self.assertNotEqual(id(record), id(record_copied))\n\n    @with_transaction()\n    def test_copy_values(self):\n        \"Test copied instance has different values\"\n        pool = Pool()\n        Model = pool.get('test.model')\n\n        record = Model(name='foo')\n\n        record_copied = copy(record)\n        record_copied.name = 'bar'\n\n        self.assertEqual(record.name, 'foo')\n        self.assertEqual(record_copied.name, 'bar')\n\n\nclass ModelTranslationTestCase(unittest.TestCase):\n    \"Test Model translation\"\n    default_language = 'en'\n    other_language = 'fr'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n        cls.setup_language()\n\n    @classmethod\n    @with_transaction()\n    def setup_language(cls):\n        pool = Pool()\n        Language = pool.get('ir.lang')\n        Configuration = pool.get('ir.configuration')\n\n        default, = Language.search([('code', '=', cls.default_language)])\n        default.translatable = True\n        default.save()\n\n        other, = Language.search([('code', '=', cls.other_language)])\n        other.translatable = True\n        other.save()\n\n        config = Configuration(1)\n        config.language = cls.default_language\n        config.save()\n\n        Transaction().commit()\n\n    @with_transaction()\n    def test_fields_get(self):\n        \"Test fields_get translated\"\n        pool = Pool()\n        Model = pool.get('test.model')\n        Translation = pool.get('ir.translation')\n\n        Translation.create([{\n                    'lang': self.other_language,\n                    'src': \"Name\",\n                    'name': 'test.model,name',\n                    'res_id': -1,\n                    'value': \"Nom\",\n                    'type': 'field',\n                    }])\n        with Transaction().set_context(language=self.default_language):\n            field = Model.fields_get(['name'])['name']\n        with Transaction().set_context(language=self.other_language):\n            other = Model.fields_get(['name'])['name']\n\n        self.assertEqual(field['string'], \"Name\")\n        self.assertEqual(other['string'], \"Nom\")\n\n\nclass RecordTestCase(unittest.TestCase):\n    \"Test record\"\n\n    def test_creation(self):\n        \"Test record creation\"\n        Record = record('model', ['foo', 'bar'])\n\n        self.assertEqual(Record.__name__, 'model')\n        self.assertEqual(set(Record.__slots__), {'foo', 'bar'})\n\n    def test_init(self):\n        Record = record('model', ['foo', 'bar'])\n\n        rec = Record(foo='foo')\n\n        self.assertEqual(rec.foo, 'foo')\n\n    def test_getitem(self):\n        Record = record('model', ['foo', 'bar'])\n\n        rec = Record(foo='foo')\n\n        self.assertEqual(rec['foo'], 'foo')\n\n    def test_setitem(self):\n        Record = record('model', ['foo', 'bar'])\n\n        rec = Record(foo='foo')\n\n        rec['foo'] = 'foo'\n        self.assertEqual(rec['foo'], 'foo')\n\n    def test_contains(self):\n        \"Test record contains\"\n        Record = record('model', ['foo', 'bar'])\n\n        rec = Record(foo='foo')\n\n        self.assertTrue('foo' in rec)\n        self.assertFalse('bar' in rec)\n\n    def test_clear(self):\n        \"Test record clear\"\n        Record = record('model', ['foo', 'bar'])\n\n        rec = Record(foo='foo', bar='bar')\n\n        rec._clear()\n\n        with self.assertRaises(AttributeError):\n            rec.foo\n        with self.assertRaises(AttributeError):\n            rec.bar\n\n    def test_copy(self):\n        \"Test copy record\"\n        Record = record('model', ['foo', 'bar'])\n\n        rec = Record(foo='baz')\n        copy = rec._copy()\n\n        self.assertEqual(copy.foo, 'baz')\n        self.assertNotEqual(rec, copy)\n        self.assertIsInstance(copy, Record)\n\n    def test_get(self):\n        \"Test get field from record\"\n        Record = record('model', ['foo', 'bar'])\n\n        rec = Record(foo='baz')\n\n        self.assertEqual(rec._get('foo'), 'baz')\n        self.assertEqual(rec._get('bar'), None)\n        self.assertEqual(rec._get('bar', 42), 42)\n        with self.assertRaises(KeyError):\n            rec._get('baz')\n\n    def test_keys(self):\n        \"Test record keys\"\n        Record = record('model', ['foo', 'bar'])\n\n        rec = Record(foo='baz')\n\n        self.assertEqual(list(rec._keys()), ['foo'])\n\n    def test_items(self):\n        \"Test record items\"\n        Record = record('model', ['foo', 'bar'])\n\n        rec = Record(foo='baz')\n\n        self.assertEqual(list(rec._items()), [('foo', 'baz')])\n\n    def test_pop(self):\n        \"Test pop field from record\"\n        Record = record('model', ['foo', 'bar'])\n\n        rec = Record(foo='baz')\n\n        value = rec._pop('foo')\n        self.assertEqual(value, 'baz')\n        with self.assertRaises(AttributeError):\n            rec.foo\n\n        with self.assertRaises(KeyError):\n            rec._pop('baz')\n\n    def test_popitem(self):\n        \"Test popitem field from record\"\n        Record = record('model', ['foo', 'bar'])\n\n        rec = Record(foo='baz')\n\n        value = rec._popitem('foo')\n        self.assertEqual(value, ('foo', 'baz'))\n\n    def test_setdefault(self):\n        \"Test set default field on record\"\n        Record = record('model', ['foo', 'bar'])\n\n        rec = Record(foo='foo')\n\n        self.assertEqual(rec._setdefault('bar', 'bar'), 'bar')\n        self.assertEqual(rec.bar, 'bar')\n        self.assertEqual(rec._setdefault('foo', 'baz'), 'foo')\n        self.assertEqual(rec.foo, 'foo')\n\n    def test_update(self):\n        \"Test update record\"\n        Record = record('model', ['foo', 'bar'])\n\n        rec = Record(foo='foo')\n        rec._update(foo='bar', bar='baz')\n\n        self.assertEqual(rec.foo, 'bar')\n        self.assertEqual(rec.bar, 'baz')\n\n    def test_values(self):\n        \"Test record values\"\n        Record = record('model', ['foo', 'bar'])\n\n        rec = Record(foo='baz')\n\n        self.assertEqual(list(rec._values()), [('baz')])\n"
  },
  {
    "path": "trytond/tests/test_model_index.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of this\n# repository contains the full copyright notices and license terms.\n\nimport unittest\n\nfrom sql import Table\n\nfrom trytond.model import Index\n\n\nclass ModelIndexTestCase(unittest.TestCase):\n    \"Test Model Index\"\n\n    def test_index_equality(self):\n        \"Test Index equality\"\n        table1 = Table('test')\n        index1 = Index(\n            table1,\n            (table1.name, Index.Equality(order='DESC')),\n            (table1.amount, Index.Range()),\n            where=table1.name == 'foo')\n        table2 = Table('test')\n        index2 = Index(\n            table2,\n            (table2.name, Index.Equality(order='DESC')),\n            (table2.amount, Index.Range()),\n            where=table2.name == 'foo')\n\n        self.assertEqual(index1, index2)\n\n    def test_index_inequality_table(self):\n        \"Test Index inequality on table\"\n        table1 = Table('test')\n        index1 = Index(\n            table1,\n            (table1.name, Index.Equality()))\n        table2 = Table('foo')\n        index2 = Index(\n            table2,\n            (table2.name, Index.Equality()))\n\n        self.assertNotEqual(index1, index2)\n\n    def test_index_inequality_expression(self):\n        \"Test Index inequality on usage\"\n        table1 = Table('test')\n        index1 = Index(\n            table1,\n            (table1.name, Index.Equality()),\n            (table1.amount, Index.Range()))\n        table2 = Table('test')\n        index2 = Index(\n            table2,\n            (table2.name, Index.Equality()),\n            (table2.value, Index.Range()))\n\n        self.assertNotEqual(index1, index2)\n\n    def test_index_inequality_usage(self):\n        \"Test Index inequality on usage\"\n        table1 = Table('test')\n        index1 = Index(\n            table1,\n            (table1.name, Index.Equality()),\n            (table1.amount, Index.Range()))\n        table2 = Table('test')\n        index2 = Index(\n            table2,\n            (table2.name, Index.Equality()),\n            (table2.amount, Index.Similarity()))\n\n        self.assertNotEqual(index1, index2)\n\n    def test_index_inequality_usage_option(self):\n        \"Test Index inequality on usage option\"\n        table1 = Table('test')\n        index1 = Index(\n            table1,\n            (table1.name, Index.Equality(order='DESC')),\n            (table1.amount, Index.Range()),\n            where=table1.name == 'foo')\n        table2 = Table('test')\n        index2 = Index(\n            table2,\n            (table2.name, Index.Equality(order='ASC')),\n            (table2.amount, Index.Range()),\n            where=table2.name == 'foo')\n\n        self.assertNotEqual(index1, index2)\n\n    def test_index_inequality_option_expression(self):\n        \"Test Index inequality on option param\"\n        table1 = Table('test')\n        index1 = Index(\n            table1,\n            (table1.name, Index.Equality(order='DESC')),\n            (table1.amount, Index.Range()),\n            where=table1.name == 'foo')\n        table2 = Table('test')\n        index2 = Index(\n            table2,\n            (table2.name, Index.Equality(order='DESC')),\n            (table2.amount, Index.Range()),\n            where=table2.amount == 'foo')\n\n        self.assertEqual(index1, index2)\n\n    def test_index_inequality_option_param(self):\n        \"Test Index inequality on option param\"\n        table1 = Table('test')\n        index1 = Index(\n            table1,\n            (table1.name, Index.Equality(order='DESC')),\n            (table1.amount, Index.Range()),\n            where=table1.name == 'foo')\n        table2 = Table('test')\n        index2 = Index(\n            table2,\n            (table2.name, Index.Equality(order='DESC')),\n            (table2.amount, Index.Range()),\n            where=table2.name == 'bar')\n\n        self.assertEqual(index1, index2)\n\n    def test_index_hash(self):\n        \"Test Index hash\"\n        table1 = Table('test')\n        index1 = Index(\n            table1,\n            (table1.name, Index.Equality(order='DESC')),\n            (table1.amount, Index.Range()),\n            where=table1.name == 'foo')\n        table2 = Table('test')\n        index2 = Index(\n            table2,\n            (table2.name, Index.Equality(order='DESC')),\n            (table2.amount, Index.Range()),\n            where=table2.name == 'foo')\n\n        self.assertEqual(hash(index1), hash(index2))\n"
  },
  {
    "path": "trytond/tests/test_modelsingleton.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\nfrom datetime import datetime\n\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\n\nclass ModelSingletonTestCase(unittest.TestCase):\n    'Test ModelSingleton'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_read(self):\n        'Test read method'\n        pool = Pool()\n        Singleton = pool.get('test.singleton')\n\n        singleton, = Singleton.read([1], ['name'])\n        self.assertTrue(singleton['name'] == 'test')\n        self.assertTrue(singleton['id'] == 1)\n\n        singleton, = Singleton.read([1], ['name'])\n        self.assertTrue(singleton['name'] == 'test')\n        self.assertTrue(singleton['id'] == 1)\n\n        singleton, = Singleton.read([1], [\n            'create_uid',\n            'create_uid.rec_name',\n            'create_date',\n            'write_uid',\n            'write_date',\n            ])\n        self.assertEqual(singleton['create_uid'], Transaction().user)\n        self.assertEqual(singleton['create_uid.']['rec_name'], 'Administrator')\n        self.assertTrue(isinstance(singleton['create_date'], datetime))\n        self.assertEqual(singleton['write_uid'], None)\n        self.assertEqual(singleton['write_date'], None)\n\n    @with_transaction()\n    def test_create(self):\n        'Test create method'\n        pool = Pool()\n        Singleton = pool.get('test.singleton')\n\n        singleton, = Singleton.create([{'name': 'bar'}])\n        self.assertTrue(singleton)\n        self.assertEqual(singleton.name, 'bar')\n\n        singleton2, = Singleton.create([{'name': 'foo'}])\n        self.assertEqual(singleton2, singleton)\n\n        self.assertEqual(singleton.name, 'foo')\n\n        singletons = Singleton.search([])\n        self.assertEqual(singletons, [singleton])\n\n    @with_transaction()\n    def test_copy(self):\n        'Test copy method'\n        pool = Pool()\n        Singleton = pool.get('test.singleton')\n\n        singleton, = Singleton.search([])\n\n        singleton2, = Singleton.copy([singleton])\n        self.assertEqual(singleton2, singleton)\n\n        singletons = Singleton.search([])\n        self.assertEqual(len(singletons), 1)\n\n        singleton3, = Singleton.copy([singleton], {'name': 'bar'})\n        self.assertEqual(singleton3, singleton)\n\n        singletons = Singleton.search([])\n        self.assertEqual(len(singletons), 1)\n\n    @with_transaction()\n    def test_default_get(self):\n        'Test default_get method'\n        pool = Pool()\n        Singleton = pool.get('test.singleton')\n\n        default = Singleton.default_get(['name'])\n        self.assertEqual(default, {'name': 'test'})\n\n        default = Singleton.default_get(['create_uid'])\n        self.assertEqual(len(default), 2)\n\n        default = Singleton.default_get(['create_uid'],\n                with_rec_name=False)\n        self.assertEqual(len(default), 1)\n\n        Singleton.create([{'name': 'bar'}])\n\n        default = Singleton.default_get(['name'])\n        self.assertEqual(default, {'name': 'bar'})\n\n        default = Singleton.default_get(['create_uid'])\n        self.assertEqual(len(default), 2)\n\n        default = Singleton.default_get(['create_uid'],\n                with_rec_name=False)\n        self.assertEqual(len(default), 1)\n\n    @with_transaction()\n    def test_search(self):\n        'Test search method'\n        pool = Pool()\n        Singleton = pool.get('test.singleton')\n\n        singletons = Singleton.search([])\n        self.assertEqual(list(map(int, singletons)), [1])\n\n        singletons = Singleton.search([])\n        self.assertEqual(list(map(int, singletons)), [1])\n\n        count = Singleton.search([], count=True)\n        self.assertEqual(count, 1)\n\n        Singleton.create([{'name': 'foo'}])\n        singleton, = Singleton.search([('name', '=', 'foo')])\n        self.assertEqual(singleton.name, 'foo')\n        singletons = Singleton.search([('name', '=', 'bar')])\n        self.assertEqual(singletons, [])\n\n    @with_transaction()\n    def test_all_cache_cleared(self):\n        \"Test all cache cleared\"\n        pool = Pool()\n        Singleton = pool.get('test.singleton')\n\n        singleton, = Singleton.create([{'name': 'foo'}])\n        singleton.name  # Fill the cache\n        singleton2 = Singleton(singleton.id + 1)  # Use a different id\n        singleton2.name  # Fill the cache\n        Singleton.write([singleton], {'name': 'bar'})\n        singleton2 = Singleton(singleton2.id)  # Clear local cache\n\n        self.assertEqual(singleton2.name, 'bar')\n\n        Singleton.delete([singleton])\n        self.assertEqual(singleton2.name, 'test')\n"
  },
  {
    "path": "trytond/tests/test_modelsql.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Tryton.  The COPYRIGHT file at the top level of this\n# repository contains the full copyright notices and license terms.\n\nimport random\nimport time\nimport unittest\nfrom unittest.mock import call, patch\n\nfrom trytond import backend\nfrom trytond.exceptions import ConcurrencyException\nfrom trytond.model.exceptions import (\n    ForeignKeyError, RequiredValidationError, SQLConstraintError)\nfrom trytond.model.modelsql import split_subquery_domain\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\n\nclass ModelSQLTestCase(unittest.TestCase):\n    'Test ModelSQL'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_read(self):\n        \"Test simple read\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.read')\n\n        foo, bar = Model.create([{'name': \"Foo\"}, {'name': \"Bar\"}])\n        values = Model.read([foo.id, bar.id], ['name'])\n\n        self.assertEqual(\n            sorted(values, key=lambda v: v['id']),\n            [{'id': foo.id, 'name': \"Foo\"}, {'id': bar.id, 'name': \"Bar\"}])\n\n    @with_transaction()\n    def test_read_context_id(self):\n        \"Test read with ID in context of field\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.read.context_id')\n\n        record, = Model.create([{'name': \"Record\"}])\n        values = Model.read([record.id], ['name'])\n\n        self.assertEqual(values, [{'id': record.id, 'name': \"Record\"}])\n\n    @with_transaction()\n    def test_read_function_field_bigger_than_cache(self):\n        \"Test reading a Function field on a list bigger then the cache size\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.read')\n\n        records = Model.create([{'name': str(i)} for i in range(10)])\n        records_created = {m.id: m.name for m in records}\n        record_ids = [r.id for r in records]\n        random.shuffle(record_ids)\n\n        with Transaction().set_context(_record_cache_size=2):\n            records_read = {r['id']: r['rec_name']\n                for r in Model.read(record_ids, ['rec_name'])}\n            self.assertEqual(records_read, records_created)\n\n    @with_transaction()\n    def test_read_related_2one(self):\n        \"Test read with related Many2One\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.read')\n        Target = pool.get('test.modelsql.read.target')\n\n        target, = Target.create([{'name': \"Target\"}])\n        record, = Model.create([{'target': target.id}])\n        values = Model.read([record.id], ['target.name'])\n\n        self.assertEqual(values, [{\n                    'id': record.id,\n                    'target.': {\n                        'id': target.id,\n                        'name': \"Target\",\n                        },\n                    }])\n\n    @with_transaction()\n    def test_read_related_2one_empty(self):\n        \"Test read with empty related Many2One\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.read')\n\n        record, = Model.create([{'target': None}])\n        values = Model.read([record.id], ['target.name'])\n\n        self.assertEqual(values, [{\n                    'id': record.id,\n                    'target.': None,\n                    }])\n\n    @with_transaction()\n    def test_read_related_reference(self):\n        \"Test read with related Reference\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.read')\n        Target = pool.get('test.modelsql.read.target')\n\n        target, = Target.create([{'name': \"Target\"}])\n        record, = Model.create([{'reference': str(target)}])\n        values = Model.read([record.id], ['reference.name'])\n\n        self.assertEqual(values, [{\n                    'id': record.id,\n                    'reference.': {\n                        'id': target.id,\n                        'name': \"Target\",\n                        },\n                    }])\n\n    @with_transaction()\n    def test_read_related_invalid_reference(self):\n        \"Test read with related invalid Reference\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.read')\n\n        record, = Model.create(\n            [{'reference': 'test.modelsql.read.target,None'}])\n        values = Model.read([record.id], ['reference.name'])\n\n        self.assertEqual(values, [{\n                    'id': record.id,\n                    'reference.': None,\n                    }])\n\n    @with_transaction()\n    def test_read_related_deleted_reference(self):\n        \"Test read with related deleted Reference\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.read')\n        Target = pool.get('test.modelsql.read.target')\n\n        target, = Target.create([{'name': \"Target\"}])\n        record, = Model.create([{'reference': str(target)}])\n        Target.delete([target])\n        values = Model.read([record.id], ['reference.name'])\n\n        self.assertEqual(values, [{\n                    'id': record.id,\n                    'reference.': None,\n                    }])\n\n    @with_transaction()\n    def test_read_related_reference_empty(self):\n        \"Test read with empty related Reference\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.read')\n\n        record, = Model.create([{'name': \"Foo\", 'reference': None}])\n        values = Model.read([record.id], ['reference.name'])\n\n        self.assertEqual(values, [{\n                    'id': record.id,\n                    'reference.': None,\n                    }])\n\n    @with_transaction()\n    def test_read_related_2many(self):\n        \"Test read with related One2Many\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.read')\n        Target = pool.get('test.modelsql.read.target')\n\n        target, = Target.create([{'name': \"Target\"}])\n        record, = Model.create(\n            [{'targets': [('add', [target.id])]}])\n        values = Model.read([record.id], ['targets.name'])\n\n        self.assertEqual(values, [{\n                    'id': record.id,\n                    'targets.': [{\n                            'id': target.id,\n                            'name': \"Target\",\n                            }],\n                    }])\n\n    @with_transaction()\n    def test_read_related_2many_empty(self):\n        \"Test read with empty related One2Many\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.read')\n\n        record, = Model.create(\n            [{'targets': None}])\n        values = Model.read([record.id], ['targets.name'])\n\n        self.assertEqual(values, [{\n                    'id': record.id,\n                    'targets.': [],\n                    }])\n\n    @with_transaction()\n    def test_read_related_2many_multiple(self):\n        \"Test read with multiple related One2Many\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.read')\n        Target = pool.get('test.modelsql.read.target')\n\n        target1, target2 = Target.create([\n                {'name': \"Target 1\"},\n                {'name': \"Target 2\"}])\n        record, = Model.create(\n            [{'targets': [('add', [target1.id, target2.id])]}])\n        values = Model.read([record.id], ['targets.name'])\n\n        self.assertEqual(values, [{\n                    'id': record.id,\n                    'targets.': [{\n                            'id': target1.id,\n                            'name': \"Target 1\",\n                            }, {\n                            'id': target2.id,\n                            'name': \"Target 2\",\n                            }],\n                    }])\n\n    @with_transaction()\n    def test_read_related_mixed(self):\n        \"Test read mixed related\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.read')\n        Target = pool.get('test.modelsql.read.target')\n\n        target1, target2, target3 = Target.create([\n                {'name': \"Target 1\"},\n                {'name': \"Target 2\"},\n                {'name': \"Target 3\"}])\n        record1, record2 = Model.create([{\n                    'name': \"Foo\",\n                    'target': target1.id,\n                    'targets': [('add', [target1.id, target2.id])],\n                    }, {\n                    'name': \"Bar\",\n                    'reference': str(target2),\n                    'targets': [('add', [target3.id])],\n                    }])\n        values = Model.read(\n            [record1.id, record2.id],\n            ['name', 'target', 'target.name', 'targets', 'targets.name'])\n\n        self.assertEqual(\n            sorted(values, key=lambda v: v['id']), [{\n                    'id': record1.id,\n                    'name': \"Foo\",\n                    'target': target1.id,\n                    'target.': {\n                        'id': target1.id,\n                        'name': \"Target 1\",\n                        },\n                    'targets': (target1.id, target2.id),\n                    'targets.': [{\n                            'id': target1.id,\n                            'name': \"Target 1\",\n                            }, {\n                            'id': target2.id,\n                            'name': \"Target 2\",\n                            }],\n                    }, {\n                    'id': record2.id,\n                    'name': \"Bar\",\n                    'target': None,\n                    'target.': None,\n                    'targets': (target3.id,),\n                    'targets.': [{\n                            'id': target3.id,\n                            'name': \"Target 3\",\n                            }],\n                    }])\n\n    @with_transaction()\n    def test_read_related_nested(self):\n        \"Test read with nested related\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.read')\n        Target = pool.get('test.modelsql.read.target')\n\n        target, = Target.create([{'name': \"Target\"}])\n        record, = Model.create(\n            [{'name': \"Record\", 'targets': [('add', [target.id])]}])\n        values = Model.read([record.id], ['targets.parent.name'])\n\n        self.assertEqual(values, [{\n                    'id': record.id,\n                    'targets.': [{\n                            'id': target.id,\n                            'parent.': {\n                                'id': record.id,\n                                'name': \"Record\",\n                                },\n                            }],\n                    }])\n\n    @unittest.skipIf(backend.name == 'sqlite',\n        'SQLite not concerned because tryton don\\'t set \"NOT NULL\"'\n        'constraint: \"ALTER TABLE\" don\\'t support NOT NULL constraint'\n        'without default value')\n    @with_transaction()\n    def test_required_field_missing(self):\n        'Test error message when a required field is missing'\n        pool = Pool()\n        Modelsql = pool.get('test.modelsql')\n        transaction = Transaction()\n\n        fields = {\n            'desc': '',\n            'integer': 0,\n            }\n        for key, value in fields.items():\n            try:\n                Modelsql.create([{key: value}])\n            except RequiredValidationError as err:\n                # message must not quote key\n                msg = \"'%s' not missing but quoted in error: '%s'\" % (key,\n                        err.message)\n                self.assertTrue(key not in err.message, msg)\n            else:\n                self.fail('RequiredValidationError should be caught')\n            transaction.rollback()\n\n    @with_transaction()\n    def test_check_timestamp(self):\n        'Test check timestamp'\n        pool = Pool()\n        ModelsqlTimestamp = pool.get('test.modelsql.timestamp')\n        transaction = Transaction()\n        # transaction must be committed between each changes otherwise NOW()\n        # returns always the same timestamp.\n        record, = ModelsqlTimestamp.create([{}])\n        transaction.commit()\n\n        timestamp = ModelsqlTimestamp.read([record.id],\n            ['_timestamp'])[0]['_timestamp']\n\n        if backend.name == 'sqlite':\n            # timestamp precision of sqlite is the second\n            time.sleep(1)\n\n        transaction.timestamp[str(record)] = timestamp\n        ModelsqlTimestamp.write([record], {})\n        transaction.commit()\n\n        transaction.timestamp[str(record)] = timestamp\n        self.assertRaises(ConcurrencyException,\n            ModelsqlTimestamp.write, [record], {})\n\n        transaction.timestamp[str(record)] = timestamp\n        self.assertRaises(ConcurrencyException,\n            ModelsqlTimestamp.delete, [record])\n\n        transaction.timestamp[str(record)] = None\n        ModelsqlTimestamp.write([record], {})\n        transaction.commit()\n\n        transaction.timestamp.pop(str(record), None)\n        ModelsqlTimestamp.write([record], {})\n        transaction.commit()\n        ModelsqlTimestamp.delete([record])\n        transaction.commit()\n\n    @with_transaction()\n    def test_create_field_set(self):\n        'Test field.set in create'\n        pool = Pool()\n        Model = pool.get('test.modelsql.field_set')\n\n        with patch.object(Model, 'set_field') as setter:\n            records = Model.create([{'field': 1}])\n            setter.assert_called_with(records, 'field', 1)\n\n        # Different values are not grouped\n        with patch.object(Model, 'set_field') as setter:\n            records = Model.create([{'field': 1}, {'field': 2}])\n            setter.assert_has_calls([\n                    call([records[0]], 'field', 1),\n                    call([records[1]], 'field', 2),\n                    ])\n\n        # Same values are grouped in one call\n        with patch.object(Model, 'set_field') as setter:\n            records = Model.create([{'field': 1}, {'field': 1}])\n            setter.assert_called_with(records, 'field', 1)\n\n        # Mixed values are grouped per value\n        with patch.object(Model, 'set_field') as setter:\n            records = Model.create([{'field': 1}, {'field': 2}, {'field': 1}])\n            setter.assert_has_calls([\n                    call([records[0], records[2]], 'field', 1),\n                    call([records[1]], 'field', 2),\n                    ])\n\n    @with_transaction()\n    def test_integrity_error_with_created_record(self):\n        \"Test integrity error with created record\"\n        pool = Pool()\n        ParentModel = pool.get('test.modelsql.one2many')\n        TargetModel = pool.get('test.modelsql.one2many.target')\n\n        # Create target record without required name\n        # to ensure create_records is filled to prevent raising\n        # foreign_model_missing\n        record = ParentModel()\n        record.targets = [TargetModel()]\n        with self.assertRaises(RequiredValidationError) as cm:\n            record.save()\n        err = cm.exception\n        self.assertIn(TargetModel.name.string, err.message)\n        self.assertIn(TargetModel.__doc__, err.message)\n\n    @with_transaction()\n    def test_foreign_key_cascade(self):\n        \"Test Foreign key on delete cascade\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.fk')\n        Target = pool.get('test.modelsql.fk.target')\n\n        target = Target()\n        target.save()\n        record = Model(target_cascade=target)\n        record.save()\n\n        Target.delete([target])\n\n        self.assertFalse(Model.search([]))\n\n    @with_transaction()\n    def test_foreign_key_null(self):\n        \"Test Foreign key on delete set null\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.fk')\n        Target = pool.get('test.modelsql.fk.target')\n\n        target = Target()\n        target.save()\n        record = Model(target_null=target)\n        record.save()\n\n        Target.delete([target])\n\n        self.assertFalse(record.target_null)\n\n    @with_transaction()\n    def test_foreign_key_null_required(self):\n        \"Test Foreign key on delete set null required\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.fk')\n        Target = pool.get('test.modelsql.fk.target')\n\n        Model.target_null.required = True\n        self.addCleanup(setattr, Model.target_null, 'required', False)\n\n        target = Target()\n        target.save()\n        record = Model(target_null=target)\n        record.save()\n\n        with self.assertRaises(ForeignKeyError) as cm:\n            Target.delete([target])\n        err = cm.exception\n        self.assertIn(Model.target_null.string, err.message)\n        self.assertIn(Model.__doc__, err.message)\n\n    @with_transaction()\n    def test_foreign_key_restrict(self):\n        \"Test Foreign key on delete restrict\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.fk')\n        Target = pool.get('test.modelsql.fk.target')\n\n        target = Target()\n        target.save()\n        record = Model(target_restrict=target)\n        record.save()\n\n        with self.assertRaises(ForeignKeyError) as cm:\n            Target.delete([target])\n        err = cm.exception\n        self.assertIn(Model.target_restrict.string, err.message)\n        self.assertIn(Model.__doc__, err.message)\n\n    @with_transaction()\n    def test_foreign_key_restrict_inactive(self):\n        \"Test inactive Foreign key on delete restrict\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.fk')\n        Target = pool.get('test.modelsql.fk.target')\n\n        target = Target()\n        target.save()\n        record = Model(target_restrict=target, active=False)\n        record.save()\n\n        with self.assertRaises(ForeignKeyError) as cm:\n            Target.delete([target])\n        err = cm.exception\n        self.assertIn(Model.target_restrict.string, err.message)\n        self.assertIn(Model.__doc__, err.message)\n\n    @with_transaction()\n    def test_null_ordering(self):\n        'Test NULL ordering'\n        pool = Pool()\n        NullOrder = pool.get('test.modelsql.null_order')\n\n        NullOrder.create([{\n                    'integer': 1,\n                    }, {\n                    'integer': 3,\n                    }, {\n                    'integer': None,\n                    }])\n        integers = NullOrder.search([], order=[('integer', 'ASC NULLS FIRST')])\n        self.assertListEqual([i.integer for i in integers], [None, 1, 3])\n\n        integers = NullOrder.search(\n            [], order=[('integer', 'DESC NULLS FIRST')])\n        self.assertListEqual([i.integer for i in integers], [None, 3, 1])\n\n        integers = NullOrder.search([], order=[('integer', 'ASC NULLS LAST')])\n        self.assertListEqual([i.integer for i in integers], [1, 3, None])\n\n        integers = NullOrder.search([], order=[('integer', 'DESC NULLS LAST')])\n        self.assertListEqual([i.integer for i in integers], [3, 1, None])\n\n    @with_transaction()\n    def test_delete_translations(self):\n        \"Test delete record trigger delete of translations\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.translation')\n        Translation = pool.get('ir.translation')\n        record, = Model.create([{'name': \"Translation\"}])\n\n        with patch.object(Translation, 'delete_ids') as delete_ids:\n            Model.delete([record])\n\n        delete_ids.assert_called_with(\n            'test.modelsql.translation', 'model', [record.id])\n\n    @with_transaction()\n    def test_constraint_check(self):\n        \"Test check constraint\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.check')\n\n        record, = Model.create([{'value': 50}])\n\n        self.assertTrue(record.id)\n\n    @with_transaction()\n    def test_constraint_check_null(self):\n        \"Test check constraint with null\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.check')\n\n        record, = Model.create([{'value': None}])\n\n        self.assertTrue(record.id)\n\n    @with_transaction()\n    def test_constraint_check_invalid(self):\n        \"Test invalid check constraint\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.check')\n\n        with self.assertRaises(SQLConstraintError):\n            Model.create([{'value': 10}])\n\n    @with_transaction()\n    def test_constraint_unique(self):\n        \"Test unique constraint\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.unique')\n\n        records = Model.create([{'value': 1}, {'value': 2}])\n\n        self.assertEqual(len(records), 2)\n\n    @with_transaction()\n    def test_constraint_unique_null(self):\n        \"Test unique constraint with null\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.unique')\n\n        records = Model.create([{'value': None}, {'value': None}])\n\n        self.assertEqual(len(records), 2)\n\n    @with_transaction()\n    def test_constraint_unique_invalid(self):\n        \"Test invalid unique constraint\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.unique')\n\n        with self.assertRaises(SQLConstraintError):\n            Model.create([{'value': 42}, {'value': 42}])\n\n    @with_transaction()\n    def test_constraint_exclude(self):\n        \"Test exclude constraint\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.exclude')\n\n        records = Model.create([{'value': 1}, {'value': 2}])\n\n        self.assertEqual(len(records), 2)\n\n    @with_transaction()\n    def test_constraint_exclude_exclusion(self):\n        \"Test exclude constraint exclusion\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.exclude')\n\n        records = Model.create([{'value': 1, 'condition': False}] * 2)\n\n        self.assertEqual(len(records), 2)\n\n    @with_transaction()\n    def test_constraint_exclude_exclusion_mixed(self):\n        \"Test exclude constraint exclusion mixed\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.exclude')\n\n        records = Model.create([\n                {'value': 1, 'condition': False},\n                {'value': 1, 'condition': True},\n                ])\n\n        self.assertEqual(len(records), 2)\n\n    @with_transaction()\n    def test_constraint_exclude_invalid(self):\n        \"Test invalid exclude constraint\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.exclude')\n\n        with self.assertRaises(SQLConstraintError):\n            Model.create([{'value': 42}, {'value': 42}])\n\n    @unittest.skipIf(backend.name == 'sqlite',\n        'SQLite does not have lock at table level but on file')\n    @with_transaction()\n    def test_record_lock(self):\n        \"Test record lock\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.lock')\n        transaction = Transaction()\n        record_id = Model.create([{}])[0].id\n        transaction.commit()\n\n        with transaction.new_transaction():\n            record = Model(record_id)\n            record.lock()\n            with transaction.new_transaction():\n                record = Model(record_id)\n                with self.assertRaises(backend.DatabaseOperationalError):\n                    record.lock()\n\n    @unittest.skipIf(backend.name == 'sqlite',\n        'SQLite does not have lock at table level but on file')\n    @with_transaction()\n    def test_table_lock(self):\n        \"Test table lock\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.lock')\n        transaction = Transaction()\n\n        with transaction.new_transaction():\n            Model.lock()\n            with transaction.new_transaction():\n                with self.assertRaises(backend.DatabaseOperationalError):\n                    Model.lock()\n\n    @with_transaction()\n    def test_search_or_to_union(self):\n        \"\"\"\n        Test searching for 'OR'-ed domain\n        \"\"\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.search.or2union')\n\n        Model.create([{\n                    'name': 'A',\n                    }, {\n                    'name': 'B',\n                    }, {\n                    'name': 'C',\n                    'targets': [('create', [{\n                                    'name': 'C.A',\n                                    }]),\n                        ],\n                    }])\n\n        domain = ['OR',\n            ('name', 'ilike', '%A%'),\n            ('targets.name', 'ilike', '%A'),\n            ]\n        with patch('trytond.model.modelsql.split_subquery_domain') as no_split:\n            # Mocking in order not to trigger the split\n            no_split.side_effect = lambda d: (d, [])\n            result_without_split = Model.search(domain)\n            query_without_split = Model.search(domain, query=True)\n        self.assertEqual(\n            Model.search(domain),\n            result_without_split)\n        self.assertIn('UNION', str(Model.search(domain, query=True)))\n        self.assertNotIn('UNION', str(query_without_split))\n\n    @with_transaction()\n    def test_search_or_to_union_order_eager_field(self):\n        \"\"\"\n        Searching for 'OR'-ed domain mixed with ordering on an eager field\n        \"\"\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.search.or2union')\n        Target = pool.get('test.modelsql.search.or2union.target')\n\n        target_a, target_b, target_c = Target.create([\n                {'name': 'A'}, {'name': 'B'}, {'name': 'C'},\n                ])\n        model_a, model_b, model_c = Model.create([{\n                    'name': 'A',\n                    'target': target_a,\n                    }, {\n                    'name': 'B',\n                    'target': target_b,\n                    }, {\n                    'name': 'C',\n                    'target': target_c,\n                    'targets': [('create', [{\n                                    'name': 'C.A',\n                                    }]),\n                        ],\n                    }])\n\n        domain = ['OR',\n            ('name', 'ilike', '%A%'),\n            ('targets.name', 'ilike', '%A'),\n            ]\n        self.assertEqual(\n            Model.search(domain, order=[('name', 'ASC')]),\n            [model_a, model_c])\n        self.assertEqual(\n            Model.search(domain, order=[('name', 'DESC')]),\n            [model_c, model_a])\n        self.assertIn(\n            'UNION',\n            str(Model.search(domain, order=[('name', 'ASC')], query=True)))\n\n    @with_transaction()\n    def test_search_or_to_union_order_lazy_field(self):\n        \"\"\"\n        Searching for 'OR'-ed domain mixed with ordering on a lazy field\n        \"\"\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.search.or2union')\n        Target = pool.get('test.modelsql.search.or2union.target')\n\n        target_a, target_b, target_c = Target.create([\n                {'name': 'A'}, {'name': 'B'}, {'name': 'C'},\n                ])\n        model_a, model_b, model_c = Model.create([{\n                    'name': 'A',\n                    'reference': str(target_a),\n                    }, {\n                    'name': 'B',\n                    'reference': str(target_b),\n                    }, {\n                    'name': 'C',\n                    'reference': str(target_c),\n                    'targets': [('create', [{\n                                    'name': 'C.A',\n                                    }]),\n                        ],\n                    }])\n\n        domain = ['OR',\n            ('name', 'ilike', '%A%'),\n            ('targets.name', 'ilike', '%A'),\n            ]\n        self.assertEqual(\n            Model.search(domain, order=[('reference', 'ASC')]),\n            [model_a, model_c])\n        self.assertEqual(\n            Model.search(domain, order=[('reference', 'DESC')]),\n            [model_c, model_a])\n        self.assertIn(\n            'UNION', str(Model.search(\n                    domain, order=[('reference', 'ASC')], query=True)))\n\n    @with_transaction()\n    def test_search_or_to_union_order_dotted_notation(self):\n        \"\"\"\n        Searching for 'OR'-ed domain mixed with ordering on dotted field\n        \"\"\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.search.or2union')\n        Target = pool.get('test.modelsql.search.or2union.target')\n\n        target_a, target_b, target_c = Target.create([\n                {'name': 'A'}, {'name': 'B'}, {'name': 'C'},\n                ])\n        model_a, model_b, model_c = Model.create([{\n                    'name': 'A',\n                    'target': target_a,\n                    }, {\n                    'name': 'B',\n                    'target': target_b,\n                    }, {\n                    'name': 'C',\n                    'target': target_c,\n                    'targets': [('create', [{\n                                    'name': 'C.A',\n                                    }]),\n                        ],\n                    }])\n\n        domain = ['OR',\n            ('name', 'ilike', '%A%'),\n            ('targets.name', 'ilike', '%A'),\n            ]\n        self.assertEqual(\n            Model.search(domain, order=[('target.name', 'ASC')]),\n            [model_a, model_c])\n        self.assertEqual(\n            Model.search(domain, order=[('target.name', 'DESC')]),\n            [model_c, model_a])\n        self.assertNotIn(\n            'UNION', str(Model.search(\n                    domain, order=[('target.name', 'ASC')], query=True)))\n\n    @with_transaction()\n    def test_search_or_to_union_order_function(self):\n        \"\"\"\n        Searching for 'OR'-ed domain mixed with ordering on a function\n        \"\"\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.search.or2union')\n        Target = pool.get('test.modelsql.search.or2union.target')\n\n        target_a, target_b, target_c = Target.create([\n                {'name': 'A'}, {'name': 'B'}, {'name': 'C'},\n                ])\n        model_a, model_b, model_c = Model.create([{\n                    'name': 'A',\n                    'target': target_a,\n                    'integer': 0,\n                    }, {\n                    'name': 'B',\n                    'target': target_b,\n                    'integer': 1,\n                    }, {\n                    'name': 'C',\n                    'target': target_c,\n                    'integer': 2,\n                    'targets': [('create', [{\n                                    'name': 'C.A',\n                                    }]),\n                        ],\n                    }])\n\n        domain = ['OR',\n            ('name', 'ilike', '%A%'),\n            ('targets.name', 'ilike', '%A'),\n            ]\n        self.assertEqual(\n            Model.search(domain, order=[('integer', 'ASC')]),\n            [model_a, model_c])\n        self.assertEqual(\n            Model.search(domain, order=[('integer', 'DESC')]),\n            [model_c, model_a])\n        self.assertNotIn(\n            'UNION', str(Model.search(\n                    domain, order=[('integer', 'ASC')], query=True)))\n\n    @with_transaction()\n    def test_search_or_to_union_no_local_clauses(self):\n        \"\"\"\n        Test searching for 'OR'-ed domain without local clauses\n        \"\"\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.search.or2union')\n\n        Model.create([{\n                    'name': 'A',\n                    }, {\n                    'name': 'B',\n                    }, {\n                    'name': 'C',\n                    'targets': [('create', [{\n                                    'name': 'C.A',\n                                    }]),\n                        ],\n                    }])\n\n        domain = ['OR',\n            ('targets.name', 'ilike', '%A'),\n            ('targets.name', 'ilike', '%B'),\n            ]\n        with patch('trytond.model.modelsql.split_subquery_domain') as no_split:\n            # Mocking in order not to trigger the split\n            no_split.side_effect = lambda d: (d, [])\n            result_without_split = Model.search(domain)\n            query_without_split = Model.search(domain, query=True)\n        self.assertEqual(\n            Model.search(domain),\n            result_without_split)\n        self.assertIn('UNION', str(Model.search(domain, query=True)))\n        self.assertNotIn('UNION', str(query_without_split))\n\n    @with_transaction()\n    def test_search_or_to_union_class_order(self):\n        \"\"\"\n        Test searching for 'OR'-ed domain when the class defines _order\n        \"\"\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.search.or2union.class_order')\n        Target = pool.get('test.modelsql.search.or2union.class_order.target')\n\n        target_a, target_b, target_c = Target.create([\n                {'name': 'A'}, {'name': 'B'}, {'name': 'C'},\n                ])\n        model_a, model_b, model_c = Model.create([{\n                    'name': 'A',\n                    'reference': str(target_a),\n                    }, {\n                    'name': 'B',\n                    'reference': str(target_b),\n                    }, {\n                    'name': 'C',\n                    'reference': str(target_c),\n                    'targets': [('create', [{\n                                    'name': 'C.A',\n                                    }]),\n                        ],\n                    }])\n\n        domain = ['OR',\n            ('name', 'ilike', '%A%'),\n            ('targets.name', 'ilike', '%A'),\n            ]\n        self.assertEqual(Model.search(domain), [model_c, model_a])\n        self.assertIn('UNION', str(Model.search(domain, query=True)))\n\n    @with_transaction()\n    def test_search_limit(self):\n        \"Test searching with limit\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.search')\n\n        Model.create([{'name': str(i)} for i in range(10)])\n\n        self.assertEqual(Model.search([], limit=5, count=True), 5)\n        self.assertEqual(Model.search([], limit=20, count=True), 10)\n        self.assertEqual(Model.search([], limit=None, count=True), 10)\n\n    @with_transaction()\n    def test_search_offset(self):\n        \"Test searching with offset\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.search')\n\n        Model.create([{'name': str(i)} for i in range(10)])\n\n        self.assertEqual(Model.search([], offset=0, count=True), 10)\n        self.assertEqual(Model.search([], offset=5, count=True), 5)\n        self.assertEqual(Model.search([], offset=20, count=True), 0)\n\n    def test_split_subquery_domain_empty(self):\n        \"\"\"\n        Test the split of domains in local and relation parts (empty domain)\n        \"\"\"\n        local, related = split_subquery_domain([])\n        self.assertEqual(local, [])\n        self.assertEqual(related, [])\n\n    def test_split_subquery_domain_simple(self):\n        \"\"\"\n        Test the split of domains in local and relation parts (simple domain)\n        \"\"\"\n        local, related = split_subquery_domain([('a', '=', 1)])\n        self.assertEqual(local, [('a', '=', 1)])\n        self.assertEqual(related, [])\n\n    def test_split_subquery_domain_dotter(self):\n        \"\"\"\n        Test the split of domains in local and relation parts (dotted domain)\n        \"\"\"\n        local, related = split_subquery_domain([('a.b', '=', 1)])\n        self.assertEqual(local, [])\n        self.assertEqual(related, [('a.b', '=', 1)])\n\n    def test_split_subquery_domain_mixed(self):\n        \"\"\"\n        Test the split of domains in local and relation parts (mixed domains)\n        \"\"\"\n        local, related = split_subquery_domain(\n            [('a', '=', 1), ('b.c', '=', 2)])\n        self.assertEqual(local, [('a', '=', 1)])\n        self.assertEqual(related, [('b.c', '=', 2)])\n\n    def test_split_subquery_domain_operator(self):\n        \"\"\"\n        Test the split of domains in local and relation parts (with operator)\n        \"\"\"\n        local, related = split_subquery_domain(\n            ['OR', ('a', '=', 1), ('b.c', '=', 2)])\n        self.assertEqual(local, [('a', '=', 1)])\n        self.assertEqual(related, [('b.c', '=', 2)])\n\n    def test_split_subquery_domain_nested(self):\n        \"\"\"\n        Test the split of domains in local and relation parts (nested domains)\n        \"\"\"\n        local, related = split_subquery_domain(\n            [\n                ['AND', ('a', '=', 1), ('b', '=', 2)],\n                ['AND',\n                    ('b', '=', 2),\n                    ['OR', ('c', '=', 3), ('d.e', '=', 4)]]])\n        self.assertEqual(local, [['AND', ('a', '=', 1), ('b', '=', 2)]])\n        self.assertEqual(related, [\n                ['AND',\n                    ('b', '=', 2),\n                    ['OR', ('c', '=', 3), ('d.e', '=', 4)]]\n                ])\n\n\nclass TranslationTestCase(unittest.TestCase):\n    default_language = 'fr'\n    other_language = 'en'\n\n    @classmethod\n    def setUpClass(cls):\n        super().setUpClass()\n        cls.setup_language()\n\n    @classmethod\n    @with_transaction()\n    def setup_language(cls):\n        pool = Pool()\n        Language = pool.get('ir.lang')\n        Configuration = pool.get('ir.configuration')\n\n        default, = Language.search([('code', '=', cls.default_language)])\n        default.translatable = True\n        default.save()\n\n        other, = Language.search([('code', '=', cls.other_language)])\n        other.translatable = True\n        other.save()\n\n        config = Configuration(1)\n        config.language = cls.default_language\n        config.save()\n\n        Transaction().commit()\n\n    @classmethod\n    def tearDownClass(cls):\n        super().tearDownClass()\n        cls.restore_language()\n\n    @classmethod\n    @with_transaction()\n    def restore_language(cls):\n        pool = Pool()\n        Language = pool.get('ir.lang')\n        Configuration = pool.get('ir.configuration')\n\n        english, = Language.search([('code', '=', 'en')])\n        english.translatable = True\n        english.save()\n\n        config = Configuration(1)\n        config.language = 'en'\n        config.save()\n\n        Language.write(Language.search([('code', '!=', 'en')]), {\n                'translatable': False,\n                })\n\n        Transaction().commit()\n\n\nclass ModelSQLTranslationTestCase(TranslationTestCase):\n    \"Test ModelSQL translation\"\n\n    @classmethod\n    def setUpClass(cls):\n        super().setUpClass()\n        activate_module('tests')\n\n    @with_transaction()\n    def test_create_default_language(self):\n        \"Test create default language\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.translation')\n        Translation = pool.get('ir.translation')\n\n        with Transaction().set_context(language=self.default_language):\n            record, = Model.create([{'name': \"Foo\"}])\n        translation, = Translation.search([\n                ('name', '=', 'test.modelsql.translation,name'),\n                ('res_id', '=', record.id),\n                ('type', '=', 'model'),\n                ])\n\n        self.assertEqual(translation.src, \"Foo\")\n        self.assertEqual(translation.value, \"Foo\")\n        self.assertEqual(translation.lang, self.default_language)\n        self.assertFalse(translation.fuzzy)\n\n    @with_transaction()\n    def test_create_other_language(self):\n        \"Test create other language\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.translation')\n        Translation = pool.get('ir.translation')\n\n        with Transaction().set_context(language=self.other_language):\n            record, = Model.create([{'name': \"Bar\"}])\n        translation, = Translation.search([\n                ('name', '=', 'test.modelsql.translation,name'),\n                ('res_id', '=', record.id),\n                ('type', '=', 'model'),\n                ])\n\n        self.assertEqual(translation.src, \"Bar\")\n        self.assertEqual(translation.value, \"Bar\")\n        self.assertEqual(translation.lang, self.other_language)\n        self.assertFalse(translation.fuzzy)\n\n    @with_transaction()\n    def test_write_default_language(self):\n        \"Test write default language\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.translation')\n        Translation = pool.get('ir.translation')\n\n        record, = Model.create([{'name': \"Foo\"}])\n        with Transaction().set_context(language=self.default_language):\n            Model.write([record], {'name': \"Bar\"})\n        translation, = Translation.search([\n                ('name', '=', 'test.modelsql.translation,name'),\n                ('res_id', '=', record.id),\n                ('type', '=', 'model'),\n                ])\n\n        self.assertEqual(translation.src, \"Bar\")\n        self.assertEqual(translation.value, \"Bar\")\n        self.assertEqual(translation.lang, self.default_language)\n        self.assertFalse(translation.fuzzy)\n\n    @with_transaction()\n    def test_write_other_language(self):\n        \"Test write other language\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.translation')\n        Translation = pool.get('ir.translation')\n\n        record, = Model.create([{'name': \"Foo\"}])\n        with Transaction().set_context(language=self.other_language):\n            Model.write([record], {'name': \"Bar\"})\n        default, = Translation.search([\n                ('name', '=', 'test.modelsql.translation,name'),\n                ('res_id', '=', record.id),\n                ('type', '=', 'model'),\n                ('lang', '=', self.default_language),\n                ])\n        other, = Translation.search([\n                ('name', '=', 'test.modelsql.translation,name'),\n                ('res_id', '=', record.id),\n                ('type', '=', 'model'),\n                ('lang', '=', self.other_language),\n                ])\n\n        self.assertEqual(default.src, \"Foo\")\n        self.assertEqual(default.value, \"Foo\")\n        self.assertFalse(default.fuzzy)\n        self.assertEqual(other.src, \"Foo\")\n        self.assertEqual(other.value, \"Bar\")\n        self.assertFalse(other.fuzzy)\n\n    @with_transaction()\n    def test_write_default_language_with_other_language(self):\n        \"Test write default language with other language\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.translation')\n        Translation = pool.get('ir.translation')\n\n        record, = Model.create([{'name': \"Foo\"}])\n        with Transaction().set_context(language=self.other_language):\n            Model.write([record], {'name': \"Bar\"})\n        with Transaction().set_context(language=self.default_language):\n            Model.write([record], {'name': \"FooBar\"})\n        default, = Translation.search([\n                ('name', '=', 'test.modelsql.translation,name'),\n                ('res_id', '=', record.id),\n                ('type', '=', 'model'),\n                ('lang', '=', self.default_language),\n                ])\n        other, = Translation.search([\n                ('name', '=', 'test.modelsql.translation,name'),\n                ('res_id', '=', record.id),\n                ('type', '=', 'model'),\n                ('lang', '=', self.other_language),\n                ])\n\n        self.assertEqual(default.src, \"FooBar\")\n        self.assertEqual(default.value, \"FooBar\")\n        self.assertFalse(default.fuzzy)\n        self.assertEqual(other.src, \"FooBar\")\n        self.assertEqual(other.value, \"Bar\")\n        self.assertTrue(other.fuzzy)\n\n    @with_transaction()\n    def test_delete(self):\n        \"Test delete\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.translation')\n        Translation = pool.get('ir.translation')\n\n        record, = Model.create([{'name': \"Foo\"}])\n        with Transaction().set_context(language=self.other_language):\n            Model.write([record], {'name': \"Bar\"})\n        before_translations = Translation.search([\n                ('name', '=', 'test.modelsql.translation,name'),\n                ('res_id', '=', record.id),\n                ('type', '=', 'model'),\n                ])\n        Model.delete([record])\n        after_translations = Translation.search([\n                ('name', '=', 'test.modelsql.translation,name'),\n                ('res_id', '=', record.id),\n                ('type', '=', 'model'),\n                ])\n\n        self.assertTrue(before_translations)\n        self.assertFalse(after_translations)\n\n    @with_transaction()\n    def test_read(self):\n        \"Test read translations\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.translation')\n\n        with Transaction().set_context(language=self.default_language):\n            record, = Model.create([{'name': \"Foo\"}])\n        with Transaction().set_context(language=self.other_language):\n            Model.write([record], {'name': \"Bar\"})\n            other = Model(record.id)\n\n        self.assertEqual(record.name, \"Foo\")\n        self.assertEqual(other.name, \"Bar\")\n\n    @with_transaction()\n    def test_read_last_translation(self):\n        \"Test read last translation record\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.translation')\n        Translation = pool.get('ir.translation')\n\n        with Transaction().set_context(language=self.default_language):\n            record, = Model.create([{'name': \"Foo\"}])\n        with Transaction().set_context(language=self.other_language):\n            Model.write([record], {'name': \"Bar\"})\n            other = Model(record.id)\n\n        translation, = Translation.search([\n                ('lang', '=', self.other_language),\n                ('name', '=', 'test.modelsql.translation,name'),\n                ('type', '=', 'model'),\n                ('res_id', '=', record.id),\n                ])\n        Translation.copy([translation], default={'value': \"Baz\"})\n        # clear transaction cache which may be filled by validation\n        other._cache.clear()\n\n        self.assertEqual(record.name, \"Foo\")\n        self.assertEqual(other.name, \"Baz\")\n\n    @with_transaction()\n    def test_order_empty_translation(self):\n        \"Test order on empty translation value\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.translation')\n        Translation = pool.get('ir.translation')\n\n        with Transaction().set_context(language=self.default_language):\n            records = Model.create(\n                [{'name': \"A\"}, {'name': \"B\"}, {'name': \"C\"}])\n\n        translation, = Translation.search([\n                ('lang', '=', self.default_language),\n                ('name', '=', 'test.modelsql.translation,name'),\n                ('type', '=', 'model'),\n                ('res_id', '=', records[1].id),\n                ])\n        translation.value = ''\n        translation.save()\n\n        with Transaction().set_context(language=self.default_language):\n            self.assertEqual(\n                Model.search([], order=[('name', 'ASC')]),\n                records)\n\n    @with_transaction()\n    def test_search_unique_result(self):\n        \"Test unique result on search\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.translation')\n        Translation = pool.get('ir.translation')\n\n        with Transaction().set_context(language=self.default_language):\n            record, = Model.create([{'name': \"Foo\"}])\n        with Transaction().set_context(language=self.other_language):\n            Model.write([record], {'name': \"Bar\"})\n\n        translation, = Translation.search([\n                ('lang', '=', self.other_language),\n                ('name', '=', 'test.modelsql.translation,name'),\n                ('type', '=', 'model'),\n                ('res_id', '=', record.id),\n                ])\n        Translation.copy([translation], default={'value': \"Baz\"})\n\n        with Transaction().set_context(language=self.other_language):\n            self.assertEqual(\n                Model.search([('name', 'like', 'Ba%')]),\n                [record])\n            self.assertEqual(\n                Model.search([], order=[('name', 'DESC')]),\n                [record])\n\n    @with_transaction()\n    def test_search_fill_transaction_cache(self):\n        \"Test search fill the transaction cache\"\n        pool = Pool()\n        Model = pool.get('test.modelsql.search')\n        Model.create([{'name': \"Foo\"}])\n\n        record, = Model.search([])\n        cache = Transaction().get_cache()[Model.__name__]\n\n        self.assertIn(record.id, cache)\n        self.assertEqual(cache[record.id]['name'], \"Foo\")\n        self.assertNotIn('_timestamp', cache[record.id])\n"
  },
  {
    "path": "trytond/tests/test_modelstorage.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of this\n# repository contains the full copyright notices and license terms.\n\nimport unittest\n\nfrom trytond.model import EvalEnvironment\nfrom trytond.model.exceptions import (\n    AccessError, DomainValidationError, RequiredValidationError)\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\n\nclass ModelStorageTestCase(unittest.TestCase):\n    'Test ModelStorage'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_search_read_order(self):\n        'Test search_read order'\n        pool = Pool()\n        ModelStorage = pool.get('test.modelstorage')\n\n        ModelStorage.create([{'name': i} for i in ['foo', 'bar', 'test']])\n\n        rows = ModelStorage.search_read([])\n        self.assertTrue(\n            all(x['id'] < y['id'] for x, y in zip(rows, rows[1:])))\n\n        rows = ModelStorage.search_read(\n            [], order=[('name', 'ASC')], fields_names=['name'])\n        self.assertTrue(\n            all(x['name'] <= y['name'] for x, y in zip(rows, rows[1:])))\n\n        rows = ModelStorage.search_read(\n            [], order=[('name', 'DESC')], fields_names=['name'])\n        self.assertTrue(\n            all(x['name'] >= y['name'] for x, y in zip(rows, rows[1:])))\n\n    @with_transaction()\n    def test_copy_order(self):\n        \"Test copy order\"\n        pool = Pool()\n        ModelStorage = pool.get('test.modelstorage')\n\n        # Use both order to avoid false positive by chance\n        records = ModelStorage.create(\n            [{'name': n} for n in ['foo', 'bar', 'test']])\n        new_records = ModelStorage.copy(records)\n        reversed_records = list(reversed(records))\n        new_reversed_records = ModelStorage.copy(reversed_records)\n\n        self.assertListEqual(\n            [r.name for r in records],\n            [r.name for r in new_records])\n        self.assertListEqual(\n            [r.name for r in reversed_records],\n            [r.name for r in new_reversed_records])\n\n    @with_transaction()\n    def test_search_count(self):\n        \"Test search_count\"\n        pool = Pool()\n        ModelStorage = pool.get('test.modelstorage')\n        ModelStorage.create([{'name': 'Test %s' % i} for i in range(10)])\n\n        count = ModelStorage.search_count([])\n        self.assertEqual(count, 10)\n\n        count = ModelStorage.search_count([('name', '=', 'Test 5')])\n        self.assertEqual(count, 1)\n\n    @with_transaction()\n    def test_browse_deleted(self):\n        \"Test access record from browse list with deleted record\"\n        pool = Pool()\n        ModelStorage = pool.get('test.modelstorage')\n        records = ModelStorage.create(\n            [{'name': 'Test %s' % i} for i in range(2)])\n\n        ModelStorage.delete(records[1:])\n        ModelStorage.write(records[:1], {})  # clean cache\n\n        records[0].name\n        with self.assertRaises(AccessError):\n            records[1].name\n\n    @with_transaction()\n    def test_browse_context(self):\n        'Test context when browsing'\n        pool = Pool()\n        ModelStorageContext = pool.get('test.modelstorage.context')\n\n        record, = ModelStorageContext.create([{}])\n        record_context = {'_check_access': False}  # From Function.get\n\n        self.assertDictEqual(record.context, record_context)\n\n        # Clean the instance cache\n        record = ModelStorageContext(record.id)\n\n        with Transaction().set_context(foo='bar'):\n            self.assertDictEqual(record.context, record_context)\n\n            record = ModelStorageContext(record.id)\n            self.assertEqual(record.context.get('foo'), 'bar')\n\n    @with_transaction()\n    def test_save_mixed_context(self):\n        'Test save with mixed context '\n        pool = Pool()\n        ModelStorage = pool.get('test.modelstorage.required')\n\n        foo = ModelStorage(name='foo')\n        with Transaction().set_context(bar=True):\n            bar = ModelStorage(name='bar')\n        ModelStorage.save([foo, bar])\n\n        self.assertNotEqual(foo._context, bar._context)\n\n    @with_transaction()\n    def test_fail_saving_mixed_context1(self):\n        'Test fail saving with mixed context '\n        pool = Pool()\n        ModelStorage = pool.get('test.modelstorage.required')\n\n        foo = ModelStorage(name='foo')\n        with Transaction().set_context(bar=True):\n            bar = ModelStorage(name='bar')\n        ModelStorage.save([foo, bar])\n        foo.name = None\n        with self.assertRaises(RequiredValidationError):\n            ModelStorage.save([foo, bar])\n\n    @with_transaction()\n    def test_fail_saving_mixed_context2(self):\n        'Test fail saving with mixed context '\n        pool = Pool()\n        ModelStorage = pool.get('test.modelstorage.required')\n\n        foo = ModelStorage(name='foo')\n        with Transaction().set_context(bar=True):\n            bar = ModelStorage(name='bar')\n        ModelStorage.save([foo, bar])\n\n        bar.name = None\n        foo.name = 'foo'\n        with self.assertRaises(RequiredValidationError):\n            ModelStorage.save([foo, bar])\n\n    @with_transaction()\n    def test_save_one2many_create(self):\n        \"Test save one2many create\"\n        pool = Pool()\n        ModelStorage = pool.get('test.modelstorage.save2many')\n        Target = pool.get('test.modelstorage.save2many.target')\n\n        record = ModelStorage()\n        record.targets = [Target()]\n        record.save()\n\n        self.assertTrue(record.id)\n        self.assertEqual(len(record.targets), 1)\n\n    @with_transaction()\n    def test_save_one2many_add(self):\n        \"Test save one2many add\"\n        pool = Pool()\n        ModelStorage = pool.get('test.modelstorage.save2many')\n        Target = pool.get('test.modelstorage.save2many.target')\n\n        target = Target()\n        target.save()\n        record = ModelStorage()\n        record.targets = [target]\n        record.save()\n\n        self.assertTrue(record.id)\n        self.assertEqual(len(record.targets), 1)\n        self.assertEqual(len(Target.search([])), 1)\n\n    @with_transaction()\n    def test_save_one2many_delete(self):\n        \"Test save one2many delete\"\n        pool = Pool()\n        ModelStorage = pool.get('test.modelstorage.save2many')\n        Target = pool.get('test.modelstorage.save2many.target')\n\n        record, = ModelStorage.create([{'targets': [('create', [{}])]}])\n        record.targets = []\n        record.save()\n\n        self.assertEqual(len(record.targets), 0)\n        self.assertEqual(Target.search([], count=True), 0)\n\n    @with_transaction()\n    def test_save_one2many_remove(self):\n        \"Test save one2many remove\"\n        pool = Pool()\n        ModelStorage = pool.get('test.modelstorage.save2many')\n        Target = pool.get('test.modelstorage.save2many.target')\n\n        record, = ModelStorage.create([{'targets': [('create', [{}])]}])\n        ModelStorage.targets.remove(record, record.targets)\n        record.save()\n\n        self.assertEqual(len(record.targets), 0)\n        self.assertEqual(Target.search([], count=True), 1)\n\n    @with_transaction()\n    def test_save_many2many_add(self):\n        \"Test save many2many add\"\n        pool = Pool()\n        ModelStorage = pool.get('test.modelstorage.save2many')\n        Target = pool.get('test.modelstorage.save2many.target')\n\n        target = Target()\n        target.save()\n        record = ModelStorage()\n        record.m2m_targets = [target]\n        record.save()\n\n        self.assertTrue(record.id)\n        self.assertEqual(len(record.m2m_targets), 1)\n        self.assertEqual(len(Target.search([])), 1)\n\n    @with_transaction()\n    def test_save_many2many_delete(self):\n        \"Test save many2many delete\"\n        pool = Pool()\n        ModelStorage = pool.get('test.modelstorage.save2many')\n        Target = pool.get('test.modelstorage.save2many.target')\n\n        record, = ModelStorage.create([{'m2m_targets': [('create', [{}])]}])\n        ModelStorage.m2m_targets.delete(record, record.m2m_targets)\n        record.save()\n\n        self.assertEqual(len(record.targets), 0)\n        self.assertEqual(Target.search([], count=True), 0)\n\n    @with_transaction()\n    def test_save_many2many_remove(self):\n        \"Test save one2many remove\"\n        pool = Pool()\n        ModelStorage = pool.get('test.modelstorage.save2many')\n        Target = pool.get('test.modelstorage.save2many.target')\n\n        target = Target()\n        target.save()\n        record, = ModelStorage.create([\n                {'m2m_targets': [('add', [target.id])]}])\n        record.m2m_targets = []\n        record.save()\n\n        self.assertEqual(len(record.m2m_targets), 0)\n        self.assertEqual(Target.search([], count=True), 1)\n\n    @with_transaction(context={'_check_access': True})\n    def test_model_translations(self):\n        'Test any user can translate fields and duplicate its records'\n        pool = Pool()\n        Transalatable = pool.get('test.char_translate')\n        Lang = pool.get('ir.lang')\n        User = pool.get('res.user')\n        lang, = Lang.search([\n                ('translatable', '=', False),\n                ('code', '!=', 'en'),\n                ], limit=1)\n        lang.translatable = True\n        lang.save()\n\n        user = User(login='test')\n        user.save()\n        with Transaction().set_user(user.id):\n            record = Transalatable(char='foo')\n            record.save()\n            with Transaction().set_context(lang=lang.code):\n                record = Transalatable(record.id)\n                record.char = 'bar'\n                record.save()\n                # Test we can copy and translations are copied\n                copied_record, = Transalatable.copy([record])\n                copied_record = Transalatable(copied_record.id)\n                self.assertEqual(copied_record.char, 'bar')\n\n    @with_transaction()\n    def test_pyson_domain_same(self):\n        \"Test same pyson domain validation\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.pyson_domain')\n\n        Model.create([{'constraint': 'foo', 'value': 'foo'}] * 10)\n\n        with self.assertRaises(DomainValidationError) as cm:\n            Model.create([{'constraint': 'foo', 'value': 'bar'}] * 10)\n        self.assertEqual(cm.exception.domain[0], [['value', '=', 'foo']])\n        self.assertTrue(cm.exception.domain[1]['value'])\n\n    @with_transaction()\n    def test_pyson_domain_unique(self):\n        \"Test unique pyson domain validation\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.pyson_domain')\n\n        Model.create(\n            [{'constraint': str(i), 'value': str(i)} for i in range(10)])\n\n        with self.assertRaises(DomainValidationError) as cm:\n            Model.create(\n                [{'constraint': str(i), 'value': str(i + 1)}\n                    for i in range(10)])\n        self.assertTrue(cm.exception.domain[0])\n        self.assertTrue(cm.exception.domain[1]['value'])\n\n    @with_transaction()\n    def test_pyson_domain_unique_in_max(self):\n        \"Test unique pyson domain validation with greater IN_MAX\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.pyson_domain')\n\n        in_max = Transaction().database.IN_MAX\n        self.addCleanup(setattr, Transaction().database, 'IN_MAX', in_max)\n        Transaction().database.IN_MAX = 1\n\n        # Use modulo 6 so len(domains) is greater then len(records) * 0.5\n        # and more than 1 (IN_MAX) have the same domain\n        Model.create(\n            [{'constraint': str(i % 6), 'value': str(i % 6)}\n                for i in range(10)])\n\n        with self.assertRaises(DomainValidationError) as cm:\n            Model.create(\n                [{'constraint': str(i % 6), 'value': str(i)}\n                    for i in range(10)])\n        self.assertTrue(cm.exception.domain[0])\n        self.assertTrue(cm.exception.domain[1]['value'])\n\n    @with_transaction()\n    def test_pyson_domain_single(self):\n        \"Test pyson domain validation for 1 record\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.pyson_domain')\n\n        Model.create([{'constraint': 'foo', 'value': 'foo'}])\n\n        with self.assertRaises(DomainValidationError) as cm:\n            Model.create([{'constraint': 'foo', 'value': 'bar'}])\n        self.assertEqual(cm.exception.domain[0], [['value', '=', 'foo']])\n        self.assertTrue(cm.exception.domain[1]['value'])\n\n    @with_transaction()\n    def test_relation_domain(self):\n        \"Test valid relation domain\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.relation_domain')\n        Target = pool.get('test.modelstorage.relation_domain.target')\n\n        target, = Target.create([{'value': 'valid'}])\n\n        record, = Model.create([{'relation': target.id}])\n\n    @with_transaction()\n    def test_relation_domain_invalid(self):\n        \"Test invalid relation domain\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.relation_domain')\n        Target = pool.get('test.modelstorage.relation_domain.target')\n\n        target, = Target.create([{'value': 'invalid'}])\n\n        with self.assertRaises(DomainValidationError) as cm:\n            Model.create([{'relation': target.id}])\n        self.assertEqual(cm.exception.domain[0], [('value', '=', 'valid')])\n        self.assertTrue(cm.exception.domain[1]['value'])\n\n    @with_transaction()\n    def test_relation_domain_multi(self):\n        \"Test relation multi domain\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.relation_multi_domain')\n        Target = pool.get('test.modelstorage.relation_multi_domain.target')\n\n        target, = Target.create([{'test1': True, 'test2': True}])\n\n        record, = Model.create([{'relation': target.id}])\n\n    @with_transaction()\n    def test_relation_domain_multi_invalid(self):\n        \"Test invalid relation multi domain\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.relation_multi_domain')\n        Target = pool.get('test.modelstorage.relation_multi_domain.target')\n\n        target1, target2 = Target.create(\n            [{'test1': False, 'test2': True}, {'test1': True, 'test2': False}])\n\n        with self.assertRaises(DomainValidationError) as cm:\n            Model.create([{\n                        'relation': target1.id,\n                        }])\n        self.assertEqual(cm.exception.domain[0], [('test1', '=', True)])\n        self.assertEqual(cm.exception.domain[1].keys(), {'test1'})\n\n        with self.assertRaises(DomainValidationError) as cm:\n            Model.create([{\n                        'relation': target2.id,\n                        }])\n        self.assertEqual(cm.exception.domain[0], [('test2', '=', True)])\n        self.assertEqual(cm.exception.domain[1].keys(), {'test2'})\n\n    @with_transaction()\n    def test_relation_pyson_domain(self):\n        \"Test valid relation with PYSON\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.relation_domain')\n        Target = pool.get('test.modelstorage.relation_domain.target')\n\n        target, = Target.create([{'value': 'valid'}])\n\n        record, = Model.create(\n            [{'relation_pyson': target.id, 'relation_valid': True}])\n\n    @with_transaction()\n    def test_relation_pyson_domain_invalid(self):\n        \"Test valid relation with PYSON\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.relation_domain')\n        Target = pool.get('test.modelstorage.relation_domain.target')\n\n        target, = Target.create([{'value': 'valid'}])\n\n        with self.assertRaises(DomainValidationError) as cm:\n            Model.create(\n                [{'relation_pyson': target.id, 'relation_valid': False}])\n        self.assertEqual(cm.exception.domain[0], [['value', '!=', 'valid']])\n        self.assertTrue(cm.exception.domain[1], 'value')\n\n    @with_transaction()\n    def test_relation_domain_context(self):\n        \"Test valid relation with context\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.relation_domain')\n        Target = pool.get('test.modelstorage.relation_domain.target')\n\n        target, = Target.create([{}])\n\n        record, = Model.create(\n            [{'relation_context': target.id, 'relation_valid': True}])\n\n    @with_transaction()\n    def test_relation_domain_context_invalid(self):\n        \"Test invalid relation with context\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.relation_domain')\n        Target = pool.get('test.modelstorage.relation_domain.target')\n\n        target, = Target.create([{}])\n\n        with self.assertRaises(DomainValidationError):\n            record, = Model.create(\n                [{'relation_context': target.id, 'relation_valid': False}])\n\n    @with_transaction()\n    def test_relation_pyson_domain_context(self):\n        \"Test valid relation with PYSON and context\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.relation_domain')\n        Target = pool.get('test.modelstorage.relation_domain.target')\n\n        target, = Target.create([{}])\n\n        record, = Model.create(\n            [{'relation_pyson_context': target.id, 'relation_valid': True}])\n\n    @with_transaction()\n    def test_relation_pyson_domain_context_invalid(self):\n        \"Test invalid relation with PYSON and context\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.relation_domain')\n        Target = pool.get('test.modelstorage.relation_domain.target')\n\n        target, = Target.create([{}])\n\n        with self.assertRaises(DomainValidationError):\n            record, = Model.create([{\n                        'relation_pyson_context': target.id,\n                        'relation_valid': False}])\n\n    @with_transaction()\n    def test_relation2_domain_invalid(self):\n        \"Test invalid relation domain with 2 level\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.relation_domain2')\n        Target2 = pool.get('test.modelstorage.relation_domain2.target')\n        Target = pool.get('test.modelstorage.relation_domain.target')\n\n        target, = Target.create([{'value': 'invalid'}])\n        target2, = Target2.create([{'relation2': target.id}])\n\n        with self.assertRaises(DomainValidationError) as cm:\n            Model.create([{'relation': target2.id}])\n        self.assertEqual(\n            cm.exception.domain[0], [('relation2.value', '=', 'valid')])\n        self.assertTrue(cm.exception.domain[1]['relation2'])\n        self.assertTrue(\n            cm.exception.domain[1]['relation2']['relation_fields']['value'])\n\n    @with_transaction()\n    def test_check_xml_record_without_record(self):\n        \"Test check_xml_record without record\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage')\n        record, = Model.create([{}])\n\n        result = Model.check_xml_record([record], {'name': \"Test\"})\n\n        self.assertTrue(result)\n\n    @with_transaction()\n    def test_check_xml_record_with_record_no_matching_values(self):\n        \"Test check_xml_record with record and no matching values\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage')\n        ModelData = pool.get('ir.model.data')\n        record, = Model.create([{}])\n        ModelData.create([{\n                    'fs_id': 'test',\n                    'model': 'test.modelstorage',\n                    'module': 'tests',\n                    'db_id': record.id,\n                    'values': ModelData.dump_values({}),\n                    'noupdate': False,\n                    }])\n\n        result = Model.check_xml_record([record], {'name': \"Test\"})\n\n        self.assertTrue(result)\n\n    @with_transaction()\n    def test_check_xml_record_with_record_matching_values(self):\n        \"Test check_xml_record with record and matching values\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage')\n        ModelData = pool.get('ir.model.data')\n        record, = Model.create([{'name': \"Foo\"}])\n        ModelData.create([{\n                    'fs_id': 'test',\n                    'model': 'test.modelstorage',\n                    'module': 'tests',\n                    'db_id': record.id,\n                    'values': ModelData.dump_values({'name': \"Foo\"}),\n                    'noupdate': False,\n                    }])\n\n        result = Model.check_xml_record([record], {'name': \"Bar\"})\n\n        self.assertFalse(result)\n\n    @with_transaction()\n    def test_check_xml_record_with_record_matching_values_noupdate(self):\n        \"Test check_xml_record with record and matching values but noupdate\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage')\n        ModelData = pool.get('ir.model.data')\n        record, = Model.create([{'name': \"Foo\"}])\n        ModelData.create([{\n                    'fs_id': 'test',\n                    'model': 'test.modelstorage',\n                    'module': 'tests',\n                    'db_id': record.id,\n                    'values': ModelData.dump_values({'name': \"Foo\"}),\n                    'noupdate': True,\n                    }])\n\n        result = Model.check_xml_record([record], {'name': \"Bar\"})\n\n        self.assertTrue(result)\n\n    @with_transaction(user=0)\n    def test_check_xml_record_with_record_matching_values_root(self):\n        \"Test check_xml_record with record with matching values as root\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage')\n        ModelData = pool.get('ir.model.data')\n        record, = Model.create([{'name': \"Foo\"}])\n        ModelData.create([{\n                    'fs_id': 'test',\n                    'model': 'test.modelstorage',\n                    'module': 'tests',\n                    'db_id': record.id,\n                    'values': ModelData.dump_values({'name': \"Foo\"}),\n                    'noupdate': False,\n                    }])\n\n        result = Model.check_xml_record([record], {'name': \"Bar\"})\n\n        self.assertTrue(result)\n\n    @with_transaction()\n    def test_check_xml_record_with_record_no_values(self):\n        \"Test check_xml_record with record and no values\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage')\n        ModelData = pool.get('ir.model.data')\n        record, = Model.create([{'name': \"Foo\"}])\n        ModelData.create([{\n                    'fs_id': 'test',\n                    'model': 'test.modelstorage',\n                    'module': 'tests',\n                    'db_id': record.id,\n                    'values': None,\n                    'noupdate': False,\n                    }])\n\n        result = Model.check_xml_record([record], None)\n\n        self.assertFalse(result)\n\n    @with_transaction()\n    def test_check_xml_record_with_record_no_values_noupdate(self):\n        \"Test check_xml_record with record and no values but noupdate\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage')\n        ModelData = pool.get('ir.model.data')\n        record, = Model.create([{'name': \"Foo\"}])\n        ModelData.create([{\n                    'fs_id': 'test',\n                    'model': 'test.modelstorage',\n                    'module': 'tests',\n                    'db_id': record.id,\n                    'values': None,\n                    'noupdate': True,\n                    }])\n\n        result = Model.check_xml_record([record], None)\n\n        self.assertTrue(result)\n\n    @with_transaction()\n    def test_delete_clear_db_id_model_data_noupdate(self):\n        \"Test delete record clear DB id from model data\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage')\n        ModelData = pool.get('ir.model.data')\n        record, = Model.create([{'name': \"Foo\"}])\n        data, = ModelData.create([{\n                    'fs_id': 'test',\n                    'model': 'test.modelstorage',\n                    'module': 'tests',\n                    'db_id': record.id,\n                    'values': None,\n                    'noupdate': True,\n                    }])\n\n        Model.delete([record])\n\n        self.assertIsNone(data.db_id)\n\n    @with_transaction(user=0)\n    def test_delete_model_data_without_noupdate(self):\n        \"Test delete record from model data without noupdate\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage')\n        ModelData = pool.get('ir.model.data')\n        record, = Model.create([{'name': \"Foo\"}])\n        data, = ModelData.create([{\n                    'fs_id': 'test',\n                    'model': 'test.modelstorage',\n                    'module': 'tests',\n                    'db_id': record.id,\n                    'values': None,\n                    'noupdate': False,\n                    }])\n\n        Model.delete([record])\n\n\nclass EvalEnvironmentTestCase(unittest.TestCase):\n    \"Test EvalEnvironment\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_char_field(self):\n        \"Test eval simple field\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.eval_environment')\n\n        record = Model(char=\"Test\")\n        env = EvalEnvironment(record, Model)\n\n        self.assertEqual(env.get('char'), \"Test\")\n\n    @with_transaction()\n    def test_reference_field(self):\n        \"Test eval reference field\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.eval_environment')\n\n        record = Model(reference=Model(id=1))\n        env = EvalEnvironment(record, Model)\n\n        self.assertEqual(\n            env.get('reference'), 'test.modelstorage.eval_environment,1')\n\n    @with_transaction()\n    def test_many2one_field(self):\n        \"Test eval many2one field\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.eval_environment')\n\n        record = Model(many2one=Model(id=1))\n        env = EvalEnvironment(record, Model)\n\n        self.assertEqual(env.get('many2one'), 1)\n\n    @with_transaction()\n    def test_one2many_field(self):\n        \"Test eval one2many field\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.eval_environment')\n\n        record = Model(one2many=[Model(id=1), Model(id=2)])\n        env = EvalEnvironment(record, Model)\n\n        self.assertEqual(env.get('one2many'), [1, 2])\n\n    @with_transaction()\n    def test_multiselection_field(self):\n        \"Test eval multiselection field\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.eval_environment')\n\n        record = Model(multiselection=['value1', 'value2'])\n        env = EvalEnvironment(record, Model)\n\n        self.assertEqual(env.get('multiselection'), ('value1', 'value2'))\n\n    @with_transaction()\n    def test_parent_field(self):\n        \"Test eval parent field\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage.eval_environment')\n\n        record = Model(many2one=Model(char=\"Test\"))\n        env = EvalEnvironment(record, Model)\n\n        self.assertEqual(env.get('_parent_many2one').get('char'), \"Test\")\n\n    @with_transaction()\n    def test_model_save_skip_check_access(self):\n        \"Test model save skips check access\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage')\n        IrModel = pool.get('ir.model')\n        IrModelAccess = pool.get('ir.model.access')\n\n        model, = IrModel.search([('model', '=', Model.__name__)])\n        IrModelAccess.create([{\n                    'model': model.id,\n                    'perm_read': False,\n                    'perm_create': False,\n                    'perm_write': False,\n                    'perm_delete': False,\n                    }])\n        with Transaction().set_context(_check_access=True):\n            record = Model(name=\"Test\")\n            record.save()\n\n    @with_transaction()\n    def test_model_getattr_skip_check_access(self):\n        \"Test model getattr skips check access\"\n        pool = Pool()\n        Model = pool.get('test.modelstorage')\n        IrModel = pool.get('ir.model')\n        IrModelAccess = pool.get('ir.model.access')\n\n        model, = IrModel.search([('model', '=', Model.__name__)])\n        IrModelAccess.create([{\n                    'model': model.id,\n                    'perm_read': False,\n                    'perm_create': False,\n                    'perm_write': False,\n                    'perm_delete': False,\n                    }])\n        record, = Model.create([{'name': \"Test\"}])\n\n        with Transaction().set_context(_check_access=True):\n            record = Model(record.id)\n\n            self.assertEqual(record.name, \"Test\")\n"
  },
  {
    "path": "trytond/tests/test_modelview.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport unittest\nfrom unittest.mock import patch\n\nfrom lxml import etree\n\nfrom trytond.model.exceptions import AccessButtonError, AccessError\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval, PYSONDecoder, PYSONEncoder\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass ModelView(unittest.TestCase):\n    \"Test ModelView\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_changed_values(self):\n        \"Test ModelView._changed_values\"\n        pool = Pool()\n        Model = pool.get('test.modelview.changed_values')\n        Target = pool.get('test.modelview.changed_values.target')\n\n        record = Model()\n\n        self.assertEqual(record._changed_values, {})\n\n        record.name = 'foo'\n        record.target = Target(1)\n        record.ref_target = Target(2)\n        record.targets = [Target(name='bar')]\n        record.multiselection = ['a']\n        record.dictionary = {'key': 'value'}\n        self.assertEqual(record._changed_values, {\n                'name': 'foo',\n                'target': 1,\n                'ref_target': 'test.modelview.changed_values.target,2',\n                'targets': {\n                    'add': [\n                        (0, {'id': None, 'name': 'bar'}),\n                        ],\n                    },\n                'multiselection': ('a',),\n                'dictionary': {'key': 'value'},\n                })\n\n        record = Model(name='test', target=1, targets=[\n                {'id': 1, 'name': 'foo'},\n                {'id': 2},\n                ],\n            m2m_targets=[5, 6, 7],\n            multiselection=['a'],\n            dictionary={'key': 'value'},\n            )\n\n        self.assertEqual(record._changed_values, {})\n\n        target = record.targets[0]\n        target.name = 'bar'\n        record.targets = [target]\n        record.m2m_targets = [Target(9), Target(10)]\n        ms = list(record.multiselection)\n        ms.append('b')\n        record.multiselection = ms\n        dico = record.dictionary.copy()\n        dico['key'] = 'another value'\n        record.dictionary = dico\n        self.assertEqual(record._changed_values, {\n                'targets': {\n                    'update': [{'id': 1, 'name': 'bar'}],\n                    'delete': [2],\n                    },\n                'm2m_targets': {\n                    'remove': [5, 6, 7],\n                    'add': [(0, {'id': 9}), (1, {'id': 10})],\n                    },\n                'multiselection': ('a', 'b'),\n                'dictionary': {'key': 'another value'},\n                })\n\n        # change only one2many record\n        record = Model(targets=[{'id': 1, 'name': 'foo'}])\n        self.assertEqual(record._changed_values, {})\n\n        target, = record.targets\n        target.name = 'bar'\n        record.targets = record.targets\n        self.assertEqual(record._changed_values, {\n                'targets': {\n                    'update': [{'id': 1, 'name': 'bar'}],\n                    },\n                })\n\n        # no initial value\n        record = Model()\n        record._values = record._record()\n        target = Target(id=1)\n        record._values['targets'] = [target]\n        target.name = 'foo'\n        self.assertEqual(record._changed_values, {\n                'targets': {\n                    'add': [(0, {'id': 1, 'name': 'foo'})],\n                    },\n                })\n\n    @with_transaction()\n    def test_changed_values_stored(self):\n        \"Test stored changed values\"\n        pool = Pool()\n        Model = pool.get('test.modelview.stored.changed_values')\n        Target = pool.get('test.modelview.stored.changed_values.target')\n\n        record = Model()\n        record.targets = [Target(name=\"foo\"), Target(name=\"bar\")]\n        record.save()\n        target1, target2 = record.targets\n\n        record = Model(record.id)\n        target1.name = \"test\"\n        record.targets = [target1, Target(name=\"baz\")]\n\n        self.assertEqual(record._changed_values, {\n                'targets': {\n                    'delete': [target2.id],\n                    'update': [{'id': target1.id, 'name': \"test\"}],\n                    'add': [(1, {'id': None, 'name': \"baz\"})],\n                    },\n                })\n\n    @with_transaction()\n    def test_changed_values_removed(self):\n        \"Test removed\"\n        pool = Pool()\n        Model = pool.get('test.modelview.changed_values')\n        Target = pool.get('test.modelview.changed_values.target')\n\n        target = Target(1)\n        record = Model(targets=[target])\n        Model.targets.remove(record, [target])\n\n        self.assertEqual(record._changed_values, {\n                'targets': {\n                    'remove': [1],\n                    },\n                })\n\n    @with_transaction()\n    def test_changed_values_deleted(self):\n        \"Test deleted\"\n        pool = Pool()\n        Model = pool.get('test.modelview.changed_values')\n        Target = pool.get('test.modelview.changed_values.target')\n\n        target = Target(1)\n        record = Model(m2m_targets=[target])\n        Model.m2m_targets.delete(record, [target])\n\n        self.assertEqual(record._changed_values, {\n                'm2m_targets': {\n                    'delete': [1],\n                    },\n                })\n\n    @with_transaction()\n    def test_changed_values_rec_name(self):\n        \"Test rec_name of ModelStorage is added\"\n        pool = Pool()\n        Model = pool.get('test.modelview.changed_values')\n        Target = pool.get('test.modelview.changed_values.stored_target')\n\n        target, = Target.create([{'name': \"Target\"}])\n        record = Model()\n        record.stored_target = target\n\n        self.assertEqual(record._changed_values, {\n                'stored_target': target.id,\n                'stored_target.': {\n                    'rec_name': \"Target\",\n                    },\n                })\n\n    @with_transaction()\n    def test_changed_values_reverse_field(self):\n        \"Test _changed_values with reverse field set\"\n        pool = Pool()\n        Model = pool.get('test.modelview.changed_values')\n        Target = pool.get('test.modelview.changed_values.target')\n\n        record = Model(id=1)\n        record.name = \"Record\"\n        target = Target()\n        target.name = \"Target\"\n        record.targets = [target]\n\n        self.assertEqual(record._changed_values, {\n                'name': \"Record\",\n                'targets': {\n                    'add': [(0, {'id': None, 'name': \"Target\"})],\n                    },\n                })\n\n    @with_transaction(context={'_check_access': True})\n    def test_button_access(self):\n        'Test Button Access'\n        pool = Pool()\n        TestModel = pool.get('test.modelview.button')\n        Model = pool.get('ir.model')\n        Button = pool.get('ir.model.button')\n        ModelAccess = pool.get('ir.model.access')\n        Group = pool.get('res.group')\n\n        model, = Model.search([('model', '=', 'test.modelview.button')])\n        admin, = Group.search([('name', '=', 'Administration')])\n        test = TestModel()\n\n        button = Button(name='test', model=model)\n        button.save()\n\n        # Without model/button access\n        TestModel.test([test])\n\n        # Without read access\n        access = ModelAccess(model=model, group=None, perm_read=False)\n        access.save()\n        with self.assertRaises(AccessError):\n            TestModel.test([test])\n\n        # Without write access\n        access.perm_read = True\n        access.perm_write = False\n        access.save()\n        with self.assertRaises(AccessError):\n            TestModel.test([test])\n\n        # Without write access but with button access\n        button.groups = [admin]\n        button.save()\n        TestModel.test([test])\n\n        # Without button access\n        ModelAccess.delete([access])\n        no_group = Group(name='no group')\n        no_group.save()\n        button.groups = [no_group]\n        button.save()\n        with self.assertRaises(AccessButtonError):\n            TestModel.test([test])\n\n    @with_transaction(context={'_check_access': True})\n    def test_button_no_rule(self):\n        \"Test no Button Rule\"\n        pool = Pool()\n        TestModel = pool.get('test.modelview.button')\n        ButtonClick = pool.get('ir.model.button.click')\n\n        record = TestModel(id=-1)\n        with patch.object(TestModel, 'test_non_decorated') as button_func:\n            TestModel.test([record])\n            button_func.assert_called_with([record])\n\n        clicks = ButtonClick.search([\n                ('record_id', '=', record.id),\n                ])\n        self.assertEqual(len(clicks), 0)\n\n    @with_transaction(context={'_check_access': True})\n    def test_button_rule_not_passed(self):\n        \"Test not passed Button Rule\"\n        pool = Pool()\n        TestModel = pool.get('test.modelview.button')\n        Model = pool.get('ir.model')\n        Button = pool.get('ir.model.button')\n        ButtonRule = pool.get('ir.model.button.rule')\n        ButtonClick = pool.get('ir.model.button.click')\n\n        model, = Model.search([('model', '=', 'test.modelview.button')])\n        rule = ButtonRule(number_user=2)\n        button = Button(name='test', model=model, rules=[rule])\n        button.save()\n\n        record = TestModel(id=-1)\n        with patch.object(TestModel, 'test_non_decorated') as button_func:\n            TestModel.test([record])\n            button_func.assert_called_with([])\n\n        clicks = ButtonClick.search([\n                ('button', '=', button.id),\n                ('record_id', '=', record.id),\n                ])\n        self.assertEqual(len(clicks), 1)\n        click, = clicks\n        self.assertEqual(click.user.id, 1)\n\n    @with_transaction(context={'_check_access': True})\n    def test_button_rule_passed(self):\n        \"Test passed Button Rule\"\n        pool = Pool()\n        TestModel = pool.get('test.modelview.button')\n        Model = pool.get('ir.model')\n        Button = pool.get('ir.model.button')\n        ButtonRule = pool.get('ir.model.button.rule')\n        ButtonClick = pool.get('ir.model.button.click')\n\n        model, = Model.search([('model', '=', 'test.modelview.button')])\n        rule = ButtonRule(number_user=1)\n        button = Button(name='test', model=model, rules=[rule])\n        button.save()\n\n        record = TestModel(id=-1)\n        with patch.object(TestModel, 'test_non_decorated') as button_func:\n            TestModel.test([record])\n            button_func.assert_called_with([record])\n\n        clicks = ButtonClick.search([\n                ('button', '=', button.id),\n                ('record_id', '=', record.id),\n                ])\n        self.assertEqual(len(clicks), 1)\n        click, = clicks\n        self.assertEqual(click.user.id, 1)\n\n    @with_transaction()\n    def test_button_rule_test_condition(self):\n        \"Test condition Button Rule\"\n        pool = Pool()\n        TestModel = pool.get('test.modelview.button')\n        Button = pool.get('ir.model.button')\n        ButtonRule = pool.get('ir.model.button.rule')\n        ButtonClick = pool.get('ir.model.button.click')\n\n        button = Button()\n        clicks = [ButtonClick(user=1)]\n        condition = PYSONEncoder().encode(\n            Eval('self', {}).get('value', 0) > 48)\n        rule = ButtonRule(\n            condition=condition, group=None, number_user=2, button=button)\n        record = TestModel(id=-1)\n\n        record.value = 10\n        self.assertTrue(rule.test(record, clicks))\n\n        record.value = 50\n        self.assertFalse(rule.test(record, clicks))\n\n    @with_transaction()\n    def test_button_rule_test_group(self):\n        \"Test group Button Rule\"\n        pool = Pool()\n        TestModel = pool.get('test.modelview.button')\n        Button = pool.get('ir.model.button')\n        ButtonRule = pool.get('ir.model.button.rule')\n        ButtonClick = pool.get('ir.model.button.click')\n        User = pool.get('res.user')\n        Group = pool.get('res.group')\n\n        group = Group()\n        user = User()\n        user.groups = []\n        button = Button()\n        clicks = [ButtonClick(user=user)]\n        rule = ButtonRule(\n            condition=None, group=group, number_user=1, button=button)\n        record = TestModel()\n\n        self.assertFalse(rule.test(record, clicks))\n\n        user.groups = [group]\n        self.assertTrue(rule.test(record, clicks))\n\n    @with_transaction()\n    def test_button_rule_test_number_user(self):\n        \"Test number user Button Rule\"\n        pool = Pool()\n        TestModel = pool.get('test.modelview.button')\n        Button = pool.get('ir.model.button')\n        ButtonRule = pool.get('ir.model.button.rule')\n        ButtonClick = pool.get('ir.model.button.click')\n        User = pool.get('res.user')\n\n        user1 = User()\n        user2 = User()\n        button = Button()\n        rule = ButtonRule(\n            condition=None, group=None, number_user=2, button=button)\n        record = TestModel()\n\n        # No click\n        self.assertFalse(rule.test(record, []))\n\n        # Only one click\n        clicks = [ButtonClick(user=user1)]\n        self.assertFalse(rule.test(record, clicks))\n\n        # Two clicks from the same user\n        clicks = [ButtonClick(user=user1), ButtonClick(user=user1)]\n        self.assertFalse(rule.test(record, clicks))\n\n        # Two clicks from different users\n        clicks = [ButtonClick(user=user1), ButtonClick(user=user2)]\n        self.assertTrue(rule.test(record, clicks))\n\n    @with_transaction()\n    def test_button_action(self):\n        \"Test button action\"\n        pool = Pool()\n        TestModel = pool.get('test.modelview.button_action')\n\n        action_id = TestModel.test([])\n\n        self.assertIsInstance(action_id, int)\n\n    @with_transaction()\n    def test_button_action_return(self):\n        \"Test button action update value\"\n        pool = Pool()\n        TestModel = pool.get('test.modelview.button_action')\n\n        action = TestModel.test_update([])\n\n        self.assertEqual(action['url'], 'http://www.tryton.org/')\n\n    @with_transaction()\n    def test_button_change(self):\n        \"Test button change\"\n        pool = Pool()\n        Model = pool.get('test.modelview.button_change')\n\n        decoder = PYSONDecoder()\n        view = Model.fields_view_get()\n        tree = etree.fromstring(view['arch'])\n        button = tree.xpath('//button[@name=\"test\"]')[0]\n\n        self.assertEqual(\n            set(decoder.decode(button.attrib['change'])),\n            {'name', 'extra'})\n\n    @with_transaction()\n    def test_link(self):\n        \"Test link in view\"\n        pool = Pool()\n        TestModel = pool.get('test.modelview.link')\n\n        arch = TestModel.fields_view_get()['arch']\n        parser = etree.XMLParser()\n        tree = etree.fromstring(arch, parser=parser)\n        link, = tree.xpath('//link')\n\n        self.assertTrue(link.attrib['id'])\n        self.assertIsInstance(int(link.attrib['id']), int)\n\n    @with_transaction()\n    def test_link_without_read_access(self):\n        \"Test link in view without read access\"\n        pool = Pool()\n        TestModel = pool.get('test.modelview.link')\n        Model = pool.get('ir.model')\n        ModelAccess = pool.get('ir.model.access')\n\n        model, = Model.search([('model', '=', 'test.modelview.link.target')])\n        access = ModelAccess(model=model, group=None, perm_read=False)\n        access.save()\n\n        arch = TestModel.fields_view_get()['arch']\n        parser = etree.XMLParser()\n        tree = etree.fromstring(arch, parser=parser)\n        links = tree.xpath('//link')\n        labels = tree.xpath('//label')\n\n        self.assertFalse(links)\n        self.assertTrue(labels)\n\n    @unittest.skipUnless(hasattr(etree, 'RelaxNG'), \"etree is missing RelaxNG\")\n    @with_transaction()\n    def test_link_label_valid_view(self):\n        \"Test that replacing link by label results in a valid view\"\n        pool = Pool()\n        TestModel = pool.get('test.modelview.link')\n        Model = pool.get('ir.model')\n        ModelAccess = pool.get('ir.model.access')\n        UIView = pool.get('ir.ui.view')\n\n        model, = Model.search([('model', '=', 'test.modelview.link.target')])\n        access = ModelAccess(model=model, group=None, perm_read=False)\n        access.save()\n\n        arch = TestModel.fields_view_get()['arch']\n        parser = etree.XMLParser()\n        tree = etree.fromstring(arch, parser=parser)\n        validator = etree.RelaxNG(etree=UIView.get_rng('form'))\n\n        self.assertTrue(validator.validate(tree))\n\n    @with_transaction()\n    def test_link_without_action_access(self):\n        \"Test link in view without action access\"\n        pool = Pool()\n        TestModel = pool.get('test.modelview.link')\n        ActionWindow = pool.get('ir.action.act_window')\n        Group = pool.get('res.group')\n        ActionGroup = pool.get('ir.action-res.group')\n\n        group = Group(name=\"Group\")\n        group.save()\n        action_window, = ActionWindow.search(\n            [('res_model', '=', 'test.modelview.link.target')])\n        ActionGroup(\n            action=action_window.action,\n            group=group).save()\n\n        arch = TestModel.fields_view_get()['arch']\n        parser = etree.XMLParser()\n        tree = etree.fromstring(arch, parser=parser)\n        links = tree.xpath('//link')\n        labels = tree.xpath('//label')\n\n        self.assertFalse(links)\n        self.assertTrue(labels)\n\n    @with_transaction()\n    def test_rpc_setup(self):\n        \"Testing the computation of the RPC methods\"\n        pool = Pool()\n        TestModel = pool.get('test.modelview.rpc')\n\n        def check_rpc(rpc, attributes):\n            for key, value in attributes.items():\n                self.assertEqual(getattr(rpc, key), value)\n\n        NO_INSTANTIATION = {\n            'instantiate': None,\n            }\n        INSTANTIATE_FIRST = {\n            'instantiate': 0,\n            }\n        for rpc_name, rpc_attrs in [\n                ('get_selection', NO_INSTANTIATION),\n                ('get_function_selection', NO_INSTANTIATION),\n                ('get_reference', NO_INSTANTIATION),\n                ('get_function_reference', NO_INSTANTIATION),\n                ('on_change_with_integer', INSTANTIATE_FIRST),\n                ('on_change_float', INSTANTIATE_FIRST),\n                ('autocomplete_char', INSTANTIATE_FIRST),\n                ]:\n            self.assertIn(rpc_name, TestModel.__rpc__)\n            check_rpc(TestModel.__rpc__[rpc_name], rpc_attrs)\n\n    @with_transaction()\n    def test_remove_empty_page(self):\n        \"Testing the removal of empty pages\"\n        pool = Pool()\n        EmptyPage = pool.get('test.modelview.empty_page')\n\n        arch = EmptyPage.fields_view_get(view_type='form')['arch']\n        parser = etree.XMLParser()\n        tree = etree.fromstring(arch, parser=parser)\n        pages = tree.xpath('//page')\n        self.assertEqual(len(pages), 1)\n        self.assertEqual(pages[0].attrib['id'], 'non-empty')\n\n    @with_transaction()\n    def test_active_field(self):\n        \"Testing active field is set and added to view fields\"\n        pool = Pool()\n        Deactivable = pool.get('test.deactivable.modelview')\n        EmptyPage = pool.get('test.modelview.empty_page')\n\n        fields = Deactivable.fields_view_get(view_type='tree')['fields']\n        self.assertIn('active', fields)\n\n        fields = EmptyPage.fields_view_get(view_type='tree')['fields']\n        self.assertNotIn('active', fields)\n\n    @with_transaction(context={'_check_access': True})\n    def test_circular_depends_removed(self):\n        \"Testing circular depends are removed when user has no access\"\n        pool = Pool()\n        CircularDepends = pool.get('test.modelview.circular_depends')\n        Field = pool.get('ir.model.field')\n        FieldAccess = pool.get('ir.model.field.access')\n\n        foo_field, = Field.search([\n                ('model.model', '=', 'test.modelview.circular_depends'),\n                ('name', '=', 'foo'),\n                ])\n        FieldAccess.create([{\n            'field': foo_field.id,\n            'group': None,\n            'perm_read': False,\n            }])\n\n        fields = CircularDepends.fields_view_get(view_type='form')['fields']\n\n        self.assertEqual(fields, {})\n\n    @with_transaction()\n    def test_depends_depends(self):\n        \"Test depends of depends are included\"\n        pool = Pool()\n        DependsDepends = pool.get('test.modelview.depends_depends')\n\n        fields = DependsDepends.fields_view_get(view_type='form')['fields']\n\n        self.assertEqual(fields.keys(), {'foo', 'bar', 'baz'})\n\n    @with_transaction(context={'_check_access': True})\n    def test_button_depends_access(self):\n        \"Testing buttons are not removed when dependant fields are accesible\"\n        pool = Pool()\n        Button = pool.get('test.modelview.button_depends')\n\n        arch = Button.fields_view_get(view_type='form')['arch']\n        parser = etree.XMLParser()\n        tree = etree.fromstring(arch, parser=parser)\n        buttons = tree.xpath('//button')\n\n        self.assertEqual(len(buttons), 1)\n\n    @with_transaction(context={'_check_access': True})\n    def test_button_depends_no_access(self):\n        \"Testing buttons are removed when dependant fields are not accesible\"\n        pool = Pool()\n        Button = pool.get('test.modelview.button_depends')\n        Field = pool.get('ir.model.field')\n        FieldAccess = pool.get('ir.model.field.access')\n\n        field, = Field.search([\n                ('model.model', '=', Button.__name__),\n                ('name', '=', 'value'),\n                ])\n        FieldAccess.create([{\n            'field': field.id,\n            'group': None,\n            'perm_read': False,\n            }])\n\n        arch = Button.fields_view_get(view_type='form')['arch']\n        parser = etree.XMLParser()\n        tree = etree.fromstring(arch, parser=parser)\n        buttons = tree.xpath('//button')\n\n        self.assertEqual(len(buttons), 0)\n\n    @with_transaction()\n    def test_view_attributes(self):\n        \"Testing view attributes are applied on view\"\n        pool = Pool()\n        ViewAttributes = pool.get('test.modelview.view_attributes')\n\n        arch = ViewAttributes.fields_view_get(view_type='form')['arch']\n        parser = etree.XMLParser()\n        tree = etree.fromstring(arch, parser=parser)\n        field, = tree.xpath('//field[@name=\"foo\"]')\n\n        self.assertTrue(field.attrib.get('visual'))\n\n    @with_transaction()\n    def test_view_attributes_depends(self):\n        \"Testing view attributes depends are included on fields\"\n        pool = Pool()\n        ViewAttributes = pool.get('test.modelview.view_attributes_depends')\n\n        fields = ViewAttributes.fields_view_get(view_type='form')['fields']\n\n        self.assertIn('bar', fields)\n\n    @with_transaction()\n    def test_states_depends_display(self):\n        \"Test that fields used in readonly states are included\"\n        pool = Pool()\n        Depends = pool.get('test.modelview.states_depends')\n\n        readonly_fields = Depends.fields_view_get(view_type='tree')['fields']\n        self.assertIn('bar', readonly_fields)\n        self.assertNotIn('baz', readonly_fields)\n        self.assertIn('quux', readonly_fields)\n\n    @with_transaction()\n    def test_states_depends_edition(self):\n        \"Test that fields used in editable states are included\"\n        pool = Pool()\n        Depends = pool.get('test.modelview.states_depends')\n\n        writeable_fields = Depends.fields_view_get(view_type='form')['fields']\n        self.assertIn('bar', writeable_fields)\n        self.assertIn('baz', writeable_fields)\n        self.assertIn('quux', writeable_fields)\n"
  },
  {
    "path": "trytond/tests/test_mptt.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport sys\nimport unittest\nfrom unittest.mock import patch\n\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\nfrom .test_tree import TreeTestCaseMixin\n\n\nclass MPTTTestCase(TreeTestCaseMixin, unittest.TestCase):\n    'Test Modified Preorder Tree Traversal'\n    model_name = 'test.mptt'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    def check_tree(self, parent_id=None, left=-1, right=sys.maxsize):\n        pool = Pool()\n        Mptt = pool.get(self.model_name)\n\n        with Transaction().set_context(active_test=False):\n            childs = Mptt.search([\n                    ('parent', '=', parent_id),\n                    ], order=[('left', 'ASC')])\n        for child in childs:\n            self.assertGreater(child.left, left,\n                msg='%s: left %d <= parent left %d' % (\n                    child, child.left, left))\n            self.assertLess(child.left, child.right,\n                msg='%s: left %d >= right %d' % (\n                    child, child.left, child.right))\n            self.assertLess(child.right, right,\n                msg='%s: right %d >= parent right %d' % (\n                    child, child.right, right))\n            self.check_tree(child.id, left=child.left,\n                right=child.right)\n        next_left = -1\n        for child in childs:\n            self.assertGreater(child.left, next_left,\n                msg='%s: left %d <= next left %d' % (\n                    child, child.left, next_left))\n            next_left = child.right\n        childs.reverse()\n        previous_right = sys.maxsize\n        for child in childs:\n            self.assertLess(child.right, previous_right,\n                msg='%s: right %d >= previous right %d' % (\n                    child, child.right, previous_right))\n            previous_right = child.left\n\n    def rebuild(self):\n        pool = Pool()\n        Mptt = pool.get(self.model_name)\n        Mptt._rebuild_tree('parent', None, 0)\n\n    @with_transaction()\n    def test_update_only_if_parent_is_modified(self):\n        'The left and right fields must only be updated if parent is modified'\n        pool = Pool()\n        Mptt = pool.get('test.mptt')\n\n        self.create()\n\n        records = Mptt.search([\n                ('parent', '=', None),\n                ])\n        with patch.object(Mptt, '_update_tree') as update, \\\n                patch.object(Mptt, '_rebuild_tree') as rebuild:\n            Mptt.write(records, {'name': 'Parent Records'})\n            self.assertFalse(update.called)\n            self.assertFalse(rebuild.called)\n\n            first_parent, second_parent = records[:2]\n            Mptt.write(list(first_parent.childs), {\n                    'parent': second_parent.id,\n                    })\n\n            self.assertTrue(update.called or rebuild.called)\n\n    @with_transaction()\n    def test_nested_create(self):\n        pool = Pool()\n        Mptt = pool.get('test.mptt')\n\n        record, = Mptt.create([{\n                    'name': 'Test nested create 1',\n                    'childs': [('create', [{\n                                    'name': 'Test nested create 1 1',\n                                    }])],\n                    }])\n        self.check_tree()\n"
  },
  {
    "path": "trytond/tests/test_multivalue.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass MultiValueTestCase(unittest.TestCase):\n    \"Test MultiValue\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_get_multivalue(self):\n        \"Test get_multivalue\"\n        pool = Pool()\n        ModelMultiValue = pool.get('test.model_multivalue')\n        ModelValue = pool.get('test.model_multivalue.value')\n\n        record = ModelMultiValue()\n        record.save()\n        value, = ModelValue.search([])\n        value.condition = \"foo\"\n        value.value = \"bar\"\n        value.save()\n\n        self.assertEqual(\n            record.get_multivalue('value', condition=\"foo\"),\n            \"bar\")\n\n    @with_transaction()\n    def test_get_multivalue_extra_pattern(self):\n        \"Test get_multivalue with extra pattern\"\n        pool = Pool()\n        ModelMultiValue = pool.get('test.model_multivalue')\n        ModelValue = pool.get('test.model_multivalue.value')\n\n        record = ModelMultiValue()\n        record.save()\n        value, = ModelValue.search([])\n        value.value = \"bar\"\n        value.save()\n\n        self.assertEqual(\n            record.get_multivalue('value', extra=\"foo\"),\n            \"bar\")\n\n    @with_transaction()\n    def test_get_multivalue_default(self):\n        \"Test get_multivalue default value\"\n        pool = Pool()\n        ModelMultiValue = pool.get('test.model_multivalue')\n\n        record = ModelMultiValue()\n        record.save()\n\n        self.assertEqual(record.get_multivalue('value'), \"default\")\n\n    @with_transaction()\n    def test_get_multivalue_match_none(self):\n        \"Test get_multivalue does not match None\"\n        pool = Pool()\n        ModelMultiValue = pool.get('test.model_multivalue')\n        ModelValue = pool.get('test.model_multivalue.value')\n\n        record = ModelMultiValue()\n        record.save()\n        value = ModelValue(record=record, condition=\"foo\", value=\"bar\")\n        value.save()\n\n        self.assertEqual(\n            record.get_multivalue('value', condition=\"test\"),\n            \"default\")\n\n    @with_transaction()\n    def test_get_multivalue_many2one(self):\n        \"Test get_multivalue for Many2One\"\n        pool = Pool()\n        ModelMultiValue = pool.get('test.model_multivalue')\n        Target = pool.get('test.model_multivalue.target')\n\n        target = Target(name=\"Target\")\n        target.save()\n        record = ModelMultiValue(value_many2one=target)\n        record.save()\n\n        self.assertEqual(record.get_multivalue('value_many2one'), target)\n\n    @with_transaction()\n    def test_get_multivalue_multiselection(self):\n        \"Test get_multivalue for MultiSelection\"\n        pool = Pool()\n        ModelMultiValue = pool.get('test.model_multivalue')\n\n        record = ModelMultiValue(value_multiselection=(\"foo\", \"bar\"))\n        record.save()\n\n        self.assertEqual(\n            record.get_multivalue('value_multiselection'), (\"bar\", \"foo\"))\n\n    @with_transaction()\n    def test_get_multivalue_reference(self):\n        \"Test get_multivalue for Reference\"\n        pool = Pool()\n        ModelMultiValue = pool.get('test.model_multivalue')\n        Target = pool.get('test.model_multivalue.target')\n\n        target = Target(name=\"Target\")\n        target.save()\n        record = ModelMultiValue(value_reference=target)\n        record.save()\n\n        self.assertEqual(record.get_multivalue('value_reference'), target)\n\n    @with_transaction()\n    def test_set_multivalue(self):\n        \"Test set_multivalue\"\n        pool = Pool()\n        ModelMultiValue = pool.get('test.model_multivalue')\n        ModelValue = pool.get('test.model_multivalue.value')\n\n        record = ModelMultiValue()\n        record.save()\n        record.set_multivalue('value', \"set\", condition=\"test\")\n\n        value, = ModelValue.search([('condition', '=', \"test\")])\n        self.assertEqual(value.record, record)\n        self.assertEqual(value.value, \"set\")\n\n    @with_transaction()\n    def test_set_multivalue_extra_pattern(self):\n        \"Test set_multivalue extra pattern\"\n        pool = Pool()\n        ModelMultiValue = pool.get('test.model_multivalue')\n        ModelValue = pool.get('test.model_multivalue.value')\n\n        record = ModelMultiValue()\n        record.save()\n        record.set_multivalue('value', \"set\", extra=\"foo\")\n\n        value, = ModelValue.search([])\n        self.assertEqual(value.record, record)\n        self.assertEqual(value.value, \"set\")\n        self.assertEqual(value.condition, None)\n\n    @with_transaction()\n    def test_set_multivalue_match_none(self):\n        \"Test set_multivalue matches None\"\n        pool = Pool()\n        ModelMultiValue = pool.get('test.model_multivalue')\n        ModelValue = pool.get('test.model_multivalue.value')\n\n        record = ModelMultiValue()\n        record.save()\n        record.set_multivalue('value', \"set\", condition=\"test\")\n\n        self.assertEqual(len(ModelValue.search([])), 2)\n\n    @with_transaction()\n    def test_set_multivalue_other_default(self):\n        \"Test set_multivalue with other default\"\n        pool = Pool()\n        ModelMultiValue = pool.get('test.model_multivalue')\n        ModelValue = pool.get('test.model_multivalue.value')\n\n        record = ModelMultiValue()\n        record.save()\n        record.set_multivalue('value', \"test\")\n\n        value, = ModelValue.search([])\n        self.assertEqual(value.value_default, \"other default\")\n\n    @with_transaction()\n    def test_set_multivalue_many2one(self):\n        \"Test set_multivalue for Many2One\"\n        pool = Pool()\n        ModelMultiValue = pool.get('test.model_multivalue')\n        ModelValue = pool.get('test.model_multivalue.value')\n        Target = pool.get('test.model_multivalue.target')\n\n        record = ModelMultiValue()\n        record.save()\n        target = Target(name=\"Test\")\n        target.save()\n        record.set_multivalue('value_many2one', target)\n\n        value, = ModelValue.search([])\n        self.assertEqual(value.record, record)\n        self.assertEqual(value.value_many2one, target)\n\n    @with_transaction()\n    def test_set_multivalue_multiselection(self):\n        \"Test set_multivalue for MultiSelection\"\n        pool = Pool()\n        ModelMultiValue = pool.get('test.model_multivalue')\n        ModelValue = pool.get('test.model_multivalue.value')\n\n        record = ModelMultiValue()\n        record.save()\n        record.set_multivalue('value_multiselection', (\"foo\", \"bar\"))\n\n        value, = ModelValue.search([])\n        self.assertEqual(value.record, record)\n        self.assertEqual(value.value_multiselection, ('bar', 'foo'))\n\n    @with_transaction()\n    def test_set_multivalue_reference(self):\n        \"Test set_multivalue for Reference\"\n        pool = Pool()\n        ModelMultiValue = pool.get('test.model_multivalue')\n        ModelValue = pool.get('test.model_multivalue.value')\n        Target = pool.get('test.model_multivalue.target')\n\n        target = Target(name=\"Target\")\n        target.save()\n        record = ModelMultiValue()\n        record.save()\n        record.set_multivalue('value_reference', target)\n\n        value, = ModelValue.search([])\n        self.assertEqual(value.record, record)\n        self.assertEqual(value.value_reference, target)\n\n    @with_transaction()\n    def test_multivalue_setter(self):\n        \"Test multivalue setter\"\n        pool = Pool()\n        ModelMultiValue = pool.get('test.model_multivalue')\n\n        record, = ModelMultiValue.create([{\n                    'value': \"setter\",\n                    }])\n\n        self.assertEqual(record.get_multivalue('value'), \"setter\")\n\n    @with_transaction()\n    def test_multivalue_getter(self):\n        \"Test multivalue getter\"\n        pool = Pool()\n        ModelMultiValue = pool.get('test.model_multivalue')\n\n        record = ModelMultiValue(value=\"getter\")\n        record.save()\n\n        read, = ModelMultiValue.read([record.id], ['value'])\n        self.assertEqual(read['value'], \"getter\")\n\n    @with_transaction()\n    def test_multivalue_getter_reference(self):\n        \"Test multivalue getter for Reference\"\n        pool = Pool()\n        ModelMultiValue = pool.get('test.model_multivalue')\n        Target = pool.get('test.model_multivalue.target')\n\n        target = Target(name=\"Target\")\n        target.save()\n        record = ModelMultiValue(value_reference=target)\n        record.save()\n\n        read, = ModelMultiValue.read([record.id], ['value_reference'])\n        self.assertEqual(\n            read['value_reference'],\n            'test.model_multivalue.target,%s' % target.id)\n"
  },
  {
    "path": "trytond/tests/test_order.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass SequenceOrderedMixinTestCase(unittest.TestCase):\n    'Test SequenceOrderedMixin'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_order(self):\n        'Test order'\n        pool = Pool()\n        Order = pool.get('test.order.sequence')\n\n        models = []\n        for i in reversed(list(range(1, 4))):\n            models.append(Order(sequence=i))\n        Order.save(models)\n        models.reverse()\n        self.assertListEqual(Order.search([]), models)\n\n        model = models.pop()\n        model.sequence = None\n        model.save()\n        models.insert(0, model)\n\n        self.assertListEqual(Order.search([]), models)\n"
  },
  {
    "path": "trytond/tests/test_path.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond.pool import Pool\nfrom trytond.transaction import Transaction\n\nfrom .test_tree import TreeTestCaseMixin\n\n\nclass PathTestCase(TreeTestCaseMixin, unittest.TestCase):\n    \"Test Path\"\n    model_name = 'test.path'\n\n    def check_tree(self, parent_id=None):\n        pool = Pool()\n        Path = pool.get(self.model_name)\n\n        with Transaction().set_context(active_test=False):\n            children = Path.search([\n                    ('parent', '=', parent_id),\n                    ])\n        for child in children:\n            if child.parent:\n                self.assertEqual(\n                    child.path, '%s%s/' % (child.parent.path, child.id))\n            else:\n                self.assertEqual(child.path, '%s/' % child.id)\n            self.check_tree(child.id)\n\n    def rebuild(self):\n        pool = Pool()\n        Path = pool.get(self.model_name)\n        Path._rebuild_path('parent')\n"
  },
  {
    "path": "trytond/tests/test_protocols.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport datetime\nimport json\nimport unittest\nfrom decimal import Decimal\n\nfrom trytond.protocols.jsonrpc import JSONDecoder, JSONEncoder, JSONRequest\nfrom trytond.protocols.xmlrpc import XMLRequest, client\nfrom trytond.tools.immutabledict import ImmutableDict\n\n\nclass DumpsLoadsMixin:\n\n    def dumps_loads(self, value):\n        raise NotImplementedError\n\n    def test_datetime(self):\n        'Test datetime'\n        self.dumps_loads(datetime.datetime.now())\n\n    def test_date(self):\n        'Test date'\n        self.dumps_loads(datetime.date.today())\n\n    def test_time(self):\n        'Test time'\n        self.dumps_loads(datetime.datetime.now().time())\n\n    def test_timedelta(self):\n        \"Test timedelta\"\n        self.dumps_loads(datetime.timedelta(days=1, seconds=10))\n\n    def test_bytes(self):\n        'Test bytes'\n        self.dumps_loads(bytes(b'foo'))\n        self.dumps_loads(bytearray(b'foo'))\n\n    def test_decimal(self):\n        'Test Decimal'\n        self.dumps_loads(Decimal('3.141592653589793'))\n\n    def test_biginteger(self):\n        \"Test BigInteger\"\n        self.dumps_loads(client.MAXINT + 1)\n\n    def test_immutable_dict(self):\n        \"Test ImmutableDict\"\n        self.dumps_loads(ImmutableDict(foo='bar'))\n\n    def test_none(self):\n        'Test None'\n        self.dumps_loads(None)\n\n\nclass JSONTestCase(DumpsLoadsMixin, unittest.TestCase):\n    'Test JSON'\n\n    def test_json_request(self):\n        req = JSONRequest.from_values(\n            data=b'{\"method\": \"method\", \"params\": [\"foo\", \"bar\"]}',\n            content_type='text/json',\n            )\n        self.assertEqual(req.parsed_data,\n            {'method': 'method', 'params': ['foo', 'bar']})\n        self.assertEqual(req.rpc_method, 'method')\n        self.assertEqual(req.rpc_params, ['foo', 'bar'])\n\n    def dumps_loads(self, value):\n        self.assertEqual(json.loads(\n                json.dumps(value, cls=JSONEncoder),\n                object_hook=JSONDecoder()), value)\n\n\nclass XMLTestCase(DumpsLoadsMixin, unittest.TestCase):\n    'Test XML'\n\n    def test_xml_request(self):\n        req = XMLRequest.from_values(\n            data=b\"\"\"<?xml version='1.0'?>\n            <methodCall>\n                <methodName>method</methodName>\n                <params>\n                    <param>\n                        <value><string>foo</string></value>\n                    </param>\n                    <param>\n                        <value><string>bar</string></value>\n                    </param>\n                </params>\n            </methodCall>\"\"\",\n            content_type='text/xml')\n        self.assertEqual(req.parsed_data, (('foo', 'bar'), 'method'))\n        self.assertEqual(req.rpc_method, 'method')\n        self.assertEqual(req.rpc_params, ('foo', 'bar'))\n\n    def dumps_loads(self, value):\n        s = client.dumps((value,), allow_none=True)\n        result, _ = client.loads(s)\n        result, = result\n        self.assertEqual(value, result)\n\n    def test_decimal_class_load(self):\n        \"Test load Decimal as __class__\"\n        s = \"\"\"<params><param><value>\n            <struct>\n                <member>\n                    <name>__class__</name>\n                    <value><string>Decimal</string></value>\n                </member>\n                <member>\n                    <name>decimal</name>\n                    <value><string>3.141592653589793</string></value>\n                </member>\n            </struct>\n            </value></param></params>\"\"\"\n        result, _ = client.loads(s)\n        result, = result\n        self.assertEqual(result, Decimal('3.141592653589793'))\n"
  },
  {
    "path": "trytond/tests/test_pyson.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport datetime\nimport sys\nimport unittest\nfrom decimal import Decimal\n\nfrom trytond import pyson\n\n\nclass PYSONTestCase(unittest.TestCase):\n    'Test PySON'\n\n    def test_Decimal(self):\n        \"Test PYSONEncoder for Decimal\"\n        self.assertEqual(pyson.PYSONEncoder().encode(Decimal('1.1')), '1.1')\n\n    def test_Eval(self):\n        'Test pyson.Eval'\n        self.assertEqual(pyson.Eval('test').pyson(), {\n            '__class__': 'Eval',\n            'v': 'test',\n            'd': '',\n            })\n        self.assertEqual(pyson.Eval('test', 'foo').pyson(), {\n            '__class__': 'Eval',\n            'v': 'test',\n            'd': 'foo',\n            })\n\n        self.assertEqual(pyson.Eval('test', 'foo').types(), set([str]))\n        self.assertEqual(pyson.Eval('test', 1).types(), set([int]))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Eval('test', 0))\n        self.assertEqual(pyson.PYSONDecoder({'test': 1}).decode(eval), 1)\n        self.assertEqual(pyson.PYSONDecoder().decode(eval), 0)\n\n        self.assertEqual(repr(pyson.Eval('test', 'foo')),\n            \"Eval('test', 'foo')\")\n\n        self.assertIsInstance(~pyson.Eval('test', False), pyson.Not)\n        self.assertIsInstance(pyson.Eval('test', False) & True, pyson.And)\n        self.assertIsInstance(True & pyson.Eval('test', False), pyson.And)\n        self.assertIsInstance(pyson.Eval('test', False) | False, pyson.Or)\n        self.assertIsInstance(False | pyson.Eval('test', False), pyson.Or)\n\n    def test_Not(self):\n        'Test pyson.Not'\n        self.assertEqual(pyson.Not(True).pyson(), {\n            '__class__': 'Not',\n            'v': True,\n            })\n\n        self.assertEqual(pyson.Not(True).types(), set([bool]))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Not(True))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Not(False))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        self.assertEqual(repr(pyson.Not(True)), 'Not(True)')\n\n    def test_Bool(self):\n        'Test pyson.Bool'\n        self.assertEqual(pyson.Bool('test').pyson(), {\n            '__class__': 'Bool',\n            'v': 'test',\n            })\n\n        self.assertEqual(pyson.Bool('test').types(), set([bool]))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Bool(True))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Bool(False))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Bool('test'))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Bool(''))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Bool(1))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Bool(0))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Bool(['test']))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Bool([]))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Bool({'foo': 'bar'}))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Bool({}))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        self.assertEqual(repr(pyson.Bool('test')), \"Bool('test')\")\n\n    def test_And(self):\n        'Test pyson.And'\n        self.assertEqual(pyson.And(True, False).pyson(), {\n            '__class__': 'And',\n            's': [True, False],\n            })\n\n        if not sys.flags.optimize:\n            self.assertRaises(AssertionError, pyson.And, True)\n            self.assertRaises(AssertionError, pyson.And)\n\n        self.assertEqual(pyson.And(True, False).types(), set([bool]))\n\n        eval = pyson.PYSONEncoder().encode(pyson.And(True, True))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.And(True, True, True))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.And(True, False))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.And(False, True))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.And(False, False))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.And(False, False, False))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.And(True, False, False))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.And(False, True, False))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.And(False, False, True))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        self.assertEqual(repr(pyson.And(False, True, True)),\n            'And(False, True, True)')\n\n    def test_Or(self):\n        'Test pyson.Or'\n        self.assertEqual(pyson.Or(True, False).pyson(), {\n            '__class__': 'Or',\n            's': [True, False],\n            })\n\n        if not sys.flags.optimize:\n            self.assertRaises(AssertionError, pyson.Or, True)\n            self.assertRaises(AssertionError, pyson.Or)\n\n        self.assertEqual(pyson.Or(True, False).types(), set([bool]))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Or(True, True))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Or(True, True, True))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Or(True, False))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Or(False, True))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Or(False, False))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Or(False, False, False))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Or(True, False, False))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Or(False, True, False))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Or(False, False, True))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        self.assertEqual(repr(pyson.Or(False, True, True)),\n            'Or(False, True, True)')\n\n    def test_Equal(self):\n        'Test pyson.Equal'\n        self.assertEqual(pyson.Equal('test', 'test').pyson(), {\n            '__class__': 'Equal',\n            's1': 'test',\n            's2': 'test',\n            })\n\n        if not sys.flags.optimize:\n            self.assertRaises(AssertionError, pyson.Equal, 'test', True)\n\n        self.assertEqual(pyson.Equal('test', 'test').types(), set([bool]))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Equal('test', 'test'))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Equal('foo', 'bar'))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        self.assertEqual(repr(pyson.Equal('foo', 'bar')),\n            \"Equal('foo', 'bar')\")\n\n    def test_Greater(self):\n        'Test pyson.Greater'\n        self.assertEqual(pyson.Greater(1, 0).pyson(), {\n            '__class__': 'Greater',\n            's1': 1,\n            's2': 0,\n            'e': False,\n            })\n\n        if not sys.flags.optimize:\n            self.assertRaises(AssertionError, pyson.Greater, 'test', 0)\n            self.assertRaises(AssertionError, pyson.Greater, 1, 'test')\n            self.assertRaises(\n                AssertionError, pyson.Greater, pyson.Eval('foo'), 0)\n            self.assertRaises(AssertionError, pyson.Greater,\n                'test', pyson.DateTime())\n            self.assertRaises(AssertionError, pyson.Greater,\n                pyson.DateTime(), 'test')\n\n        self.assertEqual(pyson.Greater(1, 0).types(), set([bool]))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Greater(1, 0))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Greater(0, 1))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Greater(1, 0, True))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Greater(0, 1, True))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Greater(1, 1))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Greater(1, 1, True))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Greater(None, 1))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Greater(1, None))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        self.assertEqual(repr(pyson.Greater(1, 0)), 'Greater(1, 0, False)')\n\n        eval = pyson.PYSONEncoder().encode(pyson.Greater(\n                pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),\n                datetime.date(2020, 1, 2)))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Greater(\n                pyson.DateTime(2020, 1, 1, 0, 0, 0, 1),\n                datetime.date(2020, 1, 1)))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Greater(\n                pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),\n                datetime.date(2020, 1, 1), True))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Greater(\n                pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),\n                pyson.DateTime(2020, 1, 1, 0, 0, 0, 0)))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Greater(\n                pyson.Date(2020, 1, 1),\n                datetime.date(2020, 1, 1)))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Greater(\n                pyson.Date(2020, 1, 1),\n                pyson.DateTime(2020, 1, 1, 0, 0, 0, 1)))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Greater(\n                pyson.DateTime(2020, 1, 1, 0, 0, 1),\n                pyson.Date(2020, 1, 1), True))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Greater(\n                pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),\n                pyson.Date(2020, 1, 1), True))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Greater(\n                pyson.DateTime(2020, 1, 1, 0, 0, 0, 0), 90000))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(\n            pyson.Greater(pyson.Eval('i', 0), 0))\n        self.assertTrue(pyson.PYSONDecoder({'i': 1}).decode(eval))\n\n    def test_Less(self):\n        'Test pyson.Less'\n        self.assertEqual(pyson.Less(0, 1).pyson(), {\n            '__class__': 'Less',\n            's1': 0,\n            's2': 1,\n            'e': False,\n            })\n\n        if not sys.flags.optimize:\n            self.assertRaises(AssertionError, pyson.Less, 'test', 1)\n            self.assertRaises(AssertionError, pyson.Less, 0, 'test')\n            self.assertRaises(AssertionError, pyson.Less,\n                'test', pyson.DateTime())\n            self.assertRaises(AssertionError, pyson.Less,\n                pyson.DateTime(), 'test')\n\n        self.assertEqual(pyson.Less(0, 1).types(), set([bool]))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Less(0, 1))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Less(1, 0))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Less(0, 1, True))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Less(1, 0, True))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Less(1, 1))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Less(1, 1, True))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Less(None, 1))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Less(1, None))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        self.assertEqual(repr(pyson.Less(0, 1)), 'Less(0, 1, False)')\n\n        eval = pyson.PYSONEncoder().encode(pyson.Less(\n                pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),\n                datetime.date(2020, 1, 1)))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Less(\n                pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),\n                datetime.date(2020, 1, 2), True))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Less(\n                pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),\n                pyson.DateTime(2020, 1, 1, 0, 0, 0, 0)))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Less(\n                pyson.Date(2020, 1, 1),\n                datetime.date(2020, 1, 2)))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Less(\n                pyson.Date(2020, 1, 1),\n                pyson.DateTime(2020, 1, 1, 0, 0, 0, 1)))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Less(\n                pyson.DateTime(2020, 1, 1, 0, 0, 0, 0),\n                pyson.Date(2020, 1, 1), True))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Less(\n                pyson.DateTime(2020, 1, 1, 0, 0, 0, 0), 90000))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n    def test_If(self):\n        'Test pyson.If'\n        self.assertEqual(pyson.If(True, 'foo', 'bar').pyson(), {\n            '__class__': 'If',\n            'c': True,\n            't': 'foo',\n            'e': 'bar',\n            })\n\n        self.assertEqual(pyson.If(True, 'foo', 'bar').types(),\n            set([str]))\n        self.assertEqual(pyson.If(True, False, True).types(), set([bool]))\n        self.assertEqual(\n            pyson.If(True, 'foo', False).types(), set([bool, str]))\n\n        eval = pyson.PYSONEncoder().encode(pyson.If(True, 'foo', 'bar'))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval), 'foo')\n\n        eval = pyson.PYSONEncoder().encode(pyson.If(False, 'foo', 'bar'))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval), 'bar')\n\n        self.assertEqual(repr(pyson.If(True, 'foo', 'bar')),\n            \"If(True, 'foo', 'bar')\")\n\n    def test_Get(self):\n        'Test pyson.Get'\n        self.assertEqual(pyson.Get({'foo': 'bar'}, 'foo', 'default').pyson(), {\n            '__class__': 'Get',\n            'v': {'foo': 'bar'},\n            'k': 'foo',\n            'd': 'default',\n            })\n\n        if not sys.flags.optimize:\n            self.assertRaises(\n                AssertionError, pyson.Get, 'test', 'foo', 'default')\n            self.assertRaises(AssertionError, pyson.Get, {}, 1, 'default')\n\n        self.assertEqual(pyson.Get({}, 'foo', 'default').types(),\n            set([str]))\n        self.assertEqual(pyson.Get({}, 'foo', True).types(), set([bool]))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Get(\n            {'foo': 'bar'}, 'foo', 'default'))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval), 'bar')\n\n        eval = pyson.PYSONEncoder().encode(pyson.Get(\n            {'foo': 'bar'}, 'test', 'default'))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval), 'default')\n\n        eval = pyson.PYSONEncoder().encode(pyson.Get(\n            {}, 'foo', 'default'))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval), 'default')\n\n        self.assertEqual(repr(pyson.Get({'foo': 'bar'}, 'foo', 'default')),\n            \"Get({'foo': 'bar'}, 'foo', 'default')\")\n\n    def test_In(self):\n        'Test pyson.In'\n        self.assertEqual(pyson.In('foo', {'foo': 'bar'}).pyson(), {\n            '__class__': 'In',\n            'k': 'foo',\n            'v': {'foo': 'bar'},\n            })\n\n        if not sys.flags.optimize:\n            self.assertRaises(AssertionError, pyson.In, object(), {})\n            self.assertRaises(AssertionError, pyson.In, 'test', 'foo')\n\n        self.assertEqual(pyson.In('foo', {}).types(), set([bool]))\n\n        eval = pyson.PYSONEncoder().encode(pyson.In('foo', {'foo': 'bar'}))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.In(\n            pyson.Eval('test', 'foo'), {'foo': 'bar'}))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.In('1', {1: 'bar'}))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.In('test', {'foo': 'bar'}))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.In(\n            pyson.Eval('foo', 'test'), {'foo': 'bar'}))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.In('1', {2: 'bar'}))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.In('test', {}))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.In('foo', ['foo']))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.In(1, [1]))\n        self.assertTrue(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.In('test', ['foo']))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.In(1, [2]))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(pyson.In('test', []))\n        self.assertFalse(pyson.PYSONDecoder().decode(eval))\n\n        eval = pyson.PYSONEncoder().encode(\n            pyson.In('test', pyson.Eval('foo', [])))\n        self.assertFalse(pyson.PYSONDecoder({'foo': None}).decode(eval))\n\n        self.assertEqual(repr(pyson.In('foo', ['foo', 'bar'])),\n            \"In('foo', ['foo', 'bar'])\")\n\n    def test_Date(self):\n        'Test pyson.Date'\n        self.assertEqual(pyson.Date(2010, 1, 12, -1, 12, -7).pyson(), {\n            '__class__': 'Date',\n            'y': 2010,\n            'M': 1,\n            'd': 12,\n            'dy': -1,\n            'dM': 12,\n            'dd': -7,\n            'start': None,\n            })\n\n        if not sys.flags.optimize:\n            self.assertRaises(\n                AssertionError, pyson.Date, 'test', 1, 12, -1, 12, -7)\n            self.assertRaises(\n                AssertionError, pyson.Date, 2010, 'test', 12, -1, 12, -7)\n            self.assertRaises(\n                AssertionError, pyson.Date, 2010, 1, 'test', -1, 12, -7)\n            self.assertRaises(\n                AssertionError, pyson.Date, 2010, 1, 12, 'test', 12, -7)\n            self.assertRaises(\n                AssertionError, pyson.Date, 2010, 1, 12, -1, 'test', -7)\n            self.assertRaises(\n                AssertionError, pyson.Date, 2010, 1, 12, -1, 12, 'test')\n\n        self.assertEqual(pyson.Date(2010, 1, 12, -1, 12, -7).types(),\n            set([datetime.date]))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Date())\n        self.assertEqual(pyson.PYSONDecoder().decode(eval),\n            datetime.date.today())\n\n        eval = pyson.PYSONEncoder().encode(pyson.Date(2010, 1, 12))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval),\n            datetime.date(2010, 1, 12))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Date(2010, 1, 12, -1))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval),\n            datetime.date(2009, 1, 12))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Date(2010, 1, 12, 0, 12))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval),\n            datetime.date(2011, 1, 12))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Date(2010, 1, 12, 0, 0, -7))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval),\n            datetime.date(2010, 1, 5))\n\n        eval = pyson.PYSONEncoder().encode(datetime.date(2010, 2, 22))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval),\n            datetime.date(2010, 2, 22))\n\n        self.assertEqual(repr(pyson.Date(2010, 1, 12, -1, 12, -7)),\n            'Date(2010, 1, 12, -1, 12, -7, None)')\n\n    def test_Date_start(self):\n        \"Test Date with start\"\n        eval = pyson.PYSONEncoder().encode(pyson.Date(\n                start=pyson.Eval('date')))\n\n        date = datetime.date(2000, 1, 1)\n        self.assertEqual(pyson.PYSONDecoder(\n                {'date': date}).decode(eval), date)\n\n    def test_Date_start_datetime(self):\n        \"Test Date with start as datetime\"\n        eval = pyson.PYSONEncoder().encode(pyson.Date(\n                start=pyson.Eval('datetime')))\n\n        datetime_ = datetime.datetime(2000, 1, 1, 12, 00)\n        self.assertEqual(pyson.PYSONDecoder(\n                {'datetime': datetime_}).decode(eval), datetime_.date())\n\n    def test_Date_start_invalid(self):\n        \"Test Date with invalid start\"\n        eval = pyson.PYSONEncoder().encode(pyson.Date(\n                start=pyson.Eval('foo')))\n\n        self.assertEqual(pyson.PYSONDecoder(\n                {'foo': 'bar'}).decode(eval), datetime.date.today())\n\n    def test_DateTime(self):\n        'Test pyson.DateTime'\n        self.assertEqual(pyson.DateTime(2010, 1, 12, 10, 30, 20, 0,\n            -1, 12, -7, 2, 15, 30, 1).pyson(), {\n                '__class__': 'DateTime',\n                'y': 2010,\n                'M': 1,\n                'd': 12,\n                'h': 10,\n                'm': 30,\n                's': 20,\n                'ms': 0,\n                'dy': -1,\n                'dM': 12,\n                'dd': -7,\n                'dh': 2,\n                'dm': 15,\n                'ds': 30,\n                'dms': 1,\n                'start': None,\n                })\n\n        if not sys.flags.optimize:\n            self.assertRaises(\n                AssertionError, pyson.DateTime,\n                'test', 1, 12, 10, 30, 20, 0, -1, 12, -7, 2, 15, 30, 1)\n            self.assertRaises(\n                AssertionError, pyson.DateTime,\n                2010, 'test', 12, 10, 30, 20, 0, -1, 12, -7, 2, 15, 30, 1)\n            self.assertRaises(\n                AssertionError, pyson.DateTime,\n                2010, 1, 'test', 10, 30, 20, 0, -1, 12, -7, 2, 15, 30, 1)\n            self.assertRaises(\n                AssertionError, pyson.DateTime,\n                2010, 1, 12, 'test', 30, 20, 0, -1, 12, -7, 2, 15, 30, 1)\n            self.assertRaises(\n                AssertionError, pyson.DateTime,\n                2010, 1, 12, 10, 'test', 20, 0, -1, 12, -7, 2, 15, 30, 1)\n            self.assertRaises(\n                AssertionError, pyson.DateTime,\n                2010, 1, 12, 10, 30, 'test', 0, -1, 12, -7, 2, 15, 30, 1)\n            self.assertRaises(\n                AssertionError, pyson.DateTime,\n                2010, 1, 12, 10, 30, 20, 'test', -1, 12, -7, 2, 15, 30, 1)\n            self.assertRaises(\n                AssertionError, pyson.DateTime,\n                2010, 1, 12, 10, 30, 20, 0, 'test', 12, -7, 2, 15, 30, 1)\n            self.assertRaises(\n                AssertionError, pyson.DateTime,\n                2010, 1, 12, 10, 30, 20, 0, -1, 'test', -7, 2, 15, 30, 1)\n            self.assertRaises(\n                AssertionError, pyson.DateTime,\n                2010, 1, 12, 10, 30, 20, 0, -1, 12, 'test', 2, 15, 30, 1)\n            self.assertRaises(\n                AssertionError, pyson.DateTime,\n                2010, 1, 12, 10, 30, 20, 0, -1, 12, -7, 'test', 15, 30, 1)\n            self.assertRaises(\n                AssertionError, pyson.DateTime,\n                2010, 1, 12, 10, 30, 20, 0, -1, 12, -7, 2, 'test', 30, 1)\n            self.assertRaises(\n                AssertionError, pyson.DateTime,\n                2010, 1, 12, 10, 30, 20, 0, -1, 12, -7, 2, 15, 'test', 1)\n            self.assertRaises(\n                AssertionError, pyson.DateTime,\n                2010, 1, 12, 10, 30, 20, 0, -1, 12, -7, 2, 15, 30, 'test')\n\n        self.assertEqual(pyson.DateTime(2010, 1, 12, 10, 30, 20, 0,\n            -1, 12, -7, 2, 15, 30, 1).types(), set([datetime.datetime]))\n\n        eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,\n            10, 30, 20, 0))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval),\n            datetime.datetime(2010, 1, 12, 10, 30, 20, 0))\n\n        eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,\n            10, 30, 20, 0, -1))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval),\n            datetime.datetime(2009, 1, 12, 10, 30, 20, 0))\n\n        eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,\n            10, 30, 20, 0, 0, 12))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval),\n            datetime.datetime(2011, 1, 12, 10, 30, 20, 0))\n\n        eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,\n            10, 30, 20, 0, 0, 0, -7))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval),\n            datetime.datetime(2010, 1, 5, 10, 30, 20, 0))\n\n        eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,\n            10, 30, 20, 0, 0, 0, 0, 12))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval),\n            datetime.datetime(2010, 1, 12, 22, 30, 20, 0))\n\n        eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,\n            10, 30, 20, 0, 0, 0, 0, 0, -30))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval),\n            datetime.datetime(2010, 1, 12, 10, 0, 20, 0))\n\n        eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,\n            10, 30, 20, 0, 0, 0, 0, 0, 0, 30))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval),\n            datetime.datetime(2010, 1, 12, 10, 30, 50, 0))\n\n        eval = pyson.PYSONEncoder().encode(pyson.DateTime(2010, 1, 12,\n            10, 30, 20, 0, 0, 0, 0, 0, 0, 0, 200))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval),\n            datetime.datetime(2010, 1, 12, 10, 30, 20, 200))\n\n        eval = pyson.PYSONEncoder().encode(datetime.datetime(\n            2010, 2, 22, 10, 30, 20, 200))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval),\n            datetime.datetime(2010, 2, 22, 10, 30, 20, 200))\n\n        self.assertEqual(repr(pyson.DateTime(2010, 1, 12, 10, 30, 20, 0,\n                    -1, 12, -7, 2, 15, 30, 1)),\n            ('DateTime(2010, 1, 12, 10, 30, 20, 0, '\n                '-1, 12, -7, 2, 15, 30, 1, None)'))\n\n    def test_DateTime_start(self):\n        \"Test DateTime with start\"\n        eval = pyson.PYSONEncoder().encode(pyson.DateTime(\n                start=pyson.Eval('datetime')))\n\n        datetime_ = datetime.datetime(2000, 1, 1, 12, 0)\n        self.assertEqual(pyson.PYSONDecoder(\n                {'datetime': datetime_}).decode(eval), datetime_)\n\n    def test_DateTime_start_datetime(self):\n        \"Test DateTime with start as date\"\n        eval = pyson.PYSONEncoder().encode(pyson.DateTime(\n                start=pyson.Eval('date')))\n\n        date = datetime.date(2000, 1, 1)\n        self.assertEqual(pyson.PYSONDecoder(\n                {'date': date}).decode(eval),\n            datetime.datetime(2000, 1, 1, 0, 0))\n\n    def test_DateTime_start_invalid(self):\n        \"Test DateTime with invalid start\"\n        eval = pyson.PYSONEncoder().encode(pyson.DateTime(\n                start=pyson.Eval('foo')))\n\n        self.assertIsInstance(pyson.PYSONDecoder(\n                {'foo': 'bar'}).decode(eval), datetime.datetime)\n\n    def test_Len(self):\n        'Test pyson.Len'\n        self.assertEqual(pyson.Len([1, 2, 3]).pyson(), {\n                '__class__': 'Len',\n                'v': [1, 2, 3],\n                })\n\n        if not sys.flags.optimize:\n            self.assertRaises(AssertionError, pyson.Len, object())\n\n        self.assertEqual(pyson.Len([1, 2, 3]).types(), set([int]))\n\n        eval = pyson.PYSONEncoder().encode(pyson.Len([1, 2, 3]))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval), 3)\n\n        eval = pyson.PYSONEncoder().encode(pyson.Len({1: 2, 3: 4}))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval), 2)\n\n        eval = pyson.PYSONEncoder().encode(pyson.Len('foo bar'))\n        self.assertEqual(pyson.PYSONDecoder().decode(eval), 7)\n\n        self.assertEqual(repr(pyson.Len([1, 2, 3])), 'Len([1, 2, 3])')\n\n    def test_TimeDelta_pyson(self):\n        \"Test pyson.TimeDelta.pyson\"\n        self.assertEqual(pyson.TimeDelta(1, 2, 3).pyson(), {\n                '__class__': 'TimeDelta',\n                'd': 1,\n                's': 2,\n                'm': 3,\n                })\n\n    def test_TimeDelta_types(self):\n        \"Test pyson.TimeDelta.types\"\n        self.assertEqual(\n            pyson.TimeDelta(seconds=10).types(), {datetime.timedelta})\n\n    @unittest.skipIf(sys.flags.optimize, \"assert removed by optimization\")\n    def test_TimeDelta_invalid_type(self):\n        \"Test pyson.TimeDelta invalid type\"\n        with self.assertRaises(AssertionError):\n            pyson.TimeDelta('foo')\n\n    def test_TimeDelta_eval(self):\n        \"Test pyson.TimeDelta.eval\"\n        eval = pyson.PYSONEncoder().encode(pyson.TimeDelta(1, 2, 3))\n\n        self.assertEqual(\n            pyson.PYSONDecoder().decode(eval), datetime.timedelta(1, 2, 3))\n\n    def test_TimeDelta_repr(self):\n        \"Test pyson.TimeDelta.repr\"\n        self.assertEqual(\n            repr(pyson.TimeDelta(1, 2, 3)), 'TimeDelta(1, 2, 3)')\n\n    def test_Composite(self):\n        'Test Composite'\n        expr = pyson.If(pyson.Not(\n                pyson.In('company', pyson.Eval('context', {}))), '=', '!=')\n        eval = pyson.PYSONEncoder().encode(['id', expr,\n            pyson.Get(pyson.Eval('context', {}), 'company', -1)])\n        self.assertEqual(pyson.PYSONDecoder({'context': {'company': 1}}\n            ).decode(eval), ['id', '!=', 1])\n        self.assertEqual(pyson.PYSONDecoder({'context': {}}\n            ).decode(eval), ['id', '=', -1])\n\n        self.assertEqual(repr(expr),\n            \"If(Not(In('company', Eval('context', {}))), '=', '!=')\")\n\n    def test_noeval(self):\n        decoder = pyson.PYSONDecoder(noeval=True)\n        encoder = pyson.PYSONEncoder()\n\n        for instance in [\n                pyson.Eval('test', 0),\n                pyson.Not(True),\n                pyson.Bool('test'),\n                pyson.And(True, False, True),\n                pyson.Or(False, True, True),\n                pyson.Equal('foo', 'bar'),\n                pyson.Greater(1, 0),\n                pyson.Less(0, 1),\n                pyson.If(True, 'foo', 'bar'),\n                pyson.Get({'foo': 'bar'}, 'foo', 'default'),\n                pyson.In('foo', ['foo', 'bar']),\n                pyson.Date(),\n                pyson.DateTime(),\n                pyson.Len([1, 2, 3]),\n                ]:\n            self.assertEqual(decoder.decode(encoder.encode(instance)).pyson(),\n                instance.pyson())\n\n    def test_Eval_dot_notation(self):\n        'Test pyson.Eval with dot notation'\n\n        eval = pyson.PYSONEncoder().encode(pyson.Eval('foo.bar', 0))\n\n        for ctx, result in [\n                ({'foo': {'bar': 1}}, 1),\n                ({'foo': {'foo': 1}}, 0),\n                ({'bar': {'bar': 1}}, 0),\n                ({}, 0),\n                ]:\n            self.assertEqual(pyson.PYSONDecoder(ctx).decode(eval), result)\n\n    def test_Eval_dot_notation_nested(self):\n        'Test pyson.Eval with dot notation with nested dots'\n\n        eval = pyson.PYSONEncoder().encode(pyson.Eval('foo.bar.test', 0))\n\n        for ctx, result in [\n                ({'foo': {'bar': {'test': 1}}}, 1),\n                ({'foo': {'foo': 1}}, 0),\n                ({'bar': {'bar': 1}}, 0),\n                ({}, 0),\n                ]:\n            self.assertEqual(pyson.PYSONDecoder(ctx).decode(eval), result)\n\n    def test_Eval_dot_notation_in_context(self):\n        \"Test pyson.Eval with dot notation in context\"\n\n        eval = pyson.PYSONEncoder().encode(pyson.Eval('foo.bar', 0))\n        ctx = {\n            'foo.bar': 1,\n            'foo': {\n                'bar': 0,\n                },\n            }\n\n        self.assertEqual(pyson.PYSONDecoder(ctx).decode(eval), 1)\n\n    def test_eval_true(self):\n        \"Test PYSON.eval JS true\"\n        self.assertEqual(eval('true', pyson.CONTEXT), True)\n\n    def test_eval_false(self):\n        \"Test PYSON.eval JS false\"\n        self.assertEqual(eval('false', pyson.CONTEXT), False)\n"
  },
  {
    "path": "trytond/tests/test_report.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport unittest\n\nfrom trytond.report.report import Report\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass ReportTestCase(unittest.TestCase):\n    'Test Report'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_format_datetime(self):\n        \"Test format datetime\"\n        self.assertEqual(Report.format_datetime(\n                datetime.datetime(2020, 7, 8, 13, 30, 00)),\n            '07/08/2020 13:30:00')\n\n    @with_transaction()\n    def test_format_datetime_custom_format(self):\n        \"Test format datetime custom format\"\n        self.assertEqual(Report.format_datetime(\n                datetime.datetime(2020, 7, 8, 13, 30, 00),\n                format='%d %b %Y %I:%M %p'),\n            \"08 Jul 2020 01:30 PM\"),\n\n\ndef create_test_format_timedelta(i, in_, out):\n    @with_transaction()\n    def test(self):\n        self.assertEqual(Report.format_timedelta(in_), out)\n    test.__name__ = 'test_format_timedelta_%d' % i\n    test.__doc__ = \"test format_timedelta of %s\" % in_\n    return test\n\n\nfor i, (in_, out) in enumerate([\n            (None, ''),\n            (datetime.timedelta(), '00:00'),\n            (datetime.timedelta(days=3, hours=5, minutes=30), '3d 05:30'),\n            (datetime.timedelta(weeks=48), '11M 6d'),\n            (datetime.timedelta(weeks=50), '11M 2w 6d'),\n            (datetime.timedelta(weeks=52), '12M 4d'),\n            (datetime.timedelta(days=360), '12M'),\n            (datetime.timedelta(days=364), '12M 4d'),\n            (datetime.timedelta(days=365), '1Y'),\n            (datetime.timedelta(days=366), '1Y 1d'),\n            (datetime.timedelta(hours=2, minutes=5, seconds=10), '02:05:10'),\n            (datetime.timedelta(minutes=15, microseconds=42),\n                '00:15:00.000042'),\n            (datetime.timedelta(days=1, microseconds=42), '1d .000042'),\n            (datetime.timedelta(seconds=-1), '-00:00:01'),\n            (datetime.timedelta(days=-1, hours=-5, minutes=-30), '-1d 05:30'),\n            ]):\n    test_method = create_test_format_timedelta(i, in_, out)\n    setattr(ReportTestCase, test_method.__name__, test_method)\n"
  },
  {
    "path": "trytond/tests/test_res.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\ntry:\n    import PIL\nexcept ImportError:\n    PIL = None\n\nfrom trytond.pool import Pool\nfrom trytond.transaction import Transaction\n\nfrom .test_tryton import ModuleTestCase, with_transaction\n\n\nclass ResTestCase(ModuleTestCase):\n    'Test res module'\n    module = 'res'\n\n    @unittest.skipUnless(PIL, \"Avatars are not generated without PIL\")\n    @with_transaction()\n    def test_user_avatar(self):\n        pool = Pool()\n        User = pool.get('res.user')\n\n        user = User(login=\"avatar\")\n        user.save()\n\n        self.assertEqual(len(user.avatars), 1)\n        self.assertIsNotNone(user.avatar)\n        self.assertRegex(user.avatar_url, r'/avatar/.*/([0-9a-fA-F]{12})')\n\n    @with_transaction()\n    def test_user_warning(self):\n        \"Check user warning\"\n        pool = Pool()\n        Warning_ = pool.get('res.user.warning')\n\n        self.assertTrue(Warning_.check('test'))\n\n    @with_transaction()\n    def test_user_warning_ignored(self):\n        \"Check ignored user warning\"\n        pool = Pool()\n        Warning_ = pool.get('res.user.warning')\n\n        user_id = Transaction().user\n        Warning_.create([{\n                    'user': user_id,\n                    'name': 'test',\n                    }])\n\n        self.assertFalse(Warning_.check('test'))\n        self.assertFalse(Warning_.search([]))\n\n    @with_transaction()\n    def test_user_warning_always_ignored(self):\n        \"Check always ignored user warning\"\n        pool = Pool()\n        Warning_ = pool.get('res.user.warning')\n\n        user_id = Transaction().user\n        Warning_.create([{\n                    'user': user_id,\n                    'name': 'test',\n                    'always': True,\n                    }])\n\n        self.assertFalse(Warning_.check('test'))\n        self.assertTrue(Warning_.search([]))\n\n    @with_transaction()\n    def test_user_warning_reentrant(self):\n        \"Check re-entrant user warning\"\n        pool = Pool()\n        Warning_ = pool.get('res.user.warning')\n\n        user_id = Transaction().user\n        Warning_.create([{\n                    'user': user_id,\n                    'name': 'test',\n                    }])\n\n        self.assertFalse(Warning_.check('test'))\n        self.assertFalse(Warning_.check('test'))\n\n\ndel ModuleTestCase\n"
  },
  {
    "path": "trytond/tests/test_resource.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\n\nclass ResourceTestCase(unittest.TestCase):\n    \"Test Resource\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_resources_copied(self):\n        \"Test resources are copied\"\n        pool = Pool()\n        Resource = pool.get('test.resource')\n        Other = pool.get('test.resource.other')\n        Note = pool.get('ir.note')\n\n        record = Resource()\n        record.save()\n        note = Note(resource=record, copy_to_resources=[Other.__name__])\n        note.save()\n        other = Other()\n        other.save()\n        copies = record.copy_resources_to(other)\n\n        other_notes = Note.search([('resource', '=', str(other))])\n        self.assertTrue(other_notes)\n        self.assertEqual(len(other_notes), 1)\n        self.assertEqual(other_notes, copies)\n\n    @with_transaction()\n    def test_resources_not_copied(self):\n        \"Test resources are not copied\"\n        pool = Pool()\n        Resource = pool.get('test.resource')\n        Other = pool.get('test.resource.other')\n        Note = pool.get('ir.note')\n\n        record = Resource()\n        record.save()\n        note = Note(resource=record)\n        note.save()\n        other = Other()\n        other.save()\n        copies = record.copy_resources_to(other)\n\n        other_notes = Note.search([('resource', '=', str(other))])\n        self.assertFalse(other_notes)\n        self.assertFalse(copies)\n\n    @with_transaction()\n    def test_note_write(self):\n        \"Test note write behaviour\"\n        pool = Pool()\n        Note = pool.get('ir.note')\n        Resource = pool.get('test.resource')\n        User = pool.get('res.user')\n\n        user = User(login='test')\n        user.save()\n        record = Resource()\n        record.save()\n        note = Note(resource=record, message=\"Message\")\n        note.save()\n        write_date = note.write_date\n\n        with Transaction().set_user(user.id):\n            user_note = Note(note.id)\n            user_note.unread = False\n            user_note.save()\n\n        note = Note(note.id)\n        self.assertEqual(user_note.write_date, write_date)\n"
  },
  {
    "path": "trytond/tests/test_routes.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of this\n# repository contains the full copyright notices and license terms.\n\nimport base64\nimport json\nimport unittest\n\nfrom werkzeug.test import Client\nfrom werkzeug.wrappers import Response\n\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import DB_NAME, activate_module, drop_db\nfrom trytond.transaction import Transaction\nfrom trytond.wsgi import app\n\n\nclass RoutesTestCase(unittest.TestCase):\n\n    @classmethod\n    def setUpClass(cls):\n        drop_db()\n        activate_module(['ir', 'res'], 'fr')\n        pool = Pool(DB_NAME)\n        with Transaction().start(DB_NAME, 0):\n            User = pool.get('res.user')\n            admin, = User.search([('login', '=', 'admin')])\n            admin.password = 'password'\n            admin.save()\n\n    @classmethod\n    def tearDownClass(cls):\n        super().tearDownClass()\n        drop_db()\n\n    @property\n    def auth_headers(self):\n        return {\n            'Authorization': b'Basic ' + base64.b64encode(b'admin:password'),\n            }\n\n    def data_url(self, model):\n        return '/%(database)s/data/%(model)s' % {\n            'database': DB_NAME,\n            'model': model,\n            }\n\n    def test_data_no_field(self):\n        \"Test GET data without field\"\n        c = Client(app, Response)\n\n        response = c.get(self.data_url('res.user'), headers=self.auth_headers)\n\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(response.data, b'\\r\\n\\r\\n')\n\n    def test_data_one_field(self):\n        \"Test GET data with one field\"\n        c = Client(app, Response)\n\n        response = c.get(\n            self.data_url('res.user'), headers=self.auth_headers,\n            query_string=[('f', 'name')])\n\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(response.data, b'Nom\\r\\nAdministrator\\r\\n')\n\n    def test_data_multiple_fields(self):\n        \"Test GET data with multiple fields\"\n        c = Client(app, Response)\n\n        response = c.get(\n            self.data_url('res.user'), headers=self.auth_headers,\n            query_string=[('f', 'name'), ('f', 'login')])\n\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(\n            response.data, b'Nom,Identifiant\\r\\nAdministrator,admin\\r\\n')\n\n    def test_data_language(self):\n        \"Test GET data with language\"\n        c = Client(app, Response)\n\n        response = c.get(\n            self.data_url('ir.lang'), headers=self.auth_headers,\n            query_string=[\n                ('f', 'name'),\n                ('l', 'fr'),\n                ('d', json.dumps([('code', '=', 'fr')])),\n                ])\n\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(response.data, 'Nom\\r\\nFrançais\\r\\n'.encode('utf-8'))\n\n    def test_data_size(self):\n        \"Test GET data with size limit\"\n        c = Client(app, Response)\n\n        response = c.get(\n            self.data_url('ir.lang'), headers=self.auth_headers,\n            query_string=[\n                ('f', 'name'),\n                ('s', 5),\n                ])\n\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(len(response.data.splitlines()), 5 + 1)\n\n    def test_data_page(self):\n        \"Test GET data with page\"\n        c = Client(app, Response)\n\n        response0 = c.get(\n            self.data_url('ir.lang'), headers=self.auth_headers,\n            query_string=[\n                ('f', 'name'),\n                ('s', 5),\n                ('p', 0)\n                ])\n        response1 = c.get(\n            self.data_url('ir.lang'), headers=self.auth_headers,\n            query_string=[\n                ('f', 'name'),\n                ('s', 5),\n                ('p', 1)\n                ])\n\n        self.assertEqual(response0.status_code, 200)\n        self.assertEqual(response1.status_code, 200)\n        self.assertNotEqual(response0.data, response1.data)\n\n    def test_data_encoding(self):\n        \"Test GET data with encoding\"\n        c = Client(app, Response)\n\n        response = c.get(\n            self.data_url('ir.lang'), headers=self.auth_headers,\n            query_string=[\n                ('f', 'name'),\n                ('l', 'fr'),\n                ('d', json.dumps([('code', '=', 'fr')])),\n                ('enc', 'latin1'),\n                ])\n\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(\n            response.data, 'Nom\\r\\nFrançais\\r\\n'.encode('latin1'))\n\n    def test_data_delimiter(self):\n        \"Test GET data with delimiter\"\n        c = Client(app, Response)\n\n        response = c.get(\n            self.data_url('res.user'), headers=self.auth_headers,\n            query_string=[('f', 'name'), ('f', 'login'), ('dl', '|')])\n\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(\n            response.data, b'Nom|Identifiant\\r\\nAdministrator|admin\\r\\n')\n\n    def test_data_quotechar(self):\n        \"Test GET data with quotechar\"\n        c = Client(app, Response)\n\n        response = c.get(\n            self.data_url('res.user'), headers=self.auth_headers,\n            query_string=[\n                ('f', 'name'), ('f', 'login'), ('dl', 'n'), ('qc', '*')])\n\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(\n            response.data,\n            b'Nomn*Identifiant*\\r\\n*Administrator*n*admin*\\r\\n')\n\n    def test_data_no_header(self):\n        \"Test GET data without header\"\n        c = Client(app, Response)\n\n        response = c.get(\n            self.data_url('res.user'), headers=self.auth_headers,\n            query_string=[('f', 'name'), ('h', 0)])\n\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(response.data, b'Administrator\\r\\n')\n\n    def test_data_locale_format(self):\n        \"Test GET data in locale format\"\n        c = Client(app, Response)\n\n        response_std = c.get(\n            self.data_url('res.user'), headers=self.auth_headers,\n            query_string=[('f', 'create_date')])\n        response_locale = c.get(\n            self.data_url('res.user'), headers=self.auth_headers,\n            query_string=[('f', 'create_date'), ('loc', 1)])\n\n        self.assertEqual(response_std.status_code, 200)\n        self.assertEqual(response_locale.status_code, 200)\n        self.assertNotEqual(response_std.data, response_locale.data)\n"
  },
  {
    "path": "trytond/tests/test_rpc.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\nfrom unittest.mock import DEFAULT, Mock, call\n\nfrom trytond.rpc import RPC\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\n\nclass RPCTestCase(unittest.TestCase):\n    \"Test RPC\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('ir')\n\n    @with_transaction()\n    def test_simple(self):\n        \"Test simple\"\n        rpc = RPC(check_access=False)\n        self.assertEqual(\n            rpc.convert(None, 'foo', {}),\n            (['foo'], {}, {}, None))\n\n    @with_transaction()\n    def test_keyword_argument(self):\n        \"Test keyword argument\"\n        rpc = RPC(check_access=False)\n        self.assertEqual(\n            rpc.convert(None, 'foo', bar=True, context={}),\n            (['foo'], {'bar': True}, {}, None))\n\n    @with_transaction()\n    def test_wrong_context_type(self):\n        \"Test wrong context type\"\n        rpc = RPC()\n        with self.assertRaises(TypeError) as cm:\n            rpc.convert(None, context=None)\n\n        self.assertEqual(\n            str(cm.exception), \"context must be a dictionary\")\n\n    @with_transaction()\n    def test_missing_context(self):\n        \"Test missing context\"\n        rpc = RPC()\n        with self.assertRaises(ValueError) as cm:\n            rpc.convert(None)\n\n        self.assertEqual(\n            str(cm.exception), \"Missing context argument\")\n\n    @with_transaction()\n    def test_clean_context(self):\n        \"Test clean context\"\n        rpc = RPC(check_access=False)\n        self.assertEqual(\n            rpc.convert(None, {'_foo': True, '_datetime': None}),\n            ([], {}, {'_datetime': None}, None))\n\n    @with_transaction()\n    def test_timestamp(self):\n        \"Test context timestamp\"\n        rpc = RPC(check_access=False)\n        self.assertEqual(\n            rpc.convert(None, {'_timestamp': 'test'}),\n            ([], {}, {}, 'test'))\n\n    @with_transaction()\n    def test_instantiate(self):\n        \"Test instantiate\"\n\n        def side_effect(*args, **kwargs):\n            self.assertEqual(Transaction().context, {'test': True})\n            return DEFAULT\n\n        rpc = RPC(instantiate=0, check_access=True)\n        obj = Mock()\n        obj.return_value = instance = Mock()\n        obj.side_effect = side_effect\n\n        # Integer\n        self.assertEqual(\n            rpc.convert(obj, 1, {'test': True}),\n            ([instance], {}, {'test': True, '_check_access': True}, None))\n        obj.assert_called_once_with(1)\n\n        obj.reset_mock()\n\n        # Dictionary\n        self.assertEqual(\n            rpc.convert(obj, {'foo': 'bar'}, {'test': True}),\n            ([instance], {}, {'test': True, '_check_access': True}, None))\n        obj.assert_called_once_with(foo='bar')\n\n        obj.reset_mock()\n        obj.browse.return_value = instances = Mock()\n\n        # List\n        self.assertEqual(\n            rpc.convert(obj, [1, 2, 3], {'test': True}),\n            ([instances], {}, {'test': True, '_check_access': True}, None))\n        obj.browse.assert_called_once_with([1, 2, 3])\n\n    @with_transaction()\n    def test_instantiate_unique(self):\n        \"Test instantiate unique\"\n        rpc = RPC(instantiate=0, unique=True)\n        obj = Mock()\n\n        rpc.convert(obj, [1, 2], {})\n        obj.browse.assert_called_once_with([1, 2])\n\n        obj.reset_mock()\n\n        with self.assertRaises(ValueError):\n            rpc.convert(obj, [1, 1], {})\n\n    @with_transaction()\n    def test_instantiate_slice(self):\n        \"Test instantiate with slice\"\n        rpc = RPC(instantiate=slice(0, 2), check_access=False)\n        obj = Mock()\n        obj.return_value = instance = Mock()\n\n        self.assertEqual(\n            rpc.convert(obj, 1, 2, {}),\n            ([instance, instance], {}, {}, None))\n        obj.assert_has_calls([call(1), call(2)])\n\n    @with_transaction()\n    def test_check_access(self):\n        \"Test check_access\"\n        rpc_no_access = RPC(check_access=False)\n        self.assertEqual(\n            rpc_no_access.convert(None, {}),\n            ([], {}, {}, None))\n\n        rpc_with_access = RPC(check_access=True)\n        self.assertEqual(\n            rpc_with_access.convert(None, {}),\n            ([], {}, {'_check_access': True}, None))\n"
  },
  {
    "path": "trytond/tests/test_rule.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport json\nimport unittest\n\nfrom trytond.model.exceptions import AccessError\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n_context = {'_check_access': True}\n\n\nclass ModelRuleTestCase(unittest.TestCase):\n    \"Test Model Rule\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction(context=_context)\n    def test_perm_create_without_rule(self):\n        \"Test create without rule\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n\n        test, = TestRule.create([{}])\n\n    @with_transaction(context=_context)\n    def test_perm_create_with_rule(self):\n        \"Test create with rule\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': False,\n                    'perm_create': True,\n                    'perm_write': False,\n                    'perm_delete': False,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n\n        test, = TestRule.create([{'field': 'bar'}])\n\n    @with_transaction(context=_context)\n    def test_perm_create_with_rule_fail(self):\n        \"Test create with rule fail\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': False,\n                    'perm_create': True,\n                    'perm_write': False,\n                    'perm_delete': False,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n\n        with self.assertRaisesRegex(AccessError, \"Field different from foo\"):\n            test, = TestRule.create([{'field': 'foo'}])\n\n    @with_transaction(context=_context)\n    def test_perm_create_with_default_rule_fail(self):\n        \"Test create with default rule fail\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': False,\n                    'default_p': True,\n                    'perm_read': False,\n                    'perm_create': True,\n                    'perm_write': False,\n                    'perm_delete': False,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n\n        with self.assertRaisesRegex(AccessError, \"Field different from foo\"):\n            test, = TestRule.create([{'field': 'foo'}])\n\n    @with_transaction(context=_context)\n    def test_perm_write_without_rule(self):\n        \"Test write without rule\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n\n        test, = TestRule.create([{}])\n\n        TestRule.write([test], {'field': 'foo'})\n\n    @with_transaction(context=_context)\n    def test_perm_write_with_rule(self):\n        \"Test write with rule\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': False,\n                    'perm_create': False,\n                    'perm_write': True,\n                    'perm_delete': False,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        test, = TestRule.create([{'field': 'test'}])\n\n        TestRule.write([test], {'field': 'bar'})\n\n    @with_transaction(context=_context)\n    def test_perm_write_with_rule_fail_before(self):\n        \"Test write with rule fail before\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': False,\n                    'perm_create': False,\n                    'perm_write': True,\n                    'perm_delete': False,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        test, = TestRule.create([{'field': 'foo'}])\n\n        with self.assertRaisesRegex(AccessError, \"Field different from foo\"):\n            TestRule.write([test], {'field': 'bar'})\n\n    @with_transaction(context=_context)\n    def test_perm_write_with_rule_fail_after(self):\n        \"Test write with rule fail after\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': False,\n                    'perm_create': False,\n                    'perm_write': True,\n                    'perm_delete': False,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        test, = TestRule.create([{'field': 'bar'}])\n\n        with self.assertRaisesRegex(AccessError, \"Field different from foo\"):\n            TestRule.write([test], {'field': 'foo'})\n\n    @with_transaction(context=_context)\n    def test_perm_delete_without_rule(self):\n        \"Test delete without rule\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n\n        test, = TestRule.create([{}])\n\n        TestRule.delete([test])\n\n    @with_transaction(context=_context)\n    def test_perm_delete_with_rule(self):\n        \"Test delete with rule\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': False,\n                    'perm_create': False,\n                    'perm_write': False,\n                    'perm_delete': True,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        test, = TestRule.create([{'field': 'bar'}])\n\n        TestRule.delete([test])\n\n    @with_transaction(context=_context)\n    def test_perm_delete_with_rule_fail(self):\n        \"Test delete with rule fail\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': False,\n                    'perm_create': False,\n                    'perm_write': False,\n                    'perm_delete': True,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        test, = TestRule.create([{'field': 'foo'}])\n\n        with self.assertRaisesRegex(AccessError, \"Field different from foo\"):\n            TestRule.delete([test])\n\n    @with_transaction(context=_context)\n    def test_perm_read_without_rule(self):\n        \"Test read without rule\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n\n        test, = TestRule.create([{'field': 'foo'}])\n\n        TestRule.read([test.id], ['field'])\n\n    @with_transaction(context=_context)\n    def test_perm_read_with_rule(self):\n        \"Test read with rule\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': True,\n                    'perm_create': False,\n                    'perm_write': False,\n                    'perm_delete': False,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        test, = TestRule.create([{'field': 'bar'}])\n\n        TestRule.read([test.id], ['field'])\n\n    @with_transaction(context=_context)\n    def test_perm_read_with_rule_fail(self):\n        \"Test read with rule fail\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': True,\n                    'perm_create': False,\n                    'perm_write': False,\n                    'perm_delete': False,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        test, = TestRule.create([{'field': 'foo'}])\n\n        with self.assertRaisesRegex(AccessError, \"Field different from foo\"):\n            TestRule.read([test.id], ['field'])\n\n    @with_transaction(context=_context)\n    def test_search_without_rule(self):\n        \"Test search without rule\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n\n        test, = TestRule.create([{'field': 'foo'}])\n\n        self.assertListEqual(TestRule.search([]), [test])\n\n    @with_transaction(context=_context)\n    def test_search_with_rule(self):\n        \"Test search with rule\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': True,\n                    'perm_create': False,\n                    'perm_write': False,\n                    'perm_delete': False,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        test, = TestRule.create([{'field': 'bar'}])\n\n        self.assertListEqual(TestRule.search([]), [test])\n\n    @with_transaction(context=_context)\n    def test_search_with_rule_match(self):\n        \"Test search with rule match\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': True,\n                    'perm_create': False,\n                    'perm_write': False,\n                    'perm_delete': False,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        test, = TestRule.create([{'field': 'foo'}])\n\n        self.assertListEqual(TestRule.search([]), [])\n\n    @with_transaction(context=_context)\n    def test_write_field_no_rule(self):\n        \"Test _write field when there's no rule\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        writable, = TestRule.create([{'field': 'foo'}])\n\n        value, = TestRule.read([writable.id], ['_write'])\n        self.assertEqual(value['_write'], True)\n\n    @with_transaction(context=_context)\n    def test_write_field_rule_True(self):\n        \"Test _write field when there's a rule - True\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': False,\n                    'perm_create': False,\n                    'perm_write': True,\n                    'perm_delete': False,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        writable, = TestRule.create([{'field': 'bar'}])\n\n        value, = TestRule.read([writable.id], ['_write'])\n        self.assertEqual(value['_write'], True)\n\n    @with_transaction(context=_context)\n    def test_write_field_rule_False(self):\n        \"Test _write field when there's a rule - False\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': False,\n                    'perm_create': False,\n                    'perm_write': True,\n                    'perm_delete': False,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        non_writable, = TestRule.create([{'field': 'foo'}])\n\n        value, = TestRule.read([non_writable.id], ['_write'])\n        self.assertEqual(value['_write'], False)\n\n    @with_transaction(context=_context)\n    def test_write_field_relation_rule_True(self):\n        \"Test _write field when there's a rule with a relation - True\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        TestRuleRelation = pool.get('test.rule.relation')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': False,\n                    'perm_create': False,\n                    'perm_write': True,\n                    'perm_delete': False,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('relation.field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        relation, = TestRuleRelation.create([{'field': 'bar'}])\n        writable, = TestRule.create([{'relation': relation}])\n\n        value, = TestRule.read([writable.id], ['_write'])\n        self.assertEqual(value['_write'], True)\n\n    @with_transaction(context=_context)\n    def test_write_field_relation_rule_False(self):\n        \"Test _write field when there's a rule with a relation - False\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        TestRuleRelation = pool.get('test.rule.relation')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': False,\n                    'perm_create': False,\n                    'perm_write': True,\n                    'perm_delete': False,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('relation.field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        relation, = TestRuleRelation.create([{'field': 'foo'}])\n        non_writable, = TestRule.create([{'relation': relation}])\n\n        value, = TestRule.read([non_writable.id], ['_write'])\n        self.assertEqual(value['_write'], False)\n\n    @with_transaction(context=_context)\n    def test_delete_field_no_rule(self):\n        \"Test _delete field when there's no rule\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        deletable, = TestRule.create([{'field': 'foo'}])\n\n        value, = TestRule.read([deletable.id], ['_delete'])\n        self.assertEqual(value['_delete'], True)\n\n    @with_transaction(context=_context)\n    def test_delete_field_rule_True(self):\n        \"Test _delete field when there's a rule - True\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': False,\n                    'perm_create': False,\n                    'perm_write': False,\n                    'perm_delete': True,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        deletable, = TestRule.create([{'field': 'bar'}])\n\n        value, = TestRule.read([deletable.id], ['_delete'])\n        self.assertEqual(value['_delete'], True)\n\n    @with_transaction(context=_context)\n    def test_delete_field_rule_False(self):\n        \"Test _delete field when there's a rule - False\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': False,\n                    'perm_create': False,\n                    'perm_write': False,\n                    'perm_delete': True,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        non_deletable, = TestRule.create([{'field': 'foo'}])\n\n        value, = TestRule.read([non_deletable.id], ['_delete'])\n        self.assertEqual(value['_delete'], False)\n\n    @with_transaction(context=_context)\n    def test_delete_field_relation_rule_True(self):\n        \"Test _delete field when there's a rule with a relation - True\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        TestRuleRelation = pool.get('test.rule.relation')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': False,\n                    'perm_create': False,\n                    'perm_write': False,\n                    'perm_delete': True,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('relation.field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        relation, = TestRuleRelation.create([{'field': 'bar'}])\n        deletable, = TestRule.create([{'relation': relation}])\n\n        value, = TestRule.read([deletable.id], ['_delete'])\n        self.assertEqual(value['_delete'], True)\n\n    @with_transaction(context=_context)\n    def test_delete_field_relation_rule_False(self):\n        \"Test _delete field when there's a rule with a relation - False\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        TestRuleRelation = pool.get('test.rule.relation')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': False,\n                    'perm_create': False,\n                    'perm_write': False,\n                    'perm_delete': True,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('relation.field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        relation, = TestRuleRelation.create([{'field': 'foo'}])\n        non_deletable, = TestRule.create([{'relation': relation}])\n\n        value, = TestRule.read([non_deletable.id], ['_delete'])\n        self.assertEqual(value['_delete'], False)\n\n    @with_transaction(context=_context)\n    def test_model_with_rule(self):\n        \"Test model with rule\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        TestRuleModel = pool.get('test.rule.model')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': True,\n                    'perm_create': False,\n                    'perm_write': False,\n                    'perm_delete': False,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        rule, = TestRule.create([{'field': 'bar'}])\n        test, = TestRuleModel.create([{'rule': rule.id, 'name': 'foo'}])\n\n        TestRuleModel.read([test.id], ['name'])\n\n    @with_transaction(context=_context)\n    def test_model_with_rule_fail(self):\n        \"Test model with rule fail\"\n        pool = Pool()\n        TestRule = pool.get('test.rule')\n        TestRuleModel = pool.get('test.rule.model')\n        RuleGroup = pool.get('ir.rule.group')\n        Model = pool.get('ir.model')\n\n        model, = Model.search([('model', '=', 'test.rule')])\n        rule_group, = RuleGroup.create([{\n                    'name': \"Field different from foo\",\n                    'model': model.id,\n                    'global_p': True,\n                    'perm_read': True,\n                    'perm_create': False,\n                    'perm_write': False,\n                    'perm_delete': False,\n                    'rules': [('create', [{\n                                    'domain': json.dumps(\n                                        [('field', '!=', 'foo')]),\n                                    }])],\n                    }])\n        rule, = TestRule.create([{'field': 'foo'}])\n        test, = TestRuleModel.create([{'rule': rule.id, 'name': 'foo'}])\n\n        with self.assertRaisesRegex(AccessError, \"Field different from foo\"):\n            TestRuleModel.read([test.id], ['name'])\n"
  },
  {
    "path": "trytond/tests/test_sendmail.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport smtplib\nimport unittest\nfrom email.message import Message\nfrom unittest.mock import ANY, MagicMock, Mock, call, patch\n\nfrom trytond.sendmail import (\n    SMTPDataManager, get_smtp_server, sendmail, sendmail_transactional)\nfrom trytond.transaction import Transaction\n\nfrom .test_tryton import activate_module, with_transaction\n\n\nclass SendmailTestCase(unittest.TestCase):\n    'Test sendmail'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_sendmail_transactional(self):\n        'Test sendmail_transactional'\n        message = MagicMock()\n        datamanager = Mock()\n        sendmail_transactional(\n            'tryton@example.com', 'foo@example.com', message,\n            datamanager=datamanager)\n\n        datamanager.put.assert_called_once_with(\n            'tryton@example.com', 'foo@example.com', message)\n\n    def test_sendmail(self):\n        'Test sendmail'\n        message = MagicMock()\n        server = Mock()\n        sendmail(\n            'tryton@example.com', 'foo@example.com', message, server=server)\n        server.sendmail.assert_called_with(\n            'tryton@example.com', 'foo@example.com', message.as_string())\n        server.quit.assert_not_called()\n\n    def test_get_smtp_server(self):\n        'Test get_smtp_server'\n        with patch.object(smtplib, 'SMTP') as SMTP:\n            SMTP.return_value = server = Mock()\n            self.assertEqual(get_smtp_server('smtp://localhost:25'), server)\n            SMTP.assert_called_once_with('localhost', 25)\n\n        with patch.object(smtplib, 'SMTP') as SMTP:\n            SMTP.return_value = server = Mock()\n            self.assertEqual(\n                get_smtp_server('smtp://foo:bar@localhost:25'), server)\n            SMTP.assert_called_once_with('localhost', 25)\n            server.login.assert_called_once_with('foo', 'bar')\n\n        with patch.object(smtplib, 'SMTP_SSL') as SMTP:\n            SMTP.return_value = server = Mock()\n            self.assertEqual(\n                get_smtp_server('smtps://localhost:25'), server)\n            SMTP.assert_called_once_with('localhost', 25, context=ANY)\n\n        with patch.object(smtplib, 'SMTP') as SMTP:\n            SMTP.return_value = server = Mock()\n            self.assertEqual(\n                get_smtp_server('smtp+tls://localhost:25'), server)\n            SMTP.assert_called_once_with('localhost', 25)\n            server.starttls.assert_called_once_with(context=ANY)\n\n    def test_get_smtp_server_extra_parameters(self):\n        'Test get_smtp_server uri extra parameters'\n        with patch.object(smtplib, 'SMTP') as SMTP:\n            SMTP.return_value = server = Mock()\n            params = 'timeout=30&local_hostname=smtp.example.com'\n            self.assertEqual(\n                get_smtp_server('smtp://localhost:25?%s' % params), server)\n            SMTP.assert_called_once_with(\n                'localhost', 25, timeout=30, local_hostname='smtp.example.com')\n\n    @patch('trytond.sendmail.get_smtp_server')\n    @with_transaction()\n    def test_SMTPDataManager(self, get_smtp_server):\n        'Test SMTPDataManager'\n        transaction = Transaction()\n        get_smtp_server.return_value = server = Mock()\n\n        datamanager = transaction.join(SMTPDataManager())\n\n        # multiple join must return the same\n        self.assertEqual(transaction.join(SMTPDataManager()), datamanager)\n\n        msg1 = MagicMock(Message)\n        msg2 = MagicMock(Message)\n        datamanager.put('foo@example.com', 'bar@example.com', msg1)\n        datamanager.put('bar@example.com', 'foo@example.com', msg2)\n\n        transaction.commit()\n\n        server.sendmail.assert_has_calls([\n                call('foo@example.com', 'bar@example.com', msg1.as_string()),\n                call('bar@example.com', 'foo@example.com', msg2.as_string()),\n                ])\n        server.quit.assert_called_once_with()\n        self.assertFalse(datamanager.queue)\n\n        server.reset_mock()\n\n        datamanager.put(\n            'foo@example.com', 'bar@example.com', MagicMock(Message))\n        transaction.rollback()\n\n        server.sendmail.assert_not_called()\n        self.assertFalse(datamanager.queue)\n"
  },
  {
    "path": "trytond/tests/test_sequence.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport unittest\n\nfrom trytond.ir.sequence import LastTimestampError\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\n\nclass SequenceTestCase(unittest.TestCase):\n    'Test Sequence'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @staticmethod\n    def get_model():\n        pool = Pool()\n        return pool.get('ir.sequence')\n\n    @with_transaction()\n    def test_incremental(self):\n        'Test incremental'\n        pool = Pool()\n        Sequence = self.get_model()\n        SequenceType = pool.get('ir.sequence.type')\n\n        sequence_type, = SequenceType.search([\n                ('name', '=', \"Test\"),\n                ], limit=1)\n        sequence, = Sequence.create([{\n                    'name': 'Test incremental',\n                    'sequence_type': sequence_type.id,\n                    'prefix': '',\n                    'suffix': '',\n                    'type': 'incremental',\n                    }])\n        self.assertEqual(sequence.number_next, 1)\n        self.assertEqual(sequence.get(), '1')\n\n        Sequence.write([sequence], {\n                'number_increment': 10,\n                })\n        self.assertEqual(sequence.number_next, 2)\n        self.assertEqual(sequence.get(), '2')\n        self.assertEqual(sequence.get(), '12')\n\n        Sequence.write([sequence], {\n                'padding': 3,\n                })\n        self.assertEqual(sequence.number_next, 22)\n        self.assertEqual(sequence.get(), '022')\n\n    @with_transaction()\n    def test_decimal_timestamp(self):\n        'Test Decimal Timestamp'\n        pool = Pool()\n        Sequence = self.get_model()\n        SequenceType = pool.get('ir.sequence.type')\n\n        sequence_type, = SequenceType.search([\n                ('name', '=', \"Test\"),\n                ], limit=1)\n        sequence, = Sequence.create([{\n                    'name': 'Test decimal timestamp',\n                    'sequence_type': sequence_type.id,\n                    'prefix': '',\n                    'suffix': '',\n                    'type': 'decimal timestamp',\n                    }])\n        timestamp = sequence.get()\n        self.assertEqual(timestamp, str(sequence.last_timestamp))\n\n        self.assertEqual(sequence.number_next, None)\n\n        self.assertNotEqual(sequence.get(), timestamp)\n\n        next_timestamp = Sequence._timestamp(sequence)\n        self.assertRaises(LastTimestampError, Sequence.write, [sequence], {\n                'last_timestamp': next_timestamp + 100,\n                })\n\n    @with_transaction()\n    def test_hexadecimal_timestamp(self):\n        'Test Hexadecimal Timestamp'\n        pool = Pool()\n        Sequence = self.get_model()\n        SequenceType = pool.get('ir.sequence.type')\n\n        sequence_type, = SequenceType.search([\n                ('name', '=', \"Test\"),\n                ], limit=1)\n        sequence, = Sequence.create([{\n                    'name': 'Test hexadecimal timestamp',\n                    'sequence_type': sequence_type.id,\n                    'prefix': '',\n                    'suffix': '',\n                    'type': 'hexadecimal timestamp',\n                    }])\n        timestamp = sequence.get()\n        self.assertEqual(timestamp,\n            hex(int(sequence.last_timestamp))[2:].upper())\n\n        self.assertEqual(sequence.number_next, None)\n\n        self.assertNotEqual(sequence.get(), timestamp)\n\n        next_timestamp = Sequence._timestamp(sequence)\n        self.assertRaises(LastTimestampError, Sequence.write, [sequence], {\n                'last_timestamp': next_timestamp + 100,\n                })\n\n    @with_transaction()\n    def test_prefix_suffix(self):\n        'Test prefix/suffix'\n        pool = Pool()\n        Sequence = self.get_model()\n        SequenceType = pool.get('ir.sequence.type')\n\n        sequence_type, = SequenceType.search([\n                ('name', '=', \"Test\"),\n                ], limit=1)\n        sequence, = Sequence.create([{\n                    'name': 'Test incremental',\n                    'sequence_type': sequence_type.id,\n                    'prefix': 'prefix/',\n                    'suffix': '/suffix',\n                    'type': 'incremental',\n                    }])\n        self.assertEqual(sequence.get(),\n            'prefix/1/suffix')\n\n        Sequence.write([sequence], {\n                'prefix': '${year}-${month}-${day}/',\n                'suffix': '/${day}.${month}.${year}',\n                })\n        with Transaction().set_context(date=datetime.date(2010, 8, 15)):\n            self.assertEqual(sequence.get(), '2010-08-15/2/15.08.2010')\n\n\nclass SequenceStrictTestCase(SequenceTestCase):\n    \"Test Sequence Strict\"\n\n    @staticmethod\n    def get_model():\n        pool = Pool()\n        return pool.get('ir.sequence.strict')\n"
  },
  {
    "path": "trytond/tests/test_tools.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport datetime as dt\nimport doctest\nimport sys\nimport unittest\n\nimport sql\nimport sql.operators\n\nfrom trytond.tools import (\n    decimal_, escape_wildcard, file_open, firstline, grouped_slice,\n    is_full_text, is_instance_method, lstrip_wildcard, reduce_domain,\n    reduce_ids, remove_forbidden_chars, rstrip_wildcard, slugify,\n    sortable_values, strip_wildcard, timezone, unescape_wildcard)\nfrom trytond.tools.domain_inversion import (\n    concat, domain_inversion, eval_domain, extract_reference_models,\n    localize_domain, merge, parse, prepare_reference_domain, simplify,\n    unique_value)\nfrom trytond.tools.immutabledict import ImmutableDict\nfrom trytond.tools.string_ import LazyString, StringPartitioned\n\n\nclass ToolsTestCase(unittest.TestCase):\n    'Test tools'\n    table = sql.Table('test')\n\n    def test_reduce_ids_empty(self):\n        'Test reduce_ids empty list'\n        self.assertEqual(reduce_ids(self.table.id, []), sql.Literal(False))\n\n    def test_reduce_ids_continue(self):\n        'Test reduce_ids continue list'\n        self.assertEqual(reduce_ids(self.table.id, list(range(10))),\n            sql.operators.Or(((self.table.id >= 0) & (self.table.id <= 9),)))\n\n    def test_reduce_ids_one_hole(self):\n        'Test reduce_ids continue list with one hole'\n        self.assertEqual(reduce_ids(\n                self.table.id, list(range(10)) + list(range(20, 30))),\n            ((self.table.id >= 0) & (self.table.id <= 9))\n            | ((self.table.id >= 20) & (self.table.id <= 29)))\n\n    def test_reduce_ids_short_continue(self):\n        'Test reduce_ids short continue list'\n        self.assertEqual(reduce_ids(self.table.id, list(range(4))),\n            sql.operators.Or((self.table.id.in_(list(range(4))),)))\n\n    def test_reduce_ids_complex(self):\n        'Test reduce_ids complex list'\n        self.assertEqual(reduce_ids(self.table.id,\n                list(range(10)) + list(range(25, 30)) + list(range(15, 20))),\n            (((self.table.id >= 0) & (self.table.id <= 14))\n                | (self.table.id.in_(list(range(25, 30))))))\n\n    def test_reduce_ids_complex_small_continue(self):\n        'Test reduce_ids complex list with small continue'\n        self.assertEqual(reduce_ids(self.table.id,\n                [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 18, 19, 21]),\n            (((self.table.id >= 1) & (self.table.id <= 12))\n                | (self.table.id.in_([15, 18, 19, 21]))))\n\n    @unittest.skipIf(sys.flags.optimize, \"assert removed by optimization\")\n    def test_reduce_ids_float(self):\n        'Test reduce_ids with integer as float'\n        self.assertEqual(reduce_ids(self.table.id,\n                [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0,\n                    15.0, 18.0, 19.0, 21.0]),\n            (((self.table.id >= 1.0) & (self.table.id <= 12.0))\n                | (self.table.id.in_([15.0, 18.0, 19.0, 21.0]))))\n        self.assertRaises(AssertionError, reduce_ids, self.table.id, [1.1])\n\n    def test_reduce_domain(self):\n        'Test reduce_domain'\n        clause = ('x', '=', 'x')\n        tests = (\n            ([clause], ['AND', clause]),\n            ([clause, [clause]], ['AND', clause, clause]),\n            (['AND', clause, [clause]], ['AND', clause, clause]),\n            ([clause, ['AND', clause]], ['AND', clause, clause]),\n            ([clause, ['AND', clause, clause]],\n                ['AND', clause, clause, clause]),\n            (['AND', clause, ['AND', clause]], ['AND', clause, clause]),\n            ([[[clause]]], ['AND', clause]),\n            (['OR', clause], ['OR', clause]),\n            (['OR', clause, [clause]], ['OR', clause, ['AND', clause]]),\n            (['OR', clause, [clause, clause]],\n                ['OR', clause, ['AND', clause, clause]]),\n            (['OR', clause, ['OR', clause]], ['OR', clause, clause]),\n            (['OR', clause, [clause, ['OR', clause, clause]]],\n                ['OR', clause, ['AND', clause, ['OR', clause, clause]]]),\n            (['OR', [clause]], ['OR', ['AND', clause]]),\n            ([], []),\n            (['OR', clause, []], ['OR', clause, []]),\n            (['AND', clause, []], ['AND', clause, []]),\n        )\n        for i, j in tests:\n            self.assertEqual(reduce_domain(i), j,\n                    '%s -> %s != %s' % (i, reduce_domain(i), j))\n\n    def test_grouped_slice(self):\n        \"Test grouped slice\"\n        for (values, count, result) in [\n                (list(range(10)), 5, [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]),\n                (list(range(5)), 5, [[0, 1, 2, 3, 4]]),\n                (list(range(5)), 2, [[0, 1], [2, 3], [4]]),\n                ]:\n            with self.subTest(values=values, count=count):\n                self.assertEqual(\n                    list(map(list, grouped_slice(values, count))), result)\n\n    def test_grouped_slice_generator(self):\n        \"Test grouped slice\"\n        self.assertEqual(\n            list(map(list, grouped_slice((x for x in range(10)), 5))),\n            [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])\n\n    def test_is_instance_method(self):\n        'Test is_instance_method'\n\n        class Foo(object):\n\n            @staticmethod\n            def static():\n                pass\n\n            @classmethod\n            def klass(cls):\n                pass\n\n            def instance(self):\n                pass\n\n        self.assertFalse(is_instance_method(Foo, 'static'))\n        self.assertFalse(is_instance_method(Foo, 'klass'))\n        self.assertTrue(is_instance_method(Foo, 'instance'))\n\n    def test_file_open(self):\n        \"Test file_open\"\n        with file_open('__init__.py', subdir=None) as fp:\n            self.assertTrue(fp)\n\n        with file_open('ir/__init__.py') as fp:\n            self.assertTrue(fp)\n\n        with self.assertRaisesRegex(\n                FileNotFoundError, \"No such file or directory:\"):\n            with file_open('ir/noexist'):\n                pass\n\n        with self.assertRaisesRegex(IOError, \"Permission denied:\"):\n            with file_open('/etc/passwd'):\n                pass\n\n        with self.assertRaisesRegex(IOError, \"Permission denied:\"):\n            with file_open('../../foo'):\n                pass\n\n    def test_file_open_suffix(self):\n        \"Test file_open from same root name but with a suffix\"\n        with self.assertRaisesRegex(IOError, \"Permission denied:\"):\n            file_open('../trytond_suffix', subdir=None)\n\n    def test_strip_wildcard(self):\n        'Test strip wildcard'\n        for clause, result in [\n                ('%a%', 'a'),\n                ('%%a%%', '%a%'),\n                ('\\\\%a%', '\\\\%a'),\n                ('\\\\%a\\\\%', '\\\\%a\\\\%'),\n                ('a', 'a'),\n                ('', ''),\n                (None, None),\n                ]:\n            with self.subTest(clause=clause):\n                self.assertEqual(strip_wildcard(clause), result)\n\n    def test_strip_wildcard_different_wildcard(self):\n        'Test strip wildcard with different wildcard'\n        self.assertEqual(strip_wildcard('_a_', '_'), 'a')\n\n    def test_lstrip_wildcard(self):\n        'Test lstrip wildcard'\n        for clause, result in [\n                ('%a', 'a'),\n                ('%a%', 'a%'),\n                ('%%a%', '%a%'),\n                ('\\\\%a%', '\\\\%a%'),\n                ('a', 'a'),\n                ('', ''),\n                (None, None),\n                ]:\n            self.assertEqual(\n                lstrip_wildcard(clause), result, msg=clause)\n\n    def test_lstrip_wildcard_different_wildcard(self):\n        'Test lstrip wildcard with different wildcard'\n        self.assertEqual(lstrip_wildcard('_a', '_'), 'a')\n\n    def test_rstrip_wildcard(self):\n        'Test rstrip wildcard'\n        for clause, result in [\n                ('a%', 'a'),\n                ('%a%', '%a'),\n                ('%a%%', '%a%'),\n                ('%a\\\\%', '%a\\\\%'),\n                ('a', 'a'),\n                ('', ''),\n                (None, None),\n                ]:\n            self.assertEqual(\n                rstrip_wildcard(clause), result, msg=clause)\n\n    def test_rstrip_wildcard_different_wildcard(self):\n        self.assertEqual(rstrip_wildcard('a_', '_'), 'a')\n\n    def test_escape_wildcard(self):\n        self.assertEqual(\n            escape_wildcard('foo%bar_baz\\\\'),\n            'foo\\\\%bar\\\\_baz\\\\\\\\')\n\n    def test_unescape_wildcard(self):\n        \"Test unescape_wildcard\"\n        self.assertEqual(\n            unescape_wildcard('foo\\\\%bar\\\\_baz\\\\\\\\'),\n            'foo%bar_baz\\\\')\n\n    def test_is_full_text(self):\n        \"Test is_full_text\"\n        for value, result in [\n                ('foo', True),\n                ('%foo bar%', True),\n                ('%%foo bar%', False),\n                ('%foo bar%%', False),\n                ('foo%', False),\n                ('foo_bar', False),\n                ('foo\\\\_bar', True),\n                ]:\n            with self.subTest(value=value):\n                self.assertEqual(is_full_text(value), result)\n\n    def test_slugify(self):\n        \"Test slugify\"\n        self.assertEqual(slugify('unicode ♥ is ☢'), 'unicode-is')\n\n    def test_slugify_hyphenate(self):\n        \"Test hyphenate in slugify\"\n        self.assertEqual(slugify('foo bar', hyphenate='_'), 'foo_bar')\n\n    def test_sortable_values(self):\n        def key(values):\n            return values\n\n        values = [\n            (('a', 1), ('b', None)),\n            (('a', 1), ('b', 3)),\n            (('a', 1), ('b', 2)),\n            ]\n\n        with self.assertRaises(TypeError):\n            sorted(values, key=key)\n        self.assertEqual(\n            sorted(values, key=sortable_values(key)), [\n                (('a', 1), ('b', 2)),\n                (('a', 1), ('b', 3)),\n                (('a', 1), ('b', None)),\n                ])\n\n    def test_firstline(self):\n        \"Test firstline\"\n        for text, result in [\n                (\"\", \"\"),\n                (\"first line\\nsecond line\", \"first line\"),\n                (\"\\nsecond line\", \"second line\"),\n                (\"\\n\\nthird line\", \"third line\"),\n                (\" \\nsecond line\", \"second line\"),\n                ]:\n            with self.subTest(text=text, result=result):\n                self.assertEqual(firstline(text), result)\n\n    def test_remove_forbidden_chars(self):\n        \"Test remove_forbidden_chars\"\n        for string, result in [\n                (\"\", \"\"),\n                (None, None),\n                (\"\\ttest\", \"test\"),\n                (\" test \", \"test\"),\n                ]:\n            with self.subTest(string=string):\n                self.assertEqual(remove_forbidden_chars(string), result)\n\n    def test_get_tzinfo_valid(self):\n        \"Test get_tzinfo with an valid timezone\"\n        zi = timezone.get_tzinfo('Europe/Brussels')\n        now = dt.datetime(2022, 5, 17, tzinfo=zi)\n        self.assertEqual(str(now), \"2022-05-17 00:00:00+02:00\")\n\n    def test_get_tzinfo_invalid(self):\n        \"Test get_tzinfo with an invalid timezone\"\n        zi = timezone.get_tzinfo('foo')\n        now = dt.datetime(2022, 5, 17, tzinfo=zi)\n        self.assertEqual(str(now), \"2022-05-17 00:00:00+00:00\")\n\n    def test_availabe_timezones(self):\n        \"Test available_timezones\"\n        available_timezones = timezone.available_timezones()\n        self.assertTrue(available_timezones)\n        self.assertIsInstance(available_timezones, set)\n\n\nclass StringPartitionedTestCase(unittest.TestCase):\n    \"Test StringPartitioned\"\n\n    def test_init(self):\n        s = StringPartitioned('foo')\n\n        self.assertEqual(s, 'foo')\n        self.assertEqual(s._parts, ('foo',))\n\n    def test_init_partitioned(self):\n        s = StringPartitioned(\n            StringPartitioned('foo') + StringPartitioned('bar'))\n\n        self.assertEqual(s, 'foobar')\n        self.assertEqual(s._parts, ('foo', 'bar'))\n\n    def test_iter(self):\n        s = StringPartitioned('foo')\n\n        self.assertEqual(list(s), ['foo'])\n\n    def test_len(self):\n        s = StringPartitioned('foo')\n\n        self.assertEqual(len(s), 3)\n\n    def test_str(self):\n        s = StringPartitioned('foo')\n\n        s = str(s)\n\n        self.assertEqual(s, 'foo')\n        self.assertIsInstance(s, str)\n        self.assertNotIsInstance(s, StringPartitioned)\n\n    def test_add(self):\n        s = StringPartitioned('foo')\n\n        s = s + 'bar'\n\n        self.assertEqual(s, 'foobar')\n        self.assertEqual(list(s), ['foo', 'bar'])\n\n    def test_radd(self):\n        s = StringPartitioned('foo')\n\n        s = 'bar' + s\n\n        self.assertEqual(s, 'barfoo')\n        self.assertEqual(list(s), ['bar', 'foo'])\n\n\nclass LazyStringTestCase(unittest.TestCase):\n    \"Test LazyString\"\n\n    def test_init(self):\n        s = LazyString(lambda: 'foo')\n\n        self.assertIsInstance(s, LazyString)\n        self.assertEqual(str(s), 'foo')\n\n    def test_init_args(self):\n        s = LazyString(lambda a: a, 'foo')\n\n        self.assertIsInstance(s, LazyString)\n        self.assertEqual(str(s), 'foo')\n\n    def test_add(self):\n        s = LazyString(lambda: 'foo')\n\n        s = s + 'bar'\n\n        self.assertEqual(s, 'foobar')\n\n    def test_radd(self):\n        s = LazyString(lambda: 'foo')\n\n        s = 'bar' + s\n\n        self.assertEqual(s, 'barfoo')\n\n\nclass ImmutableDictTestCase(unittest.TestCase):\n    \"Test ImmutableDict\"\n\n    def test_setitem(self):\n        \"__setitem__ not allowed\"\n        d = ImmutableDict()\n\n        with self.assertRaises(TypeError):\n            d['foo'] = 'bar'\n\n    def test_delitem(self):\n        \"__delitem__ not allowed\"\n        d = ImmutableDict(foo='bar')\n\n        with self.assertRaises(TypeError):\n            del d['foo']\n\n    def test_ior(self):\n        \"__ior__ not allowed\"\n        d = ImmutableDict()\n\n        with self.assertRaises(TypeError):\n            d |= {'foo': 'bar'}\n\n    def test_clear(self):\n        \"clear not allowed\"\n        d = ImmutableDict(foo='bar')\n\n        with self.assertRaises(TypeError):\n            d.clear()\n\n    def test_pop(self):\n        \"pop not allowed\"\n        d = ImmutableDict(foo='bar')\n\n        with self.assertRaises(TypeError):\n            d.pop('foo')\n\n    def test_popitem(self):\n        \"popitem not allowed\"\n        d = ImmutableDict(foo='bar')\n\n        with self.assertRaises(TypeError):\n            d.popitem('foo')\n\n    def test_setdefault(self):\n        \"setdefault not allowed\"\n        d = ImmutableDict()\n\n        with self.assertRaises(TypeError):\n            d.setdefault('foo', 'bar')\n\n    def test_update(self):\n        \"update not allowed\"\n        d = ImmutableDict()\n\n        with self.assertRaises(TypeError):\n            d.update({'foo': 'bar'})\n\n\nclass DomainInversionTestCase(unittest.TestCase):\n    \"Test domain_inversion\"\n\n    def test_simple_inversion(self):\n        domain = [['x', '=', 3]]\n        self.assertEqual(domain_inversion(domain, 'x'), [['x', '=', 3]])\n\n        domain = []\n        self.assertEqual(domain_inversion(domain, 'x'), True)\n        self.assertEqual(domain_inversion(domain, 'x', {'x': 5}), True)\n        self.assertEqual(domain_inversion(domain, 'z', {'x': 7}), True)\n\n        domain = [['x.id', '>', 5]]\n        self.assertEqual(domain_inversion(domain, 'x'), [['x.id', '>', 5]])\n\n    def test_and_inversion(self):\n        domain = [['x', '=', 3], ['y', '>', 5]]\n        self.assertEqual(domain_inversion(domain, 'x'), [['x', '=', 3]])\n        self.assertEqual(domain_inversion(domain, 'x', {'y': 4}), False)\n        self.assertEqual(\n            domain_inversion(domain, 'x', {'y': 6}), [['x', '=', 3]])\n\n        domain = [['x', '=', 3], ['y', '=', 5]]\n        self.assertEqual(domain_inversion(domain, 'z'), True)\n        self.assertEqual(domain_inversion(domain, 'z', {'x': 2, 'y': 7}), True)\n        self.assertEqual(\n            domain_inversion(domain, 'x', {'y': None}), [['x', '=', 3]])\n\n        domain = [['x.id', '>', 5], ['y', '<', 3]]\n        self.assertEqual(domain_inversion(domain, 'y'), [['y', '<', 3]])\n        self.assertEqual(\n            domain_inversion(domain, 'y', {'x': 3}), [['y', '<', 3]])\n        self.assertEqual(domain_inversion(domain, 'x'), [['x.id', '>', 5]])\n\n    def test_or_inversion(self):\n        domain = ['OR', ['x', '=', 3], ['y', '>', 5], ['z', '=', 'abc']]\n        self.assertEqual(domain_inversion(domain, 'x'), True)\n        self.assertEqual(domain_inversion(domain, 'x', {'y': 4}), True)\n        self.assertEqual(\n            domain_inversion(domain, 'x', {'y': 4, 'z': 'ab'}),\n            [['x', '=', 3]])\n        self.assertEqual(domain_inversion(domain, 'x', {'y': 7}), True)\n        self.assertEqual(\n            domain_inversion(domain, 'x', {'y': 7, 'z': 'b'}), True)\n        self.assertEqual(domain_inversion(domain, 'x', {'z': 'abc'}), True)\n        self.assertEqual(\n            domain_inversion(domain, 'x', {'y': 4, 'z': 'abc'}), True)\n\n        domain = ['OR', ['x', '=', 3], ['y', '=', 5]]\n        self.assertEqual(\n            domain_inversion(domain, 'x', {'y': None}), [['x', '=', 3]])\n\n        domain = ['OR', ['x', '=', 3], ['y', '>', 5]]\n        self.assertEqual(domain_inversion(domain, 'z'), True)\n\n        domain = ['OR', ['x.id', '>', 5], ['y', '<', 3]]\n        self.assertEqual(domain_inversion(domain, 'y'), True)\n        self.assertEqual(domain_inversion(domain, 'y', {'z': 4}), True)\n        self.assertEqual(domain_inversion(domain, 'y', {'x': 3}), True)\n\n        domain = ['OR', ['length', '>', 5], ['language.code', '=', 'de_DE']]\n        self.assertEqual(\n            domain_inversion(domain, 'length', {'length': 0, 'name': 'n'}),\n            True)\n\n    def test_orand_inversion(self):\n        domain = ['OR', [['x', '=', 3], ['y', '>', 5], ['z', '=', 'abc']],\n            [['x', '=', 4]], [['y', '>', 6]]]\n        self.assertEqual(domain_inversion(domain, 'x'), True)\n        self.assertEqual(domain_inversion(domain, 'x', {'y': 4}), True)\n        self.assertEqual(\n            domain_inversion(domain, 'x', {'z': 'abc', 'y': 7}), True)\n        self.assertEqual(domain_inversion(domain, 'x', {'y': 7}), True)\n        self.assertEqual(domain_inversion(domain, 'x', {'z': 'ab'}), True)\n\n    def test_andor_inversion(self):\n        domain = [['OR', ['x', '=', 4], ['y', '>', 6]], ['z', '=', 3]]\n        self.assertEqual(domain_inversion(domain, 'z'), [['z', '=', 3]])\n        self.assertEqual(\n            domain_inversion(domain, 'z', {'x': 5}), [['z', '=', 3]])\n        self.assertEqual(\n            domain_inversion(domain, 'z', {'x': 5, 'y': 5}), [['z', '=', 3]])\n        self.assertEqual(\n            domain_inversion(domain, 'z', {'x': 5, 'y': 7}), [['z', '=', 3]])\n\n    def test_andand_inversion(self):\n        domain = [[['x', '=', 4], ['y', '>', 6]], ['z', '=', 3]]\n        self.assertEqual(domain_inversion(domain, 'z'), [['z', '=', 3]])\n        self.assertEqual(\n            domain_inversion(domain, 'z', {'x': 5}), [['z', '=', 3]])\n        self.assertEqual(\n            domain_inversion(domain, 'z', {'y': 5}), [['z', '=', 3]])\n        self.assertEqual(\n            domain_inversion(domain, 'z', {'x': 4, 'y': 7}), [['z', '=', 3]])\n\n        domain = [\n            [['x', '=', 4], ['y', '>', 6], ['z', '=', 2]], [['w', '=', 2]]]\n        self.assertEqual(\n            domain_inversion(domain, 'z', {'x': 4}), [['z', '=', 2]])\n\n    def test_oror_inversion(self):\n        domain = ['OR', ['OR', ['x', '=', 3], ['y', '>', 5]],\n            ['OR', ['x', '=', 2], ['z', '=', 'abc']],\n            ['OR', ['y', '=', 8], ['z', '=', 'y']]]\n        self.assertEqual(domain_inversion(domain, 'x'), True)\n        self.assertEqual(domain_inversion(domain, 'x', {'y': 4}), True)\n        self.assertEqual(domain_inversion(domain, 'x', {'z': 'ab'}), True)\n        self.assertEqual(domain_inversion(domain, 'x', {'y': 7}), True)\n        self.assertEqual(domain_inversion(domain, 'x', {'z': 'abc'}), True)\n        self.assertEqual(domain_inversion(domain, 'x', {'z': 'y'}), True)\n        self.assertEqual(domain_inversion(domain, 'x', {'y': 8}), True)\n        self.assertEqual(\n            domain_inversion(domain, 'x', {'y': 8, 'z': 'b'}), True)\n        self.assertEqual(\n            domain_inversion(domain, 'x', {'y': 4, 'z': 'y'}), True)\n        self.assertEqual(\n            domain_inversion(domain, 'x', {'y': 7, 'z': 'abc'}), True)\n        self.assertEqual(\n            domain_inversion(domain, 'x', {'y': 4, 'z': 'b'}),\n            ['OR', ['x', '=', 3], ['x', '=', 2]])\n\n    def test_parse(self):\n        domain = parse([['x', '=', 5]])\n        self.assertEqual(domain.variables, set('x'))\n\n        domain = parse(['OR', ['x', '=', 4], ['y', '>', 6]])\n        self.assertEqual(domain.variables, set('xy'))\n\n        domain = parse([['OR', ['x', '=', 4], ['y', '>', 6]], ['z', '=', 3]])\n        self.assertEqual(domain.variables, set('xyz'))\n\n        domain = parse([[['x', '=', 4], ['y', '>', 6]], ['z', '=', 3]])\n        self.assertEqual(domain.variables, set('xyz'))\n\n    def test_simplify(self):\n        domain = [['x', '=', 3]]\n        self.assertEqual(simplify(domain), [['x', '=', 3]])\n\n        domain = [[['x', '=', 3]]]\n        self.assertEqual(simplify(domain), [['x', '=', 3]])\n\n        domain = [[['x', '=', 3], ['y', '=', 4]]]\n        self.assertEqual(simplify(domain), [['x', '=', 3], ['y', '=', 4]])\n\n        domain = ['OR', ['x', '=', 3]]\n        self.assertEqual(simplify(domain), [['x', '=', 3]])\n\n        domain = ['OR', [['x', '=', 3]], [['y', '=', 5]]]\n        self.assertEqual(\n            simplify(domain), ['OR', ['x', '=', 3], ['y', '=', 5]])\n\n        domain = ['OR', ['x', '=', 3], ['AND', ['y', '=', 5]]]\n        self.assertEqual(\n            simplify(domain), ['OR', ['x', '=', 3], ['y', '=', 5]])\n\n        domain = ['OR', ('x', '=', 1), ['OR', ('x', '=', 2), ('x', '=', 3)]]\n        self.assertEqual(\n            simplify(domain),\n            ['OR', ('x', '=', 1), ('x', '=', 2), ('x', '=', 3)])\n\n        domain = [['x', '=', 3], ['OR']]\n        self.assertEqual(simplify(domain), [['x', '=', 3]])\n\n        domain = ['OR', ['x', '=', 3], []]\n        self.assertEqual(simplify(domain), [])\n\n        domain = ['OR', ['x', '=', 3], ['OR']]\n        self.assertEqual(simplify(domain), [])\n\n        domain = [['x', '=', 3], []]\n        self.assertEqual(simplify(domain), [['x', '=', 3]])\n\n        domain = [['x', '=', 3], ['AND']]\n        self.assertEqual(simplify(domain), [['x', '=', 3]])\n\n        domain = ['AND']\n        self.assertEqual(simplify(domain), [])\n\n        domain = ['OR']\n        self.assertEqual(simplify(domain), [])\n\n    def test_simplify_deduplicate(self):\n        \"Test deduplicate\"\n        clause = ('x', '=', 'x')\n        another = ('y', '=', 'y')\n        third = ('z', '=', 'z')\n        tests = [\n            ([], []),\n            (['OR', []], []),\n            (['AND', []], []),\n            ([clause], [clause]),\n            (['OR', clause], [clause]),\n            ([clause, clause], [clause]),\n            (['OR', clause, clause], [clause]),\n            ([clause, [clause, clause]], [clause]),\n            ([clause, another], [clause, another]),\n            (['OR', clause, another], ['OR', clause, another]),\n            ([clause, clause, another], [clause, another]),\n            ([clause, [clause, clause], another], [clause, another]),\n            ([clause, clause, another, another], [clause, another]),\n            ([clause, another, clause, another], [clause, another]),\n            (\n                ['AND', ['OR', clause, another], third],\n                ['AND', ['OR', clause, another], third]),\n            ]\n\n        for input, expected in tests:\n            with self.subTest(input=input):\n                self.assertEqual(simplify(input), expected)\n\n    def test_merge(self):\n        domain = [['x', '=', 6], ['y', '=', 7]]\n        self.assertEqual(merge(domain), ['AND', ['x', '=', 6], ['y', '=', 7]])\n\n        domain = ['AND', ['x', '=', 6], ['y', '=', 7]]\n        self.assertEqual(merge(domain), ['AND', ['x', '=', 6], ['y', '=', 7]])\n\n        domain = [['z', '=', 8], ['AND', ['x', '=', 6], ['y', '=', 7]]]\n        self.assertEqual(\n            merge(domain),\n            ['AND', ['z', '=', 8], ['x', '=', 6], ['y', '=', 7]])\n\n        domain = ['OR', ['x', '=', 1], ['y', '=', 2], ['z', '=', 3]]\n        self.assertEqual(\n            merge(domain), ['OR', ['x', '=', 1], ['y', '=', 2], ['z', '=', 3]])\n\n        domain = ['OR', ['x', '=', 1], ['OR', ['y', '=', 2], ['z', '=', 3]]]\n        self.assertEqual(\n            merge(domain), ['OR', ['x', '=', 1], ['y', '=', 2], ['z', '=', 3]])\n\n        domain = ['OR', ['x', '=', 1], ['AND', ['y', '=', 2], ['z', '=', 3]]]\n        self.assertEqual(\n            merge(domain),\n            ['OR', ['x', '=', 1], ['AND', ['y', '=', 2], ['z', '=', 3]]])\n\n        domain = [['z', '=', 8], ['OR', ['x', '=', 6], ['y', '=', 7]]]\n        self.assertEqual(\n            merge(domain),\n            ['AND', ['z', '=', 8], ['OR', ['x', '=', 6], ['y', '=', 7]]])\n\n        domain = ['AND', ['OR', ['a', '=', 1], ['b', '=', 2]],\n            ['OR', ['c', '=', 3], ['AND', ['d', '=', 4], ['d2', '=', 6]]],\n            ['AND', ['d', '=', 5], ['e', '=', 6]], ['f', '=', 7]]\n        self.assertEqual(\n            merge(domain),\n            ['AND', ['OR', ['a', '=', 1], ['b', '=', 2]],\n                ['OR', ['c', '=', 3], ['AND', ['d', '=', 4], ['d2', '=', 6]]],\n                ['d', '=', 5], ['e', '=', 6], ['f', '=', 7]])\n\n    def test_concat(self):\n        domain1 = [['a', '=', 1]]\n        domain2 = [['b', '=', 2]]\n        self.assertEqual(\n            concat(domain1, domain2), ['AND', ['a', '=', 1], ['b', '=', 2]])\n        self.assertEqual(concat([], domain1), domain1)\n        self.assertEqual(concat(domain2, []), domain2)\n        self.assertEqual(concat([], []), [])\n        self.assertEqual(\n            concat(domain1, domain2, domoperator='OR'),\n            ['OR', ['a', '=', 1], ['b', '=', 2]])\n\n    def test_unique_value(self):\n        domain = [['a', '=', 1]]\n        self.assertEqual(unique_value(domain), (True, '=', 1))\n\n        domain = [['a', '!=', 1]]\n        self.assertFalse(unique_value(domain)[0])\n\n        domain = [['a', '=', 1], ['a', '=', 2]]\n        self.assertFalse(unique_value(domain)[0])\n\n        domain = [['a.b', '=', 1]]\n        self.assertFalse(unique_value(domain)[0])\n\n        domain = [['a.id', '=', 1, 'model']]\n        self.assertEqual(unique_value(domain), (True, '=', ['model', 1]))\n\n        domain = [['a.b.id', '=', 1, 'model']]\n        self.assertEqual(unique_value(domain), (False, None, None))\n\n    def test_evaldomain(self):\n        domain = [['x', '>', 5]]\n        self.assertTrue(eval_domain(domain, {'x': 6}))\n        self.assertFalse(eval_domain(domain, {'x': 4}))\n\n        domain = [['x', '>', None]]\n        self.assertFalse(eval_domain(domain, {'x': dt.date.today()}))\n        self.assertFalse(eval_domain(domain, {'x': dt.datetime.now()}))\n\n        domain = [['x', '<', dt.date.today()]]\n        self.assertFalse(eval_domain(domain, {'x': None}))\n        domain = [['x', '<', dt.datetime.now()]]\n        self.assertFalse(eval_domain(domain, {'x': None}))\n\n        domain = [['x', 'in', [3, 5]]]\n        self.assertTrue(eval_domain(domain, {'x': 3}))\n        self.assertFalse(eval_domain(domain, {'x': 4}))\n        self.assertTrue(eval_domain(domain, {'x': [3]}))\n        self.assertTrue(eval_domain(domain, {'x': [3, 4]}))\n        self.assertFalse(eval_domain(domain, {'x': [1, 2]}))\n        self.assertFalse(eval_domain(domain, {'x': None}))\n\n        domain = [['x', 'in', [1, None]]]\n        self.assertTrue(eval_domain(domain, {'x': None}))\n        self.assertFalse(eval_domain(domain, {'x': 2}))\n\n        domain = [['x', 'not in', [3, 5]]]\n        self.assertFalse(eval_domain(domain, {'x': 3}))\n        self.assertTrue(eval_domain(domain, {'x': 4}))\n        self.assertFalse(eval_domain(domain, {'x': [3]}))\n        self.assertFalse(eval_domain(domain, {'x': [3, 4]}))\n        self.assertTrue(eval_domain(domain, {'x': [1, 2]}))\n        self.assertFalse(eval_domain(domain, {'x': None}))\n\n        domain = [['x', 'not in', [1, None]]]\n        self.assertFalse(eval_domain(domain, {'x': None}))\n        self.assertTrue(eval_domain(domain, {'x': 2}))\n\n        domain = [['x', 'like', 'abc']]\n        self.assertTrue(eval_domain(domain, {'x': 'abc'}))\n        self.assertFalse(eval_domain(domain, {'x': ''}))\n        self.assertFalse(eval_domain(domain, {'x': 'xyz'}))\n        self.assertFalse(eval_domain(domain, {'x': 'abcd'}))\n\n        domain = [['x', 'not like', 'abc']]\n        self.assertTrue(eval_domain(domain, {'x': 'xyz'}))\n        self.assertTrue(eval_domain(domain, {'x': 'ABC'}))\n        self.assertFalse(eval_domain(domain, {'x': 'abc'}))\n\n        domain = [['x', 'not ilike', 'abc']]\n        self.assertTrue(eval_domain(domain, {'x': 'xyz'}))\n        self.assertFalse(eval_domain(domain, {'x': 'ABC'}))\n        self.assertFalse(eval_domain(domain, {'x': 'abc'}))\n\n        domain = [['x', 'like', 'a%']]\n        self.assertTrue(eval_domain(domain, {'x': 'a'}))\n        self.assertTrue(eval_domain(domain, {'x': 'abcde'}))\n        self.assertFalse(eval_domain(domain, {'x': ''}))\n        self.assertFalse(eval_domain(domain, {'x': 'ABCDE'}))\n        self.assertFalse(eval_domain(domain, {'x': 'xyz'}))\n\n        domain = [['x', 'ilike', 'a%']]\n        self.assertTrue(eval_domain(domain, {'x': 'a'}))\n        self.assertTrue(eval_domain(domain, {'x': 'A'}))\n        self.assertFalse(eval_domain(domain, {'x': ''}))\n        self.assertFalse(eval_domain(domain, {'x': 'xyz'}))\n\n        domain = [['x', 'like', 'a_']]\n        self.assertTrue(eval_domain(domain, {'x': 'ab'}))\n        self.assertFalse(eval_domain(domain, {'x': 'a'}))\n        self.assertFalse(eval_domain(domain, {'x': 'abc'}))\n\n        domain = [['x', 'like', 'a\\\\%b']]\n        self.assertTrue(eval_domain(domain, {'x': 'a%b'}))\n        self.assertFalse(eval_domain(domain, {'x': 'ab'}))\n        self.assertFalse(eval_domain(domain, {'x': 'a123b'}))\n\n        domain = [['x', 'like', '\\\\%b']]\n        self.assertTrue(eval_domain(domain, {'x': '%b'}))\n        self.assertFalse(eval_domain(domain, {'x': 'b'}))\n        self.assertFalse(eval_domain(domain, {'x': '123b'}))\n\n        domain = [['x', 'like', 'a\\\\_c']]\n        self.assertTrue(eval_domain(domain, {'x': 'a_c'}))\n        self.assertFalse(eval_domain(domain, {'x': 'abc'}))\n        self.assertFalse(eval_domain(domain, {'x': 'ac'}))\n\n        domain = [['x', 'like', 'a\\\\\\\\_c']]\n        self.assertTrue(eval_domain(domain, {'x': 'a\\\\bc'}))\n        self.assertFalse(eval_domain(domain, {'x': 'abc'}))\n\n        domain = ['OR', ['x', '>', 10], ['x', '<', 0]]\n        self.assertTrue(eval_domain(domain, {'x': 11}))\n        self.assertTrue(eval_domain(domain, {'x': -4}))\n        self.assertFalse(eval_domain(domain, {'x': 5}))\n\n        domain = ['OR', ['x', '>', 0], ['x', '=', None]]\n        self.assertTrue(eval_domain(domain, {'x': 1}))\n        self.assertTrue(eval_domain(domain, {'x': None}))\n        self.assertFalse(eval_domain(domain, {'x': -1}))\n        self.assertFalse(eval_domain(domain, {'x': 0}))\n\n        domain = [['x', '>', 0], ['OR', ['x', '=', 3], ['x', '=', 2]]]\n        self.assertFalse(eval_domain(domain, {'x': 1}))\n        self.assertTrue(eval_domain(domain, {'x': 3}))\n        self.assertTrue(eval_domain(domain, {'x': 2}))\n        self.assertFalse(eval_domain(domain, {'x': 4}))\n        self.assertFalse(eval_domain(domain, {'x': 5}))\n        self.assertFalse(eval_domain(domain, {'x': 6}))\n\n        domain = ['OR', ['x', '=', 4], [['x', '>', 6], ['x', '<', 10]]]\n        self.assertTrue(eval_domain(domain, {'x': 4}))\n        self.assertTrue(eval_domain(domain, {'x': 7}))\n        self.assertFalse(eval_domain(domain, {'x': 3}))\n        self.assertFalse(eval_domain(domain, {'x': 5}))\n        self.assertFalse(eval_domain(domain, {'x': 11}))\n\n        domain = [['x', '=', 'test,1']]\n        self.assertTrue(eval_domain(domain, {'x': ('test', 1)}))\n        self.assertTrue(eval_domain(domain, {'x': 'test,1'}))\n        self.assertFalse(eval_domain(domain, {'x': ('test', 2)}))\n        self.assertFalse(eval_domain(domain, {'x': 'test,2'}))\n\n        domain = [['x', '=', ('test', 1)]]\n        self.assertTrue(eval_domain(domain, {'x': ('test', 1)}))\n        self.assertTrue(eval_domain(domain, {'x': 'test,1'}))\n        self.assertFalse(eval_domain(domain, {'x': ('test', 2)}))\n        self.assertFalse(eval_domain(domain, {'x': 'test,2'}))\n\n        domain = [['x', '=', 1]]\n        self.assertTrue(eval_domain(domain, {'x': [1, 2]}))\n        self.assertFalse(eval_domain(domain, {'x': [2]}))\n\n        domain = [['x', '=', None]]\n        self.assertTrue(eval_domain(domain, {'x': []}))\n\n        domain = [['x', '=', ['foo', 1]]]\n        self.assertTrue(eval_domain(domain, {'x': 'foo,1'}))\n        self.assertTrue(eval_domain(domain, {'x': ('foo', 1)}))\n        self.assertTrue(eval_domain(domain, {'x': ['foo', 1]}))\n\n        domain = [['x', '=', ('foo', 1)]]\n        self.assertTrue(eval_domain(domain, {'x': 'foo,1'}))\n        self.assertTrue(eval_domain(domain, {'x': ('foo', 1)}))\n        self.assertTrue(eval_domain(domain, {'x': ['foo', 1]}))\n\n        domain = [['x', '=', 'foo,1']]\n        self.assertTrue(eval_domain(domain, {'x': ['foo', 1]}))\n        self.assertTrue(eval_domain(domain, {'x': ('foo', 1)}))\n\n    def test_localize(self):\n        domain = [['x', '=', 5]]\n        self.assertEqual(localize_domain(domain), [['x', '=', 5]])\n\n        domain = [['x', '=', 5], ['x.code', '=', 7]]\n        self.assertEqual(\n            localize_domain(domain, 'x'), [['id', '=', 5], ['code', '=', 7]])\n\n        domain = [['x', 'ilike', 'foo%'], ['x.code', '=', 'test']]\n        self.assertEqual(\n            localize_domain(domain, 'x'),\n            [['rec_name', 'ilike', 'foo%'], ['code', '=', 'test']])\n\n        domain = ['OR',\n            ['AND', ['x', '>', 7], ['x', '<', 15]], ['x.code', '=', 8]]\n        self.assertEqual(\n            localize_domain(domain, 'x'),\n            ['OR', ['AND', ['id', '>', 7], ['id', '<', 15]], ['code', '=', 8]])\n\n        domain = [['x', 'child_of', [1]]]\n        self.assertEqual(\n            localize_domain(domain, 'x'), [['x', 'child_of', [1]]])\n\n        domain = [['x', 'child_of', [1], 'y']]\n        self.assertEqual(\n            localize_domain(domain, 'x'), [['y', 'child_of', [1]]])\n\n        domain = [['x.y', 'child_of', [1], 'parent']]\n        self.assertEqual(\n            localize_domain(domain, 'x'), [['y', 'child_of', [1], 'parent']])\n\n        domain = [['x.y.z', 'child_of', [1], 'parent', 'model']]\n        self.assertEqual(\n            localize_domain(domain, 'x'),\n            [['y.z', 'child_of', [1], 'parent', 'model']])\n\n        domain = [['x.id', '=', 1, 'y']]\n        self.assertEqual(\n            localize_domain(domain, 'x', False), [['id', '=', 1, 'y']])\n        self.assertEqual(localize_domain(domain, 'x', True), [['id', '=', 1]])\n\n        domain = [['a.b.c', '=', 1, 'y', 'z']]\n        self.assertEqual(\n            localize_domain(domain, 'x', False), [['b.c', '=', 1, 'y', 'z']])\n        self.assertEqual(\n            localize_domain(domain, 'x', True), [['b.c', '=', 1, 'z']])\n\n    def test_prepare_reference_domain(self):\n        domain = [['x', 'like', 'A%']]\n        self.assertEqual(\n            prepare_reference_domain(domain, 'x'),\n            [[]])\n\n        domain = [['x', '=', 'A']]\n        self.assertEqual(\n            prepare_reference_domain(domain, 'x'),\n            [[]])\n\n        domain = [['x.y', 'child_of', [1], 'model', 'parent']]\n        self.assertEqual(\n            prepare_reference_domain(domain, 'x'),\n            [['x.y', 'child_of', [1], 'model', 'parent']])\n\n        domain = [['x.y', 'like', 'A%', 'model']]\n        self.assertEqual(\n            prepare_reference_domain(domain, 'x'),\n            [['x.y', 'like', 'A%', 'model']])\n\n        domain = [['x', '=', 'model,1']]\n        self.assertEqual(\n            prepare_reference_domain(domain, 'x'),\n            [['x.id', '=', 1, 'model']])\n\n        domain = [['x', '!=', 'model,1']]\n        self.assertEqual(\n            prepare_reference_domain(domain, 'x'),\n            [['x.id', '!=', 1, 'model']])\n\n        domain = [['x', '=', 'model,%']]\n        self.assertEqual(\n            prepare_reference_domain(domain, 'x'),\n            [['x.id', '!=', None, 'model']])\n\n        domain = [['x', '!=', 'model,%']]\n        self.assertEqual(\n            prepare_reference_domain(domain, 'x'),\n            [['x', 'not like', 'model,%']])\n\n        domain = [['x', 'in',\n                ['model_a,1', 'model_b,%', 'model_c,3', 'model_a,2']]]\n        self.assertEqual(\n            prepare_reference_domain(domain, 'x'),\n            [['OR',\n                ['x.id', 'in', [1, 2], 'model_a'],\n                ['x.id', '!=', None, 'model_b'],\n                ['x.id', 'in', [3], 'model_c'],\n                ]])\n\n        domain = [['x', 'not in',\n                ['model_a,1', 'model_b,%', 'model_c,3', 'model_a,2']]]\n        self.assertEqual(\n            prepare_reference_domain(domain, 'x'),\n            [['AND',\n                ['x.id', 'not in', [1, 2], 'model_a'],\n                ['x', 'not like', 'model_b,%'],\n                ['x.id', 'not in', [3], 'model_c'],\n                ]])\n\n        domain = [['x', 'in', ['model_a,1', 'foo']]]\n        self.assertEqual(\n            prepare_reference_domain(domain, 'x'),\n            [[]])\n\n    def test_extract_models(self):\n        domain = [['x', 'like', 'A%']]\n        self.assertEqual(extract_reference_models(domain, 'x'), set())\n        self.assertEqual(extract_reference_models(domain, 'y'), set())\n\n        domain = [['x', 'like', 'A%', 'model']]\n        self.assertEqual(extract_reference_models(domain, 'x'), {'model'})\n        self.assertEqual(extract_reference_models(domain, 'y'), set())\n\n        domain = ['OR',\n            ['x.y', 'like', 'A%', 'model_A'],\n            ['x.z', 'like', 'B%', 'model_B']]\n        self.assertEqual(\n            extract_reference_models(domain, 'x'), {'model_A', 'model_B'})\n        self.assertEqual(extract_reference_models(domain, 'y'), set())\n\n\ndef load_tests(loader, tests, pattern):\n    tests.addTest(doctest.DocTestSuite(decimal_))\n    return tests\n"
  },
  {
    "path": "trytond/tests/test_transaction.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\nfrom unittest.mock import Mock\n\nfrom trytond.tests.test_tryton import CONTEXT, DB_NAME, USER, activate_module\nfrom trytond.transaction import Transaction\n\n\ndef empty_transaction(*args, **kwargs):\n    '''\n    Just starts a transaction in the context manager and returns `True`\n    and stops transaction for the given arguments.\n\n    All positional arguments are passed to `start` method of transaction\n    '''\n    with Transaction().start(*args, **kwargs):\n        return True\n\n\nclass TransactionTestCase(unittest.TestCase):\n    'Test the Transaction Context manager'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    def test_nonexistdb(self):\n        '''Attempt opening a transaction with a non existant DB\n        and ensure that it stops cleanly and allows starting of next\n        transaction'''\n        self.assertRaises(\n            Exception, empty_transaction, \"Non existant DB\", USER,\n            context=CONTEXT)\n        self.assertTrue(empty_transaction(DB_NAME, USER, context=CONTEXT))\n\n    def test_set_user(self):\n        'Test set_user'\n        with Transaction().start(DB_NAME, USER, context=CONTEXT) \\\n                as transaction:\n            self.assertEqual(transaction.user, USER)\n            self.assertEqual(transaction.context.get('user'), None)\n\n            with Transaction().set_user(0):\n                self.assertEqual(transaction.user, 0)\n                self.assertEqual(transaction.context.get('user'), None)\n\n            with Transaction().set_user(0, set_context=True):\n                self.assertEqual(transaction.user, 0)\n                self.assertEqual(transaction.context.get('user'), USER)\n\n                # Nested same set_user should keep original context user\n                with Transaction().set_user(0, set_context=True):\n                    self.assertEqual(transaction.user, 0)\n                    self.assertEqual(transaction.context.get('user'), USER)\n\n                # Unset user context\n                with Transaction().set_user(0, set_context=False):\n                    self.assertEqual(transaction.user, 0)\n                    self.assertEqual(transaction.context.get('user'), None)\n\n            # set context for non root\n            self.assertRaises(ValueError,\n                Transaction().set_user, 2, set_context=True)\n\n            # not set context for non root\n            with Transaction().set_user(2):\n                self.assertEqual(transaction.user, 2)\n\n    def test_stacked_transactions(self):\n        'Test that transactions are stacked / unstacked correctly'\n        with Transaction().start(DB_NAME, USER, context=CONTEXT) \\\n                as transaction:\n            with transaction.new_transaction() as new_transaction:\n                self.assertIsNot(new_transaction, transaction)\n                self.assertIsNot(Transaction(), transaction)\n                self.assertIs(Transaction(), new_transaction)\n            self.assertIs(Transaction(), transaction)\n\n    def test_two_phase_commit(self):\n        # A successful transaction\n        dm = Mock()\n        with Transaction().start(DB_NAME, USER, context=CONTEXT) \\\n                as transaction:\n            transaction.join(dm)\n\n        dm.tpc_begin.assert_called_once_with(transaction)\n        dm.commit.assert_called_once_with(transaction)\n        dm.tpc_vote.assert_called_once_with(transaction)\n        dm.tpc_abort.not_called()\n        dm.tpc_finish.assert_called_once_with(transaction)\n\n        # Failing in the datamanager\n        dm.reset_mock()\n        dm.tpc_vote.side_effect = ValueError('Failing the datamanager')\n        try:\n            with Transaction().start(DB_NAME, USER, context=CONTEXT) \\\n                    as transaction:\n                transaction.join(dm)\n        except ValueError:\n            pass\n\n        dm.tpc_begin.assert_called_once_with(transaction)\n        dm.commit.assert_called_once_with(transaction)\n        dm.tpc_vote.assert_called_once_with(transaction)\n        dm.tpc_abort.assert_called_once_with(transaction)\n        dm.tpc_finish.assert_not_called()\n\n        # Failing in tryton\n        dm.reset_mock()\n        try:\n            with Transaction().start(DB_NAME, USER, context=CONTEXT) \\\n                    as transaction:\n                transaction.join(dm)\n                raise ValueError('Failing in tryton')\n        except ValueError:\n            pass\n\n        dm.tpc_begin.assert_not_called()\n        dm.commit.assert_not_called()\n        dm.tpc_vote.assert_not_called()\n        dm.tpc_abort.assert_called_once_with(transaction)\n        dm.tpc_finish.assert_not_called()\n"
  },
  {
    "path": "trytond/tests/test_tree.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport unittest\n\nfrom trytond.model.exceptions import DomainValidationError, RecursionError\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass TreeTestCaseMixin:\n    model_name = None\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    def create(self):\n        pool = Pool()\n        Model = pool.get(self.model_name)\n\n        new_records = [None, None, None]\n        for j in range(3):\n            parent_records = new_records\n            new_records = []\n            k = 0\n            to_create = []\n            for parent_record in parent_records:\n                to_create.extend([{\n                            'name': 'Test %d %d %d' % (j, k, i),\n                            'parent': (parent_record.id\n                                if parent_record else None),\n                            } for i in range(3)])\n                k += 1\n            new_records = Model.create(to_create)\n\n    def check_tree(self):\n        raise NotImplementedError\n\n    def change_parent(self, parent=None, restore=False):\n        pool = Pool()\n        Model = pool.get(self.model_name)\n\n        records = Model.search([\n                ('parent', '=', parent),\n                ])\n        if not records:\n            return\n        for record in records[::2]:\n            for record2 in records[1::2]:\n                record.parent = record2\n                record.save()\n                if restore:\n                    record.parent = parent\n                    record.save()\n        for record in records:\n            self.change_parent(record, restore=restore)\n\n    @with_transaction()\n    def test_create(self):\n        \"Test create tree\"\n        self.create()\n        self.check_tree()\n\n    @with_transaction()\n    def test_reparent(self):\n        \"Test re-parent\"\n        self.create()\n        self.change_parent(restore=True)\n        self.check_tree()\n\n    @with_transaction()\n    def test_move(self):\n        \"Test move\"\n        self.create()\n        self.change_parent()\n        self.check_tree()\n\n    @with_transaction()\n    def test_active(self):\n        \"Test active\"\n        pool = Pool()\n        Model = pool.get(self.model_name)\n\n        self.create()\n\n        records = Model.search([])\n        for record in records:\n            if record.id % 2:\n                record.active = False\n                record.save()\n        self.check_tree()\n        self.change_parent()\n        self.check_tree()\n\n        records = Model.search([])\n        Model.write(records, {\n                'active': True,\n                })\n        Model.write(records[::2], {\n                'active': False\n                })\n        self.check_tree()\n\n        records = Model.search([])\n        Model.write(records, {\n                'active': True,\n                })\n        Model.write(records[:len(records) // 2], {\n                'active': False\n                })\n        self.check_tree()\n\n        records = Model.search([])\n        Model.write(records, {\n                'active': False\n                })\n        self.change_parent()\n        self.check_tree()\n\n    @with_transaction()\n    def test_delete(self):\n        \"Test delete\"\n        pool = Pool()\n        Model = pool.get(self.model_name)\n\n        self.create()\n\n        records = Model.search([])\n        for record in records:\n            if record.id % 2:\n                Model.delete([record])\n        self.check_tree()\n\n        records = Model.search([])\n        Model.delete(records[:len(records) // 2])\n        self.check_tree()\n\n        records = Model.search([])\n        Model.delete(records)\n        self.check_tree()\n\n    @with_transaction()\n    def test_write_multiple_parents(self):\n        \"Test write multiple parents\"\n        pool = Pool()\n        Model = pool.get(self.model_name)\n\n        record1 = Model(name=\"Root\")\n        record1.save()\n        record2 = Model(name=\"Child\", parent=record1)\n        record2.save()\n        record3 = Model(name=\"Grand Child\", parent=record2)\n        record3.save()\n        self.check_tree()\n\n        Model.write([record2, record3], {'parent': None})\n        self.check_tree()\n\n    def rebuild(self):\n        raise NotImplementedError\n\n    @with_transaction()\n    def test_rebuild(self):\n        \"Test rebuild\"\n        self.create()\n\n        self.rebuild()\n\n        self.check_tree()\n\n\nclass TreeMixinTestCase(unittest.TestCase):\n    \"Test TreeMixin\"\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_name_domain(self):\n        \"Test name domain\"\n        pool = Pool()\n        Tree = pool.get('test.tree')\n\n        record = Tree(name=\"foo / bar\")\n\n        with self.assertRaises(DomainValidationError):\n            record.save()\n\n    @with_transaction()\n    def test_name_domain_wildcard(self):\n        \"Test name domain on tree with wildcard\"\n        pool = Pool()\n        Tree = pool.get('test.tree_wildcard')\n\n        record = Tree(name=\"test 10%\")\n        record.save()\n\n    @with_transaction()\n    def test_rec_name(self):\n        \"Test rec_name\"\n        pool = Pool()\n        Tree = pool.get('test.tree')\n\n        parent = Tree(name=\"parent\")\n        parent.save()\n        record = Tree(name=\"record\", parent=parent)\n        record.save()\n\n        self.assertEqual(record.rec_name, \"parent / record\")\n\n    @with_transaction()\n    def test_on_change_with_rec_name(self):\n        \"Test on_change_with_rec_name\"\n        pool = Pool()\n        Tree = pool.get('test.tree')\n\n        parent = Tree(name=\"parent\")\n        parent.save()\n        record = Tree(name=\"record\", parent=parent)\n        record.save()\n\n        self.assertEqual(record.rec_name, record.on_change_with_rec_name())\n\n    @with_transaction()\n    def test_search_rec_name_equals(self):\n        \"Test search_rec_name equals\"\n        pool = Pool()\n        Tree = pool.get('test.tree')\n\n        parent = Tree(name=\"parent\")\n        parent.save()\n        record = Tree(name=\"record\", parent=parent)\n        record.save()\n\n        records = Tree.search([('rec_name', '=', 'parent / record')])\n\n        self.assertEqual(records, [record])\n\n    @with_transaction()\n    def test_search_rec_name_equals_toplevel(self):\n        \"Test search_rec_name equals top-level\"\n        pool = Pool()\n        Tree = pool.get('test.tree')\n\n        parent = Tree(name=\"parent\")\n        parent.save()\n        record = Tree(name=\"record\", parent=parent)\n        record.save()\n\n        records = Tree.search([('rec_name', '=', 'parent')])\n\n        self.assertEqual(records, [parent])\n\n    @with_transaction()\n    def test_search_rec_name_equals_none(self):\n        \"Test search_rec_name equals\"\n        pool = Pool()\n        Tree = pool.get('test.tree')\n\n        parent = Tree(name=\"parent\")\n        parent.save()\n        record = Tree(name=\"record\", parent=parent)\n        record.save()\n\n        records = Tree.search([('rec_name', '=', None)])\n\n        self.assertEqual(records, [])\n\n    @with_transaction()\n    def test_search_rec_name_non_equals(self):\n        \"Test search_rec_name non equals\"\n        pool = Pool()\n        Tree = pool.get('test.tree')\n\n        parent = Tree(name=\"parent\")\n        parent.save()\n        record = Tree(name=\"record\", parent=parent)\n        record.save()\n\n        records = Tree.search([('rec_name', '!=', 'parent / record')])\n\n        self.assertEqual(records, [parent])\n\n    @with_transaction()\n    def test_search_rec_name_non_equals_toplevel(self):\n        \"Test search_rec_name non equals top-level\"\n        pool = Pool()\n        Tree = pool.get('test.tree')\n\n        parent = Tree(name=\"parent\")\n        parent.save()\n        record = Tree(name=\"record\", parent=parent)\n        record.save()\n\n        records = Tree.search([('rec_name', '!=', 'parent')])\n\n        self.assertEqual(records, [record])\n\n    @with_transaction()\n    def test_search_rec_name_non_equals_none(self):\n        \"Test search_rec_name equals\"\n        pool = Pool()\n        Tree = pool.get('test.tree')\n\n        parent = Tree(name=\"parent\")\n        parent.save()\n        record = Tree(name=\"record\", parent=parent)\n        record.save()\n\n        records = Tree.search([('rec_name', '!=', None)])\n\n        self.assertEqual(records, [parent, record])\n\n    @with_transaction()\n    def test_search_rec_name_in(self):\n        \"Test search_rec_name in\"\n        pool = Pool()\n        Tree = pool.get('test.tree')\n\n        parent = Tree(name=\"parent\")\n        parent.save()\n        record = Tree(name=\"record\", parent=parent)\n        record.save()\n\n        records = Tree.search([('rec_name', 'in', ['parent / record'])])\n\n        self.assertEqual(records, [record])\n\n    @with_transaction()\n    def test_search_rec_name_in_toplevel(self):\n        \"Test search_rec_name in top-level\"\n        pool = Pool()\n        Tree = pool.get('test.tree')\n\n        parent = Tree(name=\"parent\")\n        parent.save()\n        record = Tree(name=\"record\", parent=parent)\n        record.save()\n\n        records = Tree.search([('rec_name', 'in', ['parent'])])\n\n        self.assertEqual(records, [parent])\n\n    @with_transaction()\n    def test_search_rec_name_like(self):\n        \"Test search_rec_name like\"\n        pool = Pool()\n        Tree = pool.get('test.tree')\n\n        parent = Tree(name=\"parent\")\n        parent.save()\n        record = Tree(name=\"record\", parent=parent)\n        record.save()\n        child = Tree(name=\"child\", parent=record)\n        child.save()\n\n        records = Tree.search([('rec_name', 'like', '%record%')])\n\n        self.assertEqual(records, [record, child])\n\n    @with_transaction()\n    def test_search_rec_name_like_toplevel(self):\n        \"Test search_rec_name like top-level\"\n        pool = Pool()\n        Tree = pool.get('test.tree')\n\n        parent = Tree(name=\"parent\")\n        parent.save()\n        record = Tree(name=\"record\", parent=parent)\n        record.save()\n        child = Tree(name=\"child\", parent=record)\n        child.save()\n\n        records = Tree.search([('rec_name', 'like', 'parent / record%')])\n\n        self.assertEqual(records, [record, child])\n\n    @with_transaction()\n    def test_search_rec_name_like_lowlevel(self):\n        \"Test search_rec_name like low-level\"\n        pool = Pool()\n        Tree = pool.get('test.tree')\n\n        parent = Tree(name=\"parent\")\n        parent.save()\n        record = Tree(name=\"record\", parent=parent)\n        record.save()\n        child = Tree(name=\"child\", parent=record)\n        child.save()\n\n        records = Tree.search([('rec_name', 'like', '%record')])\n\n        self.assertEqual(records, [record])\n\n    @with_transaction()\n    def test_check_recursion(self):\n        \"Test check_recursion\"\n        pool = Pool()\n        Tree = pool.get('test.tree')\n\n        parent = Tree(name=\"parent\")\n        parent.save()\n        record = Tree(name=\"record\", parent=parent)\n        record.save()\n        child = Tree(name=\"child\", parent=record)\n        child.save()\n\n        with self.assertRaises(RecursionError):\n            parent.parent = child\n            parent.save()\n\n    @with_transaction()\n    def test_check_recursion_polytree(self):\n        \"Test check_recursion on polytree\"\n        pool = Pool()\n        Polytree = pool.get('test.polytree')\n\n        parent1 = Polytree(name=\"parent1\")\n        parent1.save()\n        parent2 = Polytree(name=\"parent2\")\n        parent2.save()\n        record = Polytree(name=\"record\", parents=[parent1, parent2])\n        record.save()\n        child = Polytree(name=\"child\", parents=[record])\n        child.save()\n\n        with self.assertRaises(RecursionError):\n            parent1.parents = [child]\n            parent1.save()\n"
  },
  {
    "path": "trytond/tests/test_trigger.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime\nimport unittest\nfrom itertools import combinations\n\nfrom trytond.ir.exceptions import TriggerConditionError\nfrom trytond.model.exceptions import SQLConstraintError\nfrom trytond.pool import Pool\nfrom trytond.pyson import Eval, PYSONEncoder\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.tests.trigger import TRIGGER_LOGS\nfrom trytond.transaction import Transaction\n\n\nclass TriggerTestCase(unittest.TestCase):\n    'Test Trigger'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    def setUp(self):\n        TRIGGER_LOGS.clear()\n\n    def run_tasks(self):\n        pool = Pool()\n        Queue = pool.get('ir.queue')\n        transaction = Transaction()\n        while transaction.tasks:\n            task = Queue(transaction.tasks.pop())\n            task.run()\n\n    @with_transaction()\n    def test_constraints(self):\n        'Test constraints'\n        pool = Pool()\n        Model = pool.get('ir.model')\n        Trigger = pool.get('ir.trigger')\n        transaction = Transaction()\n\n        model, = Model.search([\n                ('model', '=', 'test.triggered'),\n                ])\n\n        values = {\n            'name': 'Test',\n            'model': model.id,\n            'on_time': True,\n            'condition': 'true',\n            'action': 'test.trigger_action|trigger',\n            }\n        self.assertTrue(Trigger.create([values]))\n\n        transaction.rollback()\n\n        # on_exclusive\n        for i in range(1, 4):\n            for combination in combinations(\n                    ['create', 'write', 'delete'], i):\n                combination_values = values.copy()\n                for mode in combination:\n                    combination_values['on_%s' % mode] = True\n                self.assertRaises(SQLConstraintError, Trigger.create,\n                    [combination_values])\n                transaction.rollback()\n\n        # check_condition\n        condition_values = values.copy()\n        condition_values['condition'] = '='\n        self.assertRaises(TriggerConditionError, Trigger.create,\n            [condition_values])\n        transaction.rollback()\n\n        # Restart the cache on the get_triggers method of ir.trigger\n        Trigger._get_triggers_cache.clear()\n\n    @with_transaction()\n    def test_on_create(self):\n        'Test on_create'\n        pool = Pool()\n        Model = pool.get('ir.model')\n        Trigger = pool.get('ir.trigger')\n        Triggered = pool.get('test.triggered')\n\n        model, = Model.search([\n                ('model', '=', 'test.triggered'),\n                ])\n\n        trigger, = Trigger.create([{\n                    'name': 'Test',\n                    'model': model.id,\n                    'on_create': True,\n                    'condition': 'true',\n                    'action': 'test.trigger_action|trigger',\n                    }])\n\n        triggered, = Triggered.create([{\n                    'name': 'Test',\n                    }])\n\n        self.run_tasks()\n        self.assertEqual(TRIGGER_LOGS, [([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n\n        # Trigger with condition\n        condition = PYSONEncoder().encode(\n            Eval('self', {}).get('name') == 'Bar')\n        Trigger.write([trigger], {\n                'condition': condition,\n                })\n\n        # Matching condition\n        triggered, = Triggered.create([{\n                    'name': 'Bar',\n                    }])\n        self.run_tasks()\n        self.assertEqual(TRIGGER_LOGS, [([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n\n        # Non matching condition\n        triggered, = Triggered.create([{\n                    'name': 'Foo',\n                    }])\n        self.run_tasks()\n        self.assertEqual(TRIGGER_LOGS, [])\n\n        # With limit number\n        Trigger.write([trigger], {\n                'condition': 'true',\n                'limit_number': 1,\n                })\n        triggered, = Triggered.create([{\n                    'name': 'Test',\n                    }])\n        self.run_tasks()\n        self.assertEqual(TRIGGER_LOGS, [([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n\n        # With minimum delay\n        Trigger.write([trigger], {\n                'limit_number': 0,\n                'minimum_time_delay': datetime.timedelta(hours=1),\n                })\n        triggered, = Triggered.create([{\n                    'name': 'Test',\n                    }])\n        self.run_tasks()\n        self.assertEqual(TRIGGER_LOGS, [([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n\n        # Restart the cache on the get_triggers method of ir.trigger\n        Trigger._get_triggers_cache.clear()\n\n    @with_transaction()\n    def test_on_write(self):\n        'Test on_write'\n        pool = Pool()\n        Model = pool.get('ir.model')\n        Trigger = pool.get('ir.trigger')\n        TriggerLog = pool.get('ir.trigger.log')\n        Triggered = pool.get('test.triggered')\n\n        model, = Model.search([\n                ('model', '=', 'test.triggered'),\n                ])\n\n        trigger, = Trigger.create([{\n                    'name': 'Test',\n                    'model': model.id,\n                    'on_write': True,\n                    'condition': 'true',\n                    'action': 'test.trigger_action|trigger',\n                    }])\n\n        triggered, = Triggered.create([{\n                    'name': 'Test',\n                    }])\n\n        Triggered.write([triggered], {\n                'name': 'Foo',\n                })\n        self.run_tasks()\n        self.assertEqual(TRIGGER_LOGS, [])\n\n        # Trigger with condition\n        condition = PYSONEncoder().encode(\n            Eval('self', {}).get('name') == 'Bar')\n        Trigger.write([trigger], {\n                'condition': condition,\n                })\n\n        # Matching condition\n        Triggered.write([triggered], {\n                'name': 'Bar',\n                })\n        self.run_tasks()\n        self.assertEqual(TRIGGER_LOGS, [([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n\n        # No change in condition\n        Triggered.write([triggered], {\n                'name': 'Bar',\n                })\n        self.run_tasks()\n        self.assertEqual(TRIGGER_LOGS, [])\n\n        # Different change in condition\n        Triggered.write([triggered], {\n                'name': 'Foo',\n                })\n        self.run_tasks()\n        self.assertEqual(TRIGGER_LOGS, [])\n\n        # With limit number\n        condition = PYSONEncoder().encode(\n            Eval('self', {}).get('name') == 'Bar')\n        Trigger.write([trigger], {\n                'condition': condition,\n                'limit_number': 1,\n                })\n        triggered, = Triggered.create([{\n                    'name': 'Foo',\n                    }])\n        Triggered.write([triggered], {\n                'name': 'Bar',\n                })\n        Triggered.write([triggered], {\n                'name': 'Foo',\n                })\n        Triggered.write([triggered], {\n                'name': 'Bar',\n                })\n        self.run_tasks()\n        self.assertEqual(TRIGGER_LOGS, [([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n\n        # With minimum delay\n        Trigger.write([trigger], {\n                'limit_number': 0,\n                'minimum_time_delay': datetime.timedelta.max,\n                })\n        triggered, = Triggered.create([{\n                    'name': 'Foo',\n                    }])\n        for name in ('Bar', 'Foo', 'Bar'):\n            Triggered.write([triggered], {\n                    'name': name,\n                    })\n        self.run_tasks()\n        self.assertEqual(TRIGGER_LOGS, [([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n\n        Trigger.write([trigger], {\n                'minimum_time_delay': datetime.timedelta(seconds=1),\n                })\n        triggered, = Triggered.create([{\n                    'name': 'Foo',\n                    }])\n        for name in ('Bar', 'Foo'):\n            Triggered.write([triggered], {\n                'name': name,\n                })\n            self.run_tasks()\n        self.assertEqual(TRIGGER_LOGS, [([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n        Transaction().trigger_records.clear()\n\n        # Make time pass by moving back in time the log creation\n        trigger_log = TriggerLog.__table__()\n        cursor = Transaction().connection.cursor()\n        cursor.execute(*trigger_log.update(\n                [trigger_log.create_date],\n                [datetime.datetime.now() - datetime.timedelta(days=1)],\n                where=trigger_log.record_id == triggered.id))\n\n        Triggered.write([triggered], {\n                'name': 'Bar',\n                })\n        self.run_tasks()\n        self.assertEqual(TRIGGER_LOGS, [([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n\n        # Restart the cache on the get_triggers method of ir.trigger\n        Trigger._get_triggers_cache.clear()\n\n    @with_transaction()\n    def test_on_delete(self):\n        'Test on_delete'\n        pool = Pool()\n        Model = pool.get('ir.model')\n        Trigger = pool.get('ir.trigger')\n        Triggered = pool.get('test.triggered')\n        TriggerLog = pool.get('ir.trigger.log')\n\n        model, = Model.search([\n                ('model', '=', 'test.triggered'),\n                ])\n\n        triggered, = Triggered.create([{\n                    'name': 'Test',\n                    }])\n\n        trigger, = Trigger.create([{\n                    'name': 'Test',\n                    'model': model.id,\n                    'on_delete': True,\n                    'condition': 'true',\n                    'action': 'test.trigger_action|trigger',\n                    }])\n\n        Triggered.delete([triggered])\n        self.assertEqual(TRIGGER_LOGS, [([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n        Transaction().delete = {}\n\n        # Trigger with condition\n        condition = PYSONEncoder().encode(\n            Eval('self', {}).get('name') == 'Bar')\n        Trigger.write([trigger], {\n                'condition': condition,\n                })\n\n        triggered, = Triggered.create([{\n                    'name': 'Bar',\n                    }])\n\n        # Matching condition\n        Triggered.delete([triggered])\n        self.assertEqual(TRIGGER_LOGS, [([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n        Transaction().delete = {}\n\n        triggered, = Triggered.create([{\n                    'name': 'Foo',\n                    }])\n\n        # Non matching condition\n        Triggered.delete([triggered])\n        self.assertEqual(TRIGGER_LOGS, [])\n        Transaction().delete = {}\n\n        triggered, = Triggered.create([{\n                    'name': 'Test',\n                    }])\n\n        # With limit number\n        Trigger.write([trigger], {\n                'condition': 'true',\n                'limit_number': 1,\n                })\n        Triggered.delete([triggered])\n        self.assertEqual(TRIGGER_LOGS, [([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n        Transaction().delete = {}\n        # Delete trigger logs because SQLite reuse the same triggered_id\n        TriggerLog.delete(TriggerLog.search([\n                    ('trigger', '=', trigger.id),\n                    ]))\n\n        triggered, = Triggered.create([{\n                    'name': 'Test',\n                    }])\n\n        # With minimum delay\n        Trigger.write([trigger], {\n                'limit_number': 0,\n                'minimum_time_delay': datetime.timedelta(hours=1),\n                })\n        Triggered.delete([triggered])\n        self.assertEqual(TRIGGER_LOGS, [([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n        Transaction().delete = {}\n\n        # Restart the cache on the get_triggers method of ir.trigger\n        Trigger._get_triggers_cache.clear()\n\n    @with_transaction()\n    def test_on_time(self):\n        'Test on_time'\n        pool = Pool()\n        Model = pool.get('ir.model')\n        Trigger = pool.get('ir.trigger')\n        Triggered = pool.get('test.triggered')\n        TriggerLog = pool.get('ir.trigger.log')\n\n        model, = Model.search([\n                ('model', '=', 'test.triggered'),\n                ])\n\n        trigger, = Trigger.create([{\n                    'name': 'Test',\n                    'model': model.id,\n                    'on_time': True,\n                    'condition': 'true',\n                    'action': 'test.trigger_action|trigger',\n                    }])\n\n        triggered, = Triggered.create([{\n                    'name': 'Test',\n                    }])\n        Trigger.trigger_time()\n        self.assertEqual(TRIGGER_LOGS, [([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n\n        # Trigger with condition\n        condition = PYSONEncoder().encode(\n            Eval('self', {}).get('name') == 'Bar')\n        Trigger.write([trigger], {\n                'condition': condition,\n                })\n\n        # Matching condition\n        Triggered.write([triggered], {\n                'name': 'Bar',\n                })\n        Trigger.trigger_time()\n        self.assertEqual(TRIGGER_LOGS, [([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n\n        # Non matching condition\n        Triggered.write([triggered], {\n                'name': 'Foo',\n                })\n        Trigger.trigger_time()\n        self.assertEqual(TRIGGER_LOGS, [])\n\n        # With limit number\n        Trigger.write([trigger], {\n                'condition': 'true',\n                'limit_number': 1,\n                })\n        Trigger.trigger_time()\n        Trigger.trigger_time()\n        self.assertEqual(TRIGGER_LOGS, [([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n\n        # Delete trigger logs of limit number test\n        TriggerLog.delete(TriggerLog.search([\n                    ('trigger', '=', trigger.id),\n                    ]))\n\n        # With minimum delay\n        Trigger.write([trigger], {\n                'limit_number': 0,\n                'minimum_time_delay': datetime.timedelta.max,\n                })\n        Trigger.trigger_time()\n        Trigger.trigger_time()\n        self.assertEqual(TRIGGER_LOGS, [([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n        Transaction().delete = {}\n\n        # Delete trigger logs of previous minimum delay test\n        TriggerLog.delete(TriggerLog.search([\n                    ('trigger', '=', trigger.id),\n                    ]))\n\n        Trigger.write([trigger], {\n                'minimum_time_delay': datetime.timedelta(seconds=1),\n                })\n        Trigger.trigger_time()\n\n        # Make time pass by moving back in time the log creation\n        trigger_log = TriggerLog.__table__()\n        cursor = Transaction().connection.cursor()\n        cursor.execute(*trigger_log.update(\n                [trigger_log.create_date],\n                [datetime.datetime.now() - datetime.timedelta(days=1)],\n                where=trigger_log.record_id == triggered.id))\n\n        Trigger.trigger_time()\n        self.assertEqual(\n            TRIGGER_LOGS, [([triggered], trigger), ([triggered], trigger)])\n        TRIGGER_LOGS.pop()\n        TRIGGER_LOGS.pop()\n        Transaction().delete = {}\n\n        # Restart the cache on the get_triggers method of ir.trigger\n        Trigger._get_triggers_cache.clear()\n"
  },
  {
    "path": "trytond/tests/test_tryton.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport doctest\nimport glob\nimport inspect\nimport operator\nimport os\nimport subprocess\nimport sys\nimport time\nimport unittest\nimport unittest.mock\nfrom configparser import ConfigParser\nfrom fnmatch import fnmatchcase\nfrom functools import reduce, wraps\nfrom itertools import chain\n\ntry:\n    import pkg_resources\nexcept ImportError:\n    pkg_resources = None\n\nfrom lxml import etree\nfrom sql import Table\n\nfrom trytond import backend\nfrom trytond.cache import Cache\nfrom trytond.config import config, parse_uri\nfrom trytond.model import (\n    ModelSingleton, ModelSQL, ModelStorage, ModelView, Workflow, fields)\nfrom trytond.model.fields import Function\nfrom trytond.pool import Pool, isregisteredby\nfrom trytond.pyson import PYSONDecoder, PYSONEncoder\nfrom trytond.tools import file_open, find_dir, is_instance_method\nfrom trytond.transaction import Transaction\nfrom trytond.wizard import StateAction, StateView\n\n__all__ = ['DB_NAME', 'USER', 'CONTEXT',\n    'activate_module', 'ModuleTestCase', 'with_transaction',\n    'doctest_setup', 'doctest_teardown', 'doctest_checker', 'load_doc_tests']\n\nPool.start()\nUSER = 1\nCONTEXT = {}\nif 'DB_NAME' in os.environ:\n    DB_NAME = os.environ['DB_NAME']\nelif backend.name == 'sqlite':\n    DB_NAME = ':memory:'\nelse:\n    DB_NAME = 'test_' + str(int(time.time()))\nos.environ['DB_NAME'] = DB_NAME\nDB_CACHE = os.environ.get('DB_CACHE')\nPool.test = True\n\n\ndef activate_module(modules, lang='en'):\n    '''\n    Activate modules for the tested database\n    '''\n    if isinstance(modules, str):\n        modules = [modules]\n    name = '-'.join(modules)\n    if lang != 'en':\n        name += '--' + lang\n    if not db_exist(DB_NAME) and restore_db_cache(name):\n        return\n    create_db(lang=lang)\n    with Transaction().start(DB_NAME, 1, close=True) as transaction:\n        pool = Pool()\n        Module = pool.get('ir.module')\n\n        records = Module.search([\n                ('name', 'in', modules),\n                ])\n        assert len(records) == len(modules)\n\n        records = Module.search([\n                ('name', 'in', modules),\n                ('state', '!=', 'activated'),\n                ])\n\n        if records:\n            Module.activate(records)\n            transaction.commit()\n\n            ActivateUpgrade = pool.get('ir.module.activate_upgrade',\n                type='wizard')\n            instance_id, _, _ = ActivateUpgrade.create()\n            transaction.commit()\n            ActivateUpgrade(instance_id).transition_upgrade()\n            ActivateUpgrade.delete(instance_id)\n            transaction.commit()\n    backup_db_cache(name)\n\n\ndef restore_db_cache(name):\n    result = False\n    if DB_CACHE:\n        cache_file = _db_cache_file(DB_CACHE, name)\n        if os.path.exists(cache_file):\n            if backend.name == 'sqlite':\n                result = _sqlite_copy(cache_file, restore=True)\n            elif backend.name == 'postgresql':\n                result = _pg_restore(cache_file)\n    if result:\n        Pool(DB_NAME).init()\n    return result\n\n\ndef backup_db_cache(name):\n    if DB_CACHE:\n        if not os.path.exists(DB_CACHE):\n            os.makedirs(DB_CACHE)\n        cache_file = _db_cache_file(DB_CACHE, name)\n        if not os.path.exists(cache_file):\n            if backend.name == 'sqlite':\n                _sqlite_copy(cache_file)\n            elif backend.name == 'postgresql':\n                _pg_dump(cache_file)\n\n\ndef _db_cache_file(path, name):\n    return os.path.join(path, '%s-%s.dump' % (name, backend.name))\n\n\ndef _sqlite_copy(file_, restore=False):\n    import sqlite3 as sqlite\n\n    with Transaction().start(DB_NAME, 0) as transaction, \\\n            sqlite.connect(file_) as conn2:\n        conn1 = transaction.connection\n        if restore:\n            conn2, conn1 = conn1, conn2\n        if hasattr(conn1, 'backup'):\n            conn1.backup(conn2)\n        else:\n            try:\n                import sqlitebck\n            except ImportError:\n                return False\n            sqlitebck.copy(conn1, conn2)\n    return True\n\n\ndef _pg_options():\n    uri = parse_uri(config.get('database', 'uri'))\n    options = []\n    env = os.environ.copy()\n    if uri.hostname:\n        options.extend(['-h', uri.hostname])\n    if uri.port:\n        options.extend(['-p', str(uri.port)])\n    if uri.username:\n        options.extend(['-U', uri.username])\n    if uri.password:\n        env['PGPASSWORD'] = uri.password\n    return options, env\n\n\ndef _pg_restore(cache_file):\n    with Transaction().start(\n            None, 0, close=True, autocommit=True) as transaction:\n        transaction.database.create(transaction.connection, DB_NAME)\n    cmd = ['pg_restore', '-d', DB_NAME]\n    options, env = _pg_options()\n    cmd.extend(options)\n    cmd.append(cache_file)\n    try:\n        return not subprocess.call(cmd, env=env)\n    except OSError:\n        cache_name, _ = os.path.splitext(os.path.basename(cache_file))\n        cache_name = backend.TableHandler.convert_name(cache_name)\n        with Transaction().start(\n                None, 0, close=True, autocommit=True) as transaction:\n            transaction.database.drop(transaction.connection, DB_NAME)\n            transaction.database.create(\n                transaction.connection, DB_NAME, cache_name)\n        return True\n\n\ndef _pg_dump(cache_file):\n    cmd = ['pg_dump', '-f', cache_file, '-F', 'c']\n    options, env = _pg_options()\n    cmd.extend(options)\n    cmd.append(DB_NAME)\n    try:\n        return not subprocess.call(cmd, env=env)\n    except OSError:\n        cache_name, _ = os.path.splitext(os.path.basename(cache_file))\n        cache_name = backend.TableHandler.convert_name(cache_name)\n        # Ensure any connection is left open\n        backend.Database(DB_NAME).close()\n        with Transaction().start(\n                None, 0, close=True, autocommit=True) as transaction:\n            transaction.database.create(\n                transaction.connection, cache_name, DB_NAME)\n        open(cache_file, 'a').close()\n        return True\n\n\ndef with_transaction(user=1, context=None):\n    def decorator(func):\n        @wraps(func)\n        def wrapper(*args, **kwargs):\n            transaction = Transaction()\n            with transaction.start(DB_NAME, user, context=context):\n                try:\n                    result = func(*args, **kwargs)\n                finally:\n                    transaction.rollback()\n                    # Drop the cache as the transaction is rollbacked\n                    Cache.drop(DB_NAME)\n                return result\n        return wrapper\n    return decorator\n\n\nclass ModuleTestCase(unittest.TestCase):\n    'Trytond Test Case'\n    module = None\n    extras = None\n    language = 'en'\n\n    @classmethod\n    def setUpClass(cls):\n        drop_db()\n        modules = [cls.module]\n        if cls.extras:\n            modules.extend(cls.extras)\n        activate_module(modules, lang=cls.language)\n        super(ModuleTestCase, cls).setUpClass()\n\n    @classmethod\n    def tearDownClass(cls):\n        super(ModuleTestCase, cls).tearDownClass()\n        drop_db()\n\n    @with_transaction()\n    def test_rec_name(self):\n        for mname, model in Pool().iterobject():\n            if not isregisteredby(model, self.module):\n                continue\n            # Skip testing default value even if the field doesn't exist\n            # as there is a fallback to id\n            if model._rec_name == 'name':\n                continue\n            with self.subTest(model=mname):\n                self.assertIn(model._rec_name, model._fields.keys(),\n                    msg='Wrong _rec_name \"%s\" for %s' % (\n                        model._rec_name, mname))\n                field = model._fields[model._rec_name]\n                self.assertIn(field._type, {'char', 'text'},\n                    msg=\"Wrong '%s' type for _rec_name of %s'\" % (\n                        field._type, mname))\n\n    @with_transaction()\n    def test_model__access__(self):\n        \"Test existing model __access__\"\n        pool = Pool()\n        for mname, Model in pool.iterobject():\n            if not isregisteredby(Model, self.module):\n                continue\n            for field_name in Model.__access__:\n                with self.subTest(model=mname, field=field_name):\n                    self.assertIn(field_name, Model._fields.keys(),\n                        msg=\"Wrong __access__ '%s' for %s\" % (\n                            field_name, mname))\n                    field = Model._fields[field_name]\n                    Target = field.get_target()\n                    self.assertTrue(\n                        Target,\n                        msg='Missing target for __access__ \"%s\" of %s' % (\n                            field_name, mname))\n\n    @with_transaction()\n    def test_view(self):\n        'Test validity of all views of the module'\n        pool = Pool()\n        View = pool.get('ir.ui.view')\n        views = View.search([\n                ('module', '=', self.module),\n                ])\n        directory = find_dir(\n            self.module,\n            subdir='modules' if self.module not in {'ir', 'res'} else '')\n        view_files = set(glob.glob(os.path.join(directory, 'view', '*.xml')))\n        for view in views:\n            if view.name:\n                view_files.discard(os.path.join(\n                        directory, 'view', view.name + '.xml'))\n            if not view.model:\n                continue\n            with self.subTest(view=view):\n                if not view.inherit or view.inherit.model == view.model:\n                    self.assertTrue(view.arch,\n                        msg='missing architecture for view \"%(name)s\" '\n                        'of model \"%(model)s\"' % {\n                            'name': view.name or str(view.id),\n                            'model': view.model,\n                            })\n                if view.inherit and view.inherit.model == view.model:\n                    view_id = view.inherit.id\n                else:\n                    view_id = view.id\n                model = view.model\n                Model = pool.get(model)\n                res = Model.fields_view_get(view_id)\n                self.assertEqual(res['model'], model)\n                tree = etree.fromstring(res['arch'])\n\n                validator = etree.RelaxNG(etree=View.get_rng(res['type']))\n                validator.assertValid(tree)\n\n                tree_root = tree.getroottree().getroot()\n\n                for element in tree_root.iter():\n                    with self.subTest(element=element):\n                        if element.tag in {\n                                'field', 'label', 'separator', 'group'}:\n                            for attr in ['name', 'icon', 'symbol']:\n                                field = element.get(attr)\n                                if field:\n                                    self.assertIn(field, res['fields'].keys(),\n                                        msg='Missing field: %s in %s' % (\n                                            field, Model.__name__))\n                        if element.tag == 'button':\n                            button_name = element.get('name')\n                            self.assertIn(button_name, Model._buttons.keys(),\n                                msg=\"Button '%s' is not in %s._buttons\"\n                                % (button_name, Model.__name__))\n        self.assertFalse(view_files, msg=\"unused view files\")\n\n    @with_transaction()\n    def test_icon(self):\n        \"Test icons of the module\"\n        pool = Pool()\n        Icon = pool.get('ir.ui.icon')\n        icons = Icon.search([('module', '=', self.module)])\n        directory = find_dir(\n            self.module,\n            subdir='modules' if self.module not in {'ir', 'res'} else '')\n        icon_files = set(glob.glob(os.path.join(directory, 'icons', '*.svg')))\n        for icon in icons:\n            icon_files.discard(os.path.join(\n                    directory, icon.path.replace('/', os.sep)))\n            with self.subTest(icon=icon):\n                self.assertTrue(icon.icon)\n        self.assertFalse(icon_files, msg=\"unused icon files\")\n\n    @with_transaction()\n    def test_rpc_callable(self):\n        'Test that RPC methods are callable'\n        for _, model in Pool().iterobject():\n            for method_name in model.__rpc__:\n                with self.subTest(model=model, method=method_name):\n                    self.assertTrue(\n                        callable(getattr(model, method_name, None)),\n                        msg=\"'%s' is not callable on '%s'\"\n                        % (method_name, model.__name__))\n\n    @with_transaction()\n    def test_missing_depends(self):\n        'Test for missing depends'\n        for mname, model in Pool().iterobject():\n            if not isregisteredby(model, self.module):\n                continue\n            for fname, field in model._fields.items():\n                depends = {\n                    f for f in field.depends if not f.startswith('_parent_')}\n                with self.subTest(model=mname, field=fname):\n                    self.assertLessEqual(depends, set(model._fields),\n                        msg='Unknown depends %s in \"%s\".\"%s\"' % (\n                            list(depends - set(model._fields)), mname, fname))\n            if issubclass(model, ModelView):\n                for bname, button in model._buttons.items():\n                    depends = set(button.get('depends', []))\n                    with self.subTest(model=mname, button=bname):\n                        self.assertLessEqual(depends, set(model._fields),\n                            msg='Unknown depends %s in button \"%s\".\"%s\"' % (\n                                list(depends - set(model._fields)),\n                                mname, bname))\n\n    @with_transaction()\n    def test_depends(self):\n        \"Test depends\"\n        def test_missing_relation(depend, depends, qualname):\n            prefix = []\n            for d in depend.split('.'):\n                if d.startswith('_parent_'):\n                    relation = '.'.join(\n                        prefix + [d[len('_parent_'):]])\n                    self.assertIn(relation, depends,\n                        msg='Missing \"%s\" in %s' % (relation, qualname))\n                prefix.append(d)\n\n        def test_parent_empty(depend, qualname):\n            if depend.startswith('_parent_'):\n                self.assertIn('.', depend,\n                    msg='Invalid empty \"%s\" in %s' % (depend, qualname))\n\n        def test_missing_parent(model, depend, depends, qualname):\n            dfield = model._fields.get(depend)\n            parent_depends = {d.split('.', 1)[0] for d in depends}\n            if dfield and dfield._type == 'many2one':\n                target = dfield.get_target()\n                for tfield in target._fields.values():\n                    if (tfield._type == 'one2many'\n                            and tfield.model_name == mname\n                            and tfield.field == depend):\n                        self.assertIn('_parent_%s' % depend, parent_depends,\n                            msg='Missing \"_parent_%s\" in %s' % (\n                                depend, qualname))\n\n        def test_depend_exists(model, depend, qualname):\n            try:\n                depend, nested = depend.split('.', 1)\n            except ValueError:\n                nested = None\n            if depend.startswith('_parent_'):\n                depend = depend[len('_parent_'):]\n            self.assertIsInstance(getattr(model, depend, None), fields.Field,\n                msg='Unknown \"%s\" in %s' % (depend, qualname))\n            if nested:\n                target = getattr(model, depend).get_target()\n                test_depend_exists(target, nested, qualname)\n\n        for mname, model in Pool().iterobject():\n            if not isregisteredby(model, self.module):\n                continue\n            for fname, field in model._fields.items():\n                with self.subTest(model=mname, field=fname):\n                    for attribute in [\n                            'depends', 'on_change', 'on_change_with',\n                            'selection_change_with', 'autocomplete']:\n                        depends = getattr(field, attribute, [])\n                        qualname = '\"%s\".\"%s\".\"%s\"' % (mname, fname, attribute)\n                        for depend in depends:\n                            test_depend_exists(model, depend, qualname)\n                            test_missing_relation(depend, depends, qualname)\n                            test_parent_empty(depend, qualname)\n                            if attribute != 'depends':\n                                test_missing_parent(\n                                    model, depend, depends, qualname)\n\n    @with_transaction()\n    def test_field_methods(self):\n        'Test field methods'\n        def test_methods(mname, model, attr):\n            for prefixes in [['default_'],\n                    ['on_change_', 'on_change_with_'],\n                    ['order_'], ['domain_'], ['autocomplete_']]:\n                if attr in {'on_change_with', 'on_change_notify'}:\n                    continue\n                # TODO those method should be renamed\n                if attr == 'default_get':\n                    continue\n                if mname == 'ir.rule' and attr == 'domain_get':\n                    continue\n\n                # Skip if it is a field\n                if attr in model._fields:\n                    continue\n                fnames = [attr[len(prefix):] for prefix in prefixes\n                    if attr.startswith(prefix)]\n                if not fnames:\n                    continue\n                self.assertTrue(any(f in model._fields for f in fnames),\n                    msg='Field method \"%s\".\"%s\" for unknown field' % (\n                        mname, attr))\n\n                if attr.startswith('default_'):\n                    fname = attr[len('default_'):]\n                    if isinstance(model._fields[fname], fields.MultiValue):\n                        try:\n                            getattr(model, attr)(pattern=None)\n                        # get_multivalue may raise an AttributeError\n                        # if pattern is not defined on the model\n                        except AttributeError:\n                            pass\n                    else:\n                        getattr(model, attr)()\n                elif attr.startswith('order_'):\n                    model.search([], order=[(attr[len('order_'):], None)])\n                elif any(attr.startswith(p) for p in [\n                            'on_change_',\n                            'on_change_with_',\n                            'autocomplete_']):\n                    record = model()\n                    getattr(record, attr)()\n\n        for mname, model in Pool().iterobject():\n            if not isregisteredby(model, self.module):\n                continue\n            for attr in dir(model):\n                with self.subTest(model=mname, attr=attr):\n                    test_methods(mname, model, attr)\n\n    @with_transaction()\n    def test_field_relation_target(self):\n        \"Test field relation and target\"\n        pool = Pool()\n\n        def test_relation_target(mname, model, fname, field):\n            if isinstance(field, fields.One2Many):\n                Relation = field.get_target()\n                rfield = field.field\n            elif isinstance(field, fields.Many2Many):\n                Relation = field.get_relation()\n                rfield = field.origin\n            else:\n                return\n            if rfield:\n                self.assertIn(rfield, Relation._fields.keys(),\n                    msg=('Missing relation field \"%s\" on \"%s\" '\n                        'for \"%s\".\"%s\"') % (\n                        rfield, Relation.__name__, mname, fname))\n                reverse_field = Relation._fields[rfield]\n                self.assertIn(\n                    reverse_field._type, [\n                        'reference', 'many2one', 'one2one'],\n                    msg=('Wrong type for relation field \"%s\" on \"%s\" '\n                        'for \"%s\".\"%s\"') % (\n                        rfield, Relation.__name__, mname, fname))\n                if (reverse_field._type == 'many2one'\n                        and issubclass(model, ModelSQL)\n                        # Do not test table_query models\n                        # as they can manipulate their id\n                        and not callable(model.table_query)):\n                    self.assertEqual(\n                        reverse_field.model_name, model.__name__,\n                        msg=('Wrong model for relation field \"%s\" on \"%s\" '\n                            'for \"%s\".\"%s\"') % (\n                            rfield, Relation.__name__, mname, fname))\n            Target = field.get_target()\n            self.assertTrue(\n                Target,\n                msg='Missing target for \"%s\".\"%s\"' % (mname, fname))\n\n        for mname, model in pool.iterobject():\n            if not isregisteredby(model, self.module):\n                continue\n            for fname, field in model._fields.items():\n                with self.subTest(model=mname, field=fname):\n                    test_relation_target(mname, model, fname, field)\n\n    @with_transaction()\n    def test_field_relation_domain(self):\n        \"Test domain of relation fields\"\n        pool = Pool()\n        for mname, model in pool.iterobject():\n            if not isregisteredby(model, self.module):\n                continue\n            for fname, field in model._fields.items():\n                if not field.domain:\n                    continue\n                if hasattr(field, 'get_target'):\n                    Target = field.get_target()\n                else:\n                    continue\n                if not issubclass(Target, ModelStorage):\n                    continue\n                with self.subTest(model=mname, field=fname):\n                    domain = PYSONDecoder({}).decode(\n                        PYSONEncoder().encode(field.domain))\n                    Target.search(domain, limit=1)\n\n    @with_transaction()\n    def test_menu_action(self):\n        'Test that menu actions are accessible to menu\\'s group'\n        pool = Pool()\n        Menu = pool.get('ir.ui.menu')\n        ModelData = pool.get('ir.model.data')\n\n        module_menus = ModelData.search([\n                ('model', '=', 'ir.ui.menu'),\n                ('module', '=', self.module),\n                ])\n        menus = Menu.browse([mm.db_id for mm in module_menus])\n        for menu, module_menu in zip(menus, module_menus):\n            if not menu.action_keywords:\n                continue\n            menu_groups = set(menu.groups)\n            actions_groups = reduce(operator.or_,\n                (set(k.action.groups) for k in menu.action_keywords\n                    if k.keyword == 'tree_open'))\n            if not actions_groups:\n                continue\n            with self.subTest(menu=menu):\n                self.assertLessEqual(menu_groups, actions_groups,\n                    msg='Menu \"%(menu_xml_id)s\" actions are not accessible to '\n                    '%(groups)s' % {\n                        'menu_xml_id': module_menu.fs_id,\n                        'groups': ','.join(g.name\n                            for g in menu_groups - actions_groups),\n                        })\n\n    @with_transaction()\n    def test_model_access(self):\n        'Test missing default model access'\n        pool = Pool()\n        Access = pool.get('ir.model.access')\n        no_groups = {a.model.model for a in Access.search([\n                    ('group', '=', None),\n                    ])}\n\n        def has_access(Model, models):\n            if Model.__name__ in models:\n                return True\n            for field_name in Model.__access__:\n                Target = Model._fields[field_name].get_target()\n                if has_access(Target, models):\n                    return True\n        for mname, Model in pool.iterobject():\n            if has_access(Model, no_groups):\n                no_groups.add(mname)\n\n        with_groups = {a.model.model for a in Access.search([\n                    ('group', '!=', None),\n                    ])}\n\n        self.assertGreaterEqual(no_groups, with_groups,\n            msg='Model \"%(models)s\" are missing a default access' % {\n                'models': list(with_groups - no_groups),\n                })\n\n    @with_transaction()\n    def test_workflow_transitions(self):\n        'Test all workflow transitions exist'\n        for mname, model in Pool().iterobject():\n            if not isregisteredby(model, self.module):\n                continue\n            if not issubclass(model, Workflow):\n                continue\n            field = getattr(model, model._transition_state)\n            if isinstance(field.selection, (tuple, list)):\n                values = field.selection\n            else:\n                # instance method may not return all the possible values\n                if is_instance_method(model, field.selection):\n                    continue\n                values = getattr(model, field.selection)()\n            states = set(dict(values))\n            transition_states = set(chain(*model._transitions))\n            with self.subTest(model=mname):\n                self.assertLessEqual(transition_states, states,\n                    msg='Unknown transition states \"%(states)s\" '\n                    'in model \"%(model)s\". ' % {\n                        'states': list(transition_states - states),\n                        'model': model.__name__,\n                        })\n\n    @with_transaction()\n    def test_wizards(self):\n        'Test wizards are correctly defined'\n        for wizard_name, wizard in Pool().iterobject(type='wizard'):\n            if not isregisteredby(wizard, self.module, type_='wizard'):\n                continue\n            session_id, start_state, _ = wizard.create()\n            with self.subTest(wizard=wizard_name):\n                self.assertIn(start_state, wizard.states.keys(),\n                    msg='Unknown start state '\n                    '\"%(state)s\" on wizard \"%(wizard)s\"' % {\n                        'state': start_state,\n                        'wizard': wizard_name,\n                        })\n            wizard_instance = wizard(session_id)\n            for state_name, state in wizard_instance.states.items():\n                with self.subTest(wizard=wizard_name, state=state_name):\n                    if isinstance(state, StateView):\n                        # Don't test defaults as they may depend on context\n                        view = state.get_view(wizard_instance, state_name)\n                        self.assertEqual(\n                            view.get('type'), 'form',\n                            msg='Wrong view type for \"%(state)s\" '\n                            'on wizard \"%(wizard)s\"' % {\n                                'state': state_name,\n                                'wizard': wizard_name,\n                                })\n                        for button in state.get_buttons(\n                                wizard_instance, state_name):\n                            if button['state'] == wizard.end_state:\n                                continue\n                            self.assertIn(\n                                button['state'],\n                                wizard_instance.states.keys(),\n                                msg='Unknown button state from \"%(state)s\" '\n                                'on wizard \"%(wizard)s' % {\n                                    'state': state_name,\n                                    'wizard': wizard_name,\n                                    })\n                    if isinstance(state, StateAction):\n                        state.get_action()\n\n    @with_transaction()\n    def test_selection_fields(self):\n        'Test selection values'\n        for mname, model in Pool().iterobject():\n            if not isregisteredby(model, self.module):\n                continue\n            for field_name, field in model._fields.items():\n                selection = getattr(field, 'selection', None)\n                if selection is None:\n                    continue\n                selection_values = field.selection\n                if not isinstance(selection_values, (tuple, list)):\n                    sel_func = getattr(model, field.selection)\n                    if not is_instance_method(model, field.selection):\n                        selection_values = sel_func()\n                    else:\n                        record = model()\n                        selection_values = sel_func(record)\n                with self.subTest(model=mname, field=field_name):\n                    self.assertTrue(all(len(v) == 2 for v in selection_values),\n                        msg='Invalid selection values \"%(values)s\" on field '\n                        '\"%(field)s\" of model \"%(model)s\"' % {\n                            'values': selection_values,\n                            'field': field_name,\n                            'model': model.__name__,\n                            })\n\n    @with_transaction()\n    def test_function_fields(self):\n        \"Test function fields methods\"\n        for mname, model in Pool().iterobject():\n            if not isregisteredby(model, self.module):\n                continue\n            for field_name, field in model._fields.items():\n                if not isinstance(field, Function):\n                    continue\n                for func_name in [field.getter, field.setter, field.searcher]:\n                    if not func_name:\n                        continue\n                    with self.subTest(\n                            model=mname, field=field_name, function=func_name):\n                        self.assertTrue(getattr(model, func_name, None),\n                            msg=\"Missing method '%(func_name)s' \"\n                            \"on model '%(model)s' for field '%(field)s'\" % {\n                                'func_name': func_name,\n                                'model': model.__name__,\n                                'field': field_name,\n                                })\n\n    @with_transaction()\n    def test_ir_action_window(self):\n        'Test action windows are correctly defined'\n        pool = Pool()\n        ModelData = pool.get('ir.model.data')\n        ActionWindow = pool.get('ir.action.act_window')\n\n        def test_action_window(action_window):\n            if not action_window.res_model:\n                return\n            Model = pool.get(action_window.res_model)\n            for active_id, active_ids in [\n                    (None, []),\n                    (1, [1]),\n                    (1, [1, 2]),\n                    ]:\n                decoder = PYSONDecoder({\n                        'active_id': active_id,\n                        'active_ids': active_ids,\n                        'active_model': action_window.res_model,\n                        })\n                domain = decoder.decode(action_window.pyson_domain)\n                order = decoder.decode(action_window.pyson_order)\n                context = decoder.decode(action_window.pyson_context)\n                search_value = decoder.decode(action_window.pyson_search_value)\n                if action_window.context_domain:\n                    domain = ['AND', domain,\n                        decoder.decode(action_window.context_domain)]\n                with Transaction().set_context(context):\n                    Model.search(\n                        domain, order=order, limit=action_window.limit)\n                    if search_value:\n                        Model.search(search_value)\n                for action_domain in action_window.act_window_domains:\n                    if not action_domain.domain:\n                        continue\n                    Model.search(decoder.decode(action_domain.domain))\n            if action_window.context_model:\n                pool.get(action_window.context_model)\n\n        for model_data in ModelData.search([\n                    ('module', '=', self.module),\n                    ('model', '=', 'ir.action.act_window'),\n                    ]):\n            action_window = ActionWindow(model_data.db_id)\n            with self.subTest(action_window=action_window):\n                test_action_window(action_window)\n\n    @with_transaction()\n    def test_modelsingleton_inherit_order(self):\n        'Test ModelSingleton, ModelSQL, ModelStorage order in the MRO'\n        for mname, model in Pool().iterobject():\n            if not isregisteredby(model, self.module):\n                continue\n            if (not issubclass(model, ModelSingleton)\n                    or not issubclass(model, ModelSQL)):\n                continue\n            mro = inspect.getmro(model)\n            singleton_index = mro.index(ModelSingleton)\n            sql_index = mro.index(ModelSQL)\n            with self.subTest(model=mname):\n                self.assertLess(singleton_index, sql_index,\n                    msg=\"ModelSingleton must appear before ModelSQL \"\n                    \"in the parent classes of '%s'.\" % mname)\n\n    @with_transaction()\n    def test_pool_slots(self):\n        \"Test pool object has __slots__\"\n        for type_ in ['model', 'wizard', 'report']:\n            for name, cls in Pool().iterobject(type_):\n                if not isregisteredby(cls, self.module):\n                    continue\n                if getattr(cls, '__no_slots__', None):\n                    continue\n                with self.subTest(type=type_, name=name):\n                    for kls in cls.__mro__:\n                        if kls is object:\n                            continue\n                        self.assertTrue(hasattr(kls, '__slots__'),\n                            msg=\"The %s of %s '%s' has no __slots__\"\n                            % (kls, type_, name))\n\n    @with_transaction()\n    def test_buttons_registered(self):\n        'Test all buttons are registered in ir.model.button'\n        pool = Pool()\n        Button = pool.get('ir.model.button')\n        for mname, model in Pool().iterobject():\n            if not isregisteredby(model, self.module):\n                continue\n            if not issubclass(model, ModelView):\n                continue\n            ir_buttons = {b.name for b in Button.search([\n                        ('model.model', '=', model.__name__),\n                        ])}\n            buttons = set(model._buttons)\n            with self.subTest(model=mname):\n                self.assertGreaterEqual(ir_buttons, buttons,\n                    msg='The buttons \"%(buttons)s\" of Model \"%(model)s\" '\n                    'are not registered in ir.model.button.' % {\n                        'buttons': list(buttons - ir_buttons),\n                        'model': model.__name__,\n                        })\n\n    @with_transaction()\n    def test_buttons_states(self):\n        \"Test the states of buttons\"\n        pool = Pool()\n        keys = {'readonly', 'invisible', 'icon', 'pre_validate', 'depends'}\n        for mname, model in pool.iterobject():\n            if not isregisteredby(model, self.module):\n                continue\n            if not issubclass(model, ModelView):\n                continue\n            for button, states in model._buttons.items():\n                with self.subTest(model=mname, button=button):\n                    self.assertTrue(set(states).issubset(keys),\n                        msg='The button \"%(button)s\" of Model \"%(model)s\" has '\n                        'extra keys \"%(keys)s\".' % {\n                            'button': button,\n                            'model': mname,\n                            'keys': set(states) - keys,\n                            })\n\n    @with_transaction()\n    def test_xml_files(self):\n        \"Test validity of the xml files of the module\"\n        config = ConfigParser()\n        with file_open('%s/tryton.cfg' % self.module,\n                subdir='modules', mode='r', encoding='utf-8') as fp:\n            config.read_file(fp)\n        if not config.has_option('tryton', 'xml'):\n            return\n        with file_open('tryton.rng', subdir='', mode='rb') as fp:\n            rng = etree.parse(fp)\n        validator = etree.RelaxNG(etree=rng)\n        for xml_file in filter(None, config.get('tryton', 'xml').splitlines()):\n            with self.subTest(xml=xml_file):\n                with file_open('%s/%s' % (self.module, xml_file),\n                        subdir='modules', mode='rb') as fp:\n                    tree = etree.parse(fp)\n                validator.assertValid(tree)\n\n\ndef db_exist(name=DB_NAME):\n    database = backend.Database().connect()\n    return name in database.list()\n\n\ndef create_db(name=DB_NAME, lang='en'):\n    if not db_exist(name):\n        database = backend.Database()\n        database.connect()\n        connection = database.get_connection(autocommit=True)\n        try:\n            database.create(connection, name)\n        finally:\n            database.put_connection(connection, True)\n\n        database = backend.Database(name)\n        connection = database.get_connection()\n        try:\n            with connection.cursor() as cursor:\n                database.init()\n                ir_configuration = Table('ir_configuration')\n                cursor.execute(*ir_configuration.insert(\n                        [ir_configuration.language], [[lang]]))\n            connection.commit()\n        finally:\n            database.put_connection(connection)\n\n        pool = Pool(name)\n        pool.init(update=['res', 'ir'], lang=[lang])\n        with Transaction().start(name, 0):\n            User = pool.get('res.user')\n            Lang = pool.get('ir.lang')\n            language, = Lang.search([('code', '=', lang)])\n            language.translatable = True\n            language.save()\n            users = User.search([('login', '!=', 'root')])\n            User.write(users, {\n                    'language': language.id,\n                    })\n            Module = pool.get('ir.module')\n            Module.update_list()\n    else:\n        pool = Pool(name)\n        pool.init()\n\n\nclass ExtensionTestCase(unittest.TestCase):\n    extension = None\n\n    @classmethod\n    def setUpClass(cls):\n        super().setUpClass()\n        cls._activate_extension()\n\n    @classmethod\n    def tearDownClass(cls):\n        super().tearDownClass()\n        cls._deactivate_extension()\n\n    @classmethod\n    @with_transaction()\n    def _activate_extension(cls):\n        connection = Transaction().connection\n        cursor = connection.cursor()\n        cursor.execute('CREATE EXTENSION \"%s\"' % cls.extension)\n        connection.commit()\n        cls._clear_cache()\n\n    @classmethod\n    @with_transaction()\n    def _deactivate_extension(cls):\n        connection = Transaction().connection\n        cursor = connection.cursor()\n        cursor.execute('DROP EXTENSION \"%s\"' % cls.extension)\n        connection.commit()\n        cls._clear_cache()\n\n    @classmethod\n    def _clear_cache(cls):\n        backend.Database._has_proc.clear()\n\n\ndef drop_db(name=DB_NAME):\n    if db_exist(name):\n        database = backend.Database(name)\n        database.close()\n\n        with Transaction().start(\n                None, 0, close=True, autocommit=True) as transaction:\n            database.drop(transaction.connection, name)\n            Pool.stop(name)\n            Cache.drop(name)\n\n\ndef drop_create(name=DB_NAME, lang='en'):\n    if db_exist(name):\n        drop_db(name)\n    create_db(name, lang)\n\n\ndef doctest_setup(test):\n    return drop_create()\n\n\ndef doctest_teardown(test):\n    unittest.mock.patch.stopall()\n    return drop_db()\n\n\ndoctest_checker = doctest.OutputChecker()\n\n\ndef load_doc_tests(name, path, loader, tests, pattern):\n    def shouldIncludeScenario(path):\n        return (\n            loader.testNamePatterns is None\n            or any(\n                fnmatchcase(path, pattern)\n                for pattern in loader.testNamePatterns))\n    directory = os.path.dirname(path)\n    # TODO: replace by glob root_dir in Python 3.10\n    cwd = os.getcwd()\n    try:\n        os.chdir(directory)\n        for scenario in filter(\n                shouldIncludeScenario, glob.glob('*.rst')):\n            tests.addTests(doctest.DocFileSuite(\n                    scenario, package=name,\n                    tearDown=doctest_teardown, encoding='utf-8',\n                    checker=doctest_checker,\n                    optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))\n    finally:\n        os.chdir(cwd)\n    return tests\n\n\nclass TestSuite(unittest.TestSuite):\n    def run(self, *args, **kwargs):\n        while True:\n            try:\n                exist = db_exist()\n                break\n            except backend.DatabaseOperationalError as err:\n                # Retry on connection error\n                sys.stderr.write(str(err))\n                time.sleep(1)\n        result = super(TestSuite, self).run(*args, **kwargs)\n        if not exist:\n            drop_db()\n        return result\n\n\ndef load_tests(loader, tests, pattern):\n    '''\n    Return test suite for other modules\n    '''\n    return TestSuite()\n"
  },
  {
    "path": "trytond/tests/test_union.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass UnionMixinTestCase(unittest.TestCase):\n    'Test UnionMixin'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_union(self):\n        'Test union'\n        pool = Pool()\n        Union = pool.get('test.union')\n\n        for i in range(1, 4):\n            Model = pool.get('test.model.union%s' % i)\n            for j in range(3):\n                model = Model(name='%s - %s' % (i, j))\n                if hasattr(Model, 'optional'):\n                    model.optional = 'optional'\n                model.save()\n\n        self.assertEqual(len(Union.search([])), 9)\n        record, = Union.search([\n                ('name', '=', '2 - 2'),\n                ])\n        self.assertEqual(record.name, '2 - 2')\n        self.assertEqual(record.optional, None)\n\n        record, = Union.search([\n                ('optional', '=', 'optional'),\n                ], limit=1)\n        self.assertEqual(record.optional, 'optional')\n\n    @with_transaction()\n    def test_union_union(self):\n        'Test union of union'\n        pool = Pool()\n        Union = pool.get('test.union.union')\n\n        for i in range(1, 5):\n            Model = pool.get('test.model.union%s' % i)\n            for j in range(3):\n                model = Model(name='%s - %s' % (i, j))\n                model.save()\n\n        self.assertEqual(len(Union.search([])), 12)\n        record, = Union.search([\n                ('name', '=', '2 - 2'),\n                ])\n        self.assertEqual(record.name, '2 - 2')\n        record, = Union.search([\n                ('name', '=', '4 - 1'),\n                ])\n        self.assertEqual(record.name, '4 - 1')\n\n    @with_transaction()\n    def test_union_tree(self):\n        'Test union tree'\n        pool = Pool()\n        Union = pool.get('test.union.tree')\n        Model1 = pool.get('test.model.union.tree1')\n        Model2 = pool.get('test.model.union.tree2')\n\n        roots = Model1.create([{\n                    'name': 'Root1',\n                    }, {\n                    'name': 'Root2',\n                    }, {\n                    'name': 'Root3',\n                    }])\n\n        Model2.create([{\n                    'name': 'Not child',  # To shift ids\n                    }, {\n                    'name': 'Child1',\n                    'parent': roots[1].id,\n                    }, {\n                    'name': 'Child2',\n                    'parent': roots[1].id,\n                    }, {\n                    'name': 'Child3',\n                    'parent': roots[2].id,\n                    }])\n\n        uroots = Union.search([('parent', '=', None)],\n            order=[('name', 'ASC')])\n\n        self.assertEqual(len(uroots), 4)\n        names = [r.name for r in uroots]\n        self.assertEqual(names, ['Not child', 'Root1', 'Root2', 'Root3'])\n        childs = [len(r.childs) for r in uroots]\n        self.assertEqual(childs, [0, 0, 2, 1])\n        child_names = sorted((r.name for r in uroots[2].childs))\n        self.assertEqual(child_names, ['Child1', 'Child2'])\n        self.assertEqual(uroots[3].childs[0].name, 'Child3')\n"
  },
  {
    "path": "trytond/tests/test_user.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of this\n# repository contains the full copyright notices and license terms.\nimport datetime\nimport os\nimport unittest\nfrom contextlib import contextmanager\nfrom unittest.mock import ANY, Mock, patch\n\nfrom trytond.config import config\nfrom trytond.pool import Pool\nfrom trytond.res import user as user_module\nfrom trytond.res.user import PasswordError\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\nFROM = 'tryton@example.com'\n\n\n@contextmanager\ndef set_authentications(methods):\n    saved_methods = config.get('session', 'authentications')\n    config.set('session', 'authentications', methods)\n    try:\n        yield\n    finally:\n        config.set('session', 'authentications', saved_methods)\n\n\nclass UserTestCase(unittest.TestCase):\n    'Test User'\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('res')\n\n    def setUp(self):\n        methods = config.get('session', 'authentications')\n        config.set('session', 'authentications', 'password')\n        self.addCleanup(config.set, 'session', 'authentications', methods)\n\n        length = config.get('password', 'length')\n        config.set('password', 'length', '4')\n        self.addCleanup(config.set, 'password', 'length', length)\n\n        forbidden = config.get('password', 'forbidden', default='')\n        config.set(\n            'password', 'forbidden',\n            os.path.join(os.path.dirname(__file__), 'forbidden.txt'))\n        self.addCleanup(config.set, 'password', 'forbidden', forbidden)\n\n        reset_from = config.get('email', 'from', fallback='')\n        config.set('email', 'from', FROM)\n        self.addCleanup(lambda: config.set('email', 'from', reset_from))\n\n    def create_user(self, login, password, email=None):\n        pool = Pool()\n        User = pool.get('res.user')\n\n        user, = User.create([{\n                    'name': login,\n                    'login': login,\n                    'email': email,\n                    'password': password,\n                    }])\n        return user\n\n    def check_user(self, login, password):\n        pool = Pool()\n        User = pool.get('res.user')\n\n        user, = User.search([('login', '=', login)])\n        user_id = User.get_login(login, {\n                'password': password,\n                })\n        self.assertEqual(user_id, user.id)\n\n        bad_user_id = User.get_login(login, {\n                'password': password + 'wrong',\n                })\n        self.assertFalse(bad_user_id)\n\n    @with_transaction()\n    def test_test_hash(self):\n        'Test default hash password'\n        self.create_user('user', '12345')\n        self.check_user('user', '12345')\n\n    @with_transaction()\n    def test_read_password_hash(self):\n        \"Test password_hash can not be read\"\n        user = self.create_user('user', '12345')\n        self.assertIsNone(user.password_hash)\n\n    @with_transaction()\n    def test_validate_password_length(self):\n        \"Test validate password length\"\n        pool = Pool()\n        User = pool.get('res.user')\n\n        with self.assertRaises(PasswordError):\n            User.validate_password('123', [])\n        User.validate_password('1234', [])\n\n    @with_transaction()\n    def test_validate_password_forbidden(self):\n        \"Test validate password forbidden\"\n        pool = Pool()\n        User = pool.get('res.user')\n\n        with self.assertRaises(PasswordError):\n            User.validate_password('password', [])\n\n    @with_transaction()\n    def test_validate_password_name(self):\n        \"Test validate password name\"\n        pool = Pool()\n        User = pool.get('res.user')\n        user = User(name='name')\n\n        with self.assertRaises(PasswordError):\n            User.validate_password('name', [user])\n\n    @with_transaction()\n    def test_validate_password_login(self):\n        \"Test validate password login\"\n        pool = Pool()\n        User = pool.get('res.user')\n        user = User(login='login')\n\n        with self.assertRaises(PasswordError):\n            User.validate_password('login', [user])\n\n    @with_transaction()\n    def test_validate_password_email(self):\n        \"Test validate password email\"\n        pool = Pool()\n        User = pool.get('res.user')\n        user = User(email='email')\n\n        with self.assertRaises(PasswordError):\n            User.validate_password('email', [user])\n\n    @with_transaction()\n    def test_reset_password(self):\n        \"Test reset password\"\n        pool = Pool()\n        User = pool.get('res.user')\n        user_table = User.__table__()\n        transaction = Transaction()\n        cursor = transaction.connection.cursor()\n\n        user = self.create_user('user', '12345', email='user@example.com')\n\n        with patch.object(user_module, 'sendmail_transactional') as sendmail:\n            User.reset_password([user], length=8)\n            sendmail.assert_called_once_with(FROM, ['user@example.com'], ANY)\n\n        cursor.execute(*user_table.select(\n                user_table.password_hash,\n                where=user_table.id == user.id))\n        password_hash, = cursor.fetchone()\n\n        self.assertEqual(len(user.password_reset), 8)\n        self.assertTrue(user.password_reset_expire)\n        self.assertIsNone(password_hash)\n        self.check_user('user', user.password_reset)\n\n    @with_transaction()\n    def test_reset_password_expired(self):\n        \"Test reset password not working when expired\"\n        pool = Pool()\n        User = pool.get('res.user')\n\n        user = User(login='user', email='user@example.com')\n        user.save()\n\n        with patch.object(user_module, 'sendmail_transactional'):\n            User.reset_password([user], length=8)\n\n        user.password_reset_expire = (\n            datetime.datetime.now() - datetime.timedelta(10))\n        user.save()\n        self.assertFalse(User.get_login('user', {\n                    'password': user.password_reset,\n                    }))\n\n    @with_transaction()\n    def test_reset_password_with_password(self):\n        \"Test reset password not working when password is set\"\n        pool = Pool()\n        User = pool.get('res.user')\n\n        user = User(login='user', email='user@example.com')\n        user.save()\n\n        with patch.object(user_module, 'sendmail_transactional'):\n            User.reset_password([user], length=8)\n\n        user.password = '12345'\n        user.save()\n        self.check_user('user', '12345')\n        self.assertFalse(User.get_login('user', {\n                    'password': user.password_reset,\n                    }))\n\n    @with_transaction()\n    def test_authentications(self):\n        \"Test authentications\"\n        pool = Pool()\n        User = pool.get('res.user')\n\n        user = User(login='user')\n        user.save()\n\n        with patch.object(User, '_login_always',\n                Mock(return_value=user.id), create=True), \\\n                patch.object(User, '_login_different',\n                    Mock(return_value=user.id + 1), create=True), \\\n                patch.object(User, '_login_never',\n                    Mock(return_value=None), create=True):\n            for methods, result in (\n                    ('never,never', None),\n                    ('never,always', user.id),\n                    ('always,never', user.id),\n                    ('always,always', user.id),\n                    ('never+never', None),\n                    ('never+always', None),\n                    ('always+never', None),\n                    ('always+always', user.id),\n                    ('always+different', None),\n                    ):\n                with self.subTest(methods=methods, result=result):\n                    with set_authentications(methods):\n                        self.assertEqual(User.get_login('user', {}), result)\n\n    @with_transaction()\n    def test_bad_authentication_logging(self):\n        \"Test the logging of log in attempts\"\n        pool = Pool()\n        LoginAttempt = pool.get('res.user.login.attempt')\n\n        self.create_user('user', '12345')\n        self.check_user('user', '12345')\n        self.assertEqual(LoginAttempt.count('user', None), 1)\n\n    @with_transaction()\n    def test_bad_authentication_valid_cookie(self):\n        \"Test the logging of log in attempts with a valid cookie\"\n        pool = Pool()\n        User = pool.get('res.user')\n        UserDevice = pool.get('res.user.device')\n        LoginAttempt = pool.get('res.user.login.attempt')\n\n        user = self.create_user('user', '12345')\n        with Transaction().set_user(user.id):\n            cookie = UserDevice.renew(None)\n\n        User.get_login('user', {'password': '', 'device_cookie': cookie})\n        self.assertEqual(LoginAttempt.count('user', None), 0)\n        self.assertEqual(LoginAttempt.count('user', cookie), 1)\n\n    @with_transaction()\n    def test_bad_authentication_invalid_cookie(self):\n        \"Test the logging of log in attempts without a valid cookie\"\n        pool = Pool()\n        User = pool.get('res.user')\n        UserDevice = pool.get('res.user.device')\n        LoginAttempt = pool.get('res.user.login.attempt')\n\n        user = self.create_user('user', '12345')\n        with Transaction().set_user(user.id):\n            cookie = UserDevice.renew(None)\n\n        User.get_login('user', {\n                'password': '',\n                'device_cookie': cookie + 'wrong',\n                })\n        self.assertEqual(LoginAttempt.count('user', None), 1)\n        self.assertEqual(LoginAttempt.count('user', cookie), 0)\n\n    @with_transaction()\n    def test_authentication_option_ip_address(self):\n        \"Test authentication with ip_address option\"\n        pool = Pool()\n        User = pool.get('res.user')\n\n        user = User(login='user')\n        user.save()\n\n        ip_network = config.get(\n            'session', 'authentication_ip_network', default='')\n        config.set(\n            'session', 'authentication_ip_network',\n            '192.168.0.0/16,127.0.0.0/8')\n        self.addCleanup(\n            config.set, 'session', 'authentication_ip_network', ip_network)\n\n        with patch.object(User, '_login_always', create=True) as always, \\\n                patch.object(User, '_login_never', create=True) as never:\n            always.return_value = user.id\n            never.return_value = None\n\n            with set_authentications('always+never?ip_address'):\n                for address, result in [\n                        ('192.168.0.1', user.id),\n                        ('172.17.0.1', None),\n                        ('127.0.0.1', user.id),\n                        ]:\n                    with self.subTest(address=address):\n                        with Transaction().set_context(_request={\n                                    'remote_addr': address,\n                                    }):\n                            self.assertEqual(\n                                User.get_login('user', {}), result)\n\n    @with_transaction()\n    def test_authentication_option_device_cookie(self):\n        \"Test authentication with device cookie option\"\n        pool = Pool()\n        User = pool.get('res.user')\n        UserDevice = pool.get('res.user.device')\n\n        user = User(login='user')\n        user.save()\n        with Transaction().set_user(user.id):\n            cookie = UserDevice.renew(None)\n\n        with patch.object(User, '_login_always', create=True) as always, \\\n                patch.object(User, '_login_never', create=True) as never:\n            always.return_value = user.id\n            never.return_value = None\n\n            with set_authentications('always+never?device_cookie'):\n                for value, result in [\n                        (cookie, user.id),\n                        ('not cookie', None),\n                        ]:\n                    with self.subTest(cookie=value):\n                        self.assertEqual(\n                            User.get_login('user', {'device_cookie': value}),\n                            result)\n"
  },
  {
    "path": "trytond/tests/test_wizard.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of this\n# repository contains the full copyright notices and license terms.\nimport unittest\n\nfrom trytond.model.exceptions import AccessError\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\nfrom trytond.transaction import Transaction\n\n\nclass WizardTestCase(unittest.TestCase):\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    @with_transaction()\n    def test_create(self):\n        'Create Session Wizard'\n        pool = Pool()\n        Wizard = pool.get('test.test_wizard', type='wizard')\n\n        session_id, start_state, end_state = Wizard.create()\n        self.assertEqual(start_state, 'start')\n        self.assertEqual(end_state, 'end')\n        self.assertTrue(session_id)\n\n    @with_transaction()\n    def test_delete(self):\n        'Delete Session Wizard'\n        pool = Pool()\n        Wizard = pool.get('test.test_wizard', type='wizard')\n\n        session_id, _, _ = Wizard.create()\n        Wizard.delete(session_id)\n\n    @with_transaction()\n    def test_session(self):\n        'Session Wizard'\n        pool = Pool()\n        Wizard = pool.get('test.test_wizard', type='wizard')\n        Session = pool.get('ir.session.wizard')\n        Group = pool.get('res.group')\n        transaction = Transaction()\n\n        session_id, = Session.create([{}])\n        session = Wizard(session_id)\n        self.assertEqual(session.start.id, None)\n        self.assertRaises(AttributeError, getattr, session.start, 'name')\n        self.assertEqual(hasattr(session.start, 'name'), False)\n        session.start.name = 'Test'\n        self.assertRaises(AttributeError, getattr, session.start, 'user')\n        self.assertEqual(hasattr(session.start, 'user'), False)\n        session.start.user = transaction.user\n        group_a, = Group.create([{\n                    'name': 'Group A',\n                    }])\n        group_b, = Group.create([{\n                    'name': 'Group B',\n                    }])\n        session.start.groups = [\n            group_a,\n            group_b,\n            ]\n        session._save()\n        session = Wizard(session_id)\n        self.assertEqual(session.start.id, None)\n        self.assertEqual(session.start.name, 'Test')\n        self.assertEqual(session.start.user.id, transaction.user)\n        self.assertEqual(session.start.user.login, 'admin')\n        group_a, group_b = session.start.groups\n        self.assertEqual(group_a.name, 'Group A')\n        self.assertEqual(group_b.name, 'Group B')\n\n    @with_transaction()\n    def test_execute(self):\n        'Execute Wizard'\n        pool = Pool()\n        Wizard = pool.get('test.test_wizard', type='wizard')\n\n        session_id, start_state, end_state = Wizard.create()\n        result = Wizard.execute(session_id, {}, start_state)\n        self.assertEqual(list(result.keys()), ['view'])\n        self.assertEqual(result['view']['defaults'], {\n                'name': 'Test wizard',\n                })\n        self.assertEqual(result['view']['buttons'], [\n                {\n                    'state': 'end',\n                    'states': '{}',\n                    'icon': 'tryton-cancel',\n                    'default': False,\n                    'string': 'Cancel',\n                    'validate': False,\n                    },\n                {\n                    'state': 'next_',\n                    'states': '{}',\n                    'icon': 'tryton-next',\n                    'default': True,\n                    'string': 'Next',\n                    'validate': True,\n                    },\n                ])\n        result = Wizard.execute(session_id, {\n                start_state: {\n                    'name': 'Test Update',\n                    }}, 'next_')\n        self.assertEqual(len(result['actions']), 1)\n\n    @with_transaction()\n    def test_execute_without_access(self):\n        \"Execute wizard without model access\"\n        pool = Pool()\n        Wizard = pool.get('test.test_wizard', type='wizard')\n        Model = pool.get('ir.model')\n        ModelAccess = pool.get('ir.model.access')\n        model, = Model.search([('model', '=', 'test.access')])\n        ModelAccess.create([{\n                    'model': model.id,\n                    'perm_write': False,\n                    }])\n\n        session_id, start_state, end_state = Wizard.create()\n\n        with self.assertRaises(AccessError):\n            with Transaction().set_context(active_model='test.access'):\n                Wizard.execute(session_id, {}, start_state)\n\n    @with_transaction()\n    def test_execute_without_read_access(self):\n        \"Execute wizard without read access\"\n        pool = Pool()\n        Wizard = pool.get('test.test_wizard', type='wizard')\n\n        session_id, start_state, end_state = Wizard.create()\n\n        with self.assertRaises(AccessError):\n            with Transaction().set_context(\n                    active_model='test.access', active_id=1):\n                Wizard.execute(session_id, {}, start_state)\n\n    @with_transaction()\n    def test_execute_wrong_model(self):\n        \"Execute wizard on wrong model\"\n        pool = Pool()\n        Wizard = pool.get('test.test_wizard', type='wizard')\n\n        session_id, start_state, end_state = Wizard.create()\n\n        with self.assertRaises(AccessError):\n            with Transaction().set_context(\n                    active_model='test.test_wizard.start'):\n                Wizard.execute(session_id, {}, start_state)\n"
  },
  {
    "path": "trytond/tests/test_workflow.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of this\n# repository contains the full copyright notices and license terms.\n\nimport unittest\n\nfrom trytond.pool import Pool\nfrom trytond.tests.test_tryton import activate_module, with_transaction\n\n\nclass WorkflowTestCase(unittest.TestCase):\n\n    @classmethod\n    def setUpClass(cls):\n        activate_module('tests')\n\n    # TODO add test for Workflow.transition\n    @with_transaction()\n    def test_transition(self):\n        'Test transition'\n        pool = Pool()\n        Workflowed = pool.get('test.workflowed')\n\n        wkf, = Workflowed.create([{}])\n\n        Workflowed.run([wkf])\n        self.assertEqual(wkf.state, 'running')\n\n        wkf.state = 'end'\n        wkf.save()\n        Workflowed.run([wkf])\n        self.assertEqual(wkf.state, 'end')\n"
  },
  {
    "path": "trytond/tests/test_wsgi.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport unittest\nfrom unittest.mock import Mock, sentinel\n\nfrom werkzeug.test import Client\nfrom werkzeug.wrappers import Response\n\nfrom trytond.exceptions import TrytonException\nfrom trytond.wsgi import TrytondWSGI\n\n\nclass WSGIAppTestCase(unittest.TestCase):\n    'Test WSGI Application'\n\n    class TestException(TrytonException):\n        pass\n\n    def test_one_error_handler_called(self):\n        \"\"\"Test an error handler is called\n        with the app, the request and the exception.\"\"\"\n        app = TrytondWSGI()\n        spy = Mock()\n\n        @app.error_handler\n        def _handler(*args, **kwargs):\n            spy(*args, **kwargs)\n\n        exception = self.TestException('foo')\n\n        @app.route('/willfail')\n        def _route(request):\n            sentinel.request = request\n            raise exception\n\n        client = Client(app, Response)\n        _ = client.get('/willfail')\n\n        spy.assert_called_once_with(app, sentinel.request, exception)\n\n    def test_many_error_handlers_called(self):\n        \"Test many error handlers are called\"\n        app = TrytondWSGI()\n        spy1 = Mock()\n        spy2 = Mock()\n\n        @app.error_handler\n        def _handler1(*args, **kwargs):\n            spy1(*args, **kwargs)\n\n        @app.error_handler\n        def _handler2(*args, **kwargs):\n            spy2(*args, **kwargs)\n\n        exception = self.TestException('foo')\n\n        @app.route('/willfail')\n        def _route(request):\n            sentinel.request = request\n            raise exception\n\n        client = Client(app, Response)\n        _ = client.get('/willfail')\n\n        spy1.assert_called_once_with(app, sentinel.request, exception)\n        spy2.assert_called_once_with(app, sentinel.request, exception)\n\n    def test_class_error_handler_called(self):\n        \"Test class error handlers can be used\"\n        app = TrytondWSGI()\n        spy = Mock()\n\n        class ErrorHandler():\n            def __call__(self, *args, **kwargs):\n                spy(*args, **kwargs)\n\n        app.error_handler(ErrorHandler())\n\n        exception = self.TestException('foo')\n\n        @app.route('/willfail')\n        def _route(request):\n            sentinel.request = request\n            raise exception\n\n        client = Client(app, Response)\n        _ = client.get('/willfail')\n\n        spy.assert_called_once_with(app, sentinel.request, exception)\n\n    def test_error_handlers_last_response(self):\n        \"Test last handler response is used\"\n        app = TrytondWSGI()\n\n        @app.error_handler\n        def _handler1(*args, **kwargs):\n            return Response(b'bar')\n\n        @app.error_handler\n        def _handler2(*args, **kwargs):\n            return Response(b'baz', status=418)\n\n        @app.route('/willfail')\n        def _route(request):\n            raise self.TestException('foo')\n\n        client = Client(app, Response)\n        response = client.get('/willfail')\n\n        self.assertEqual(next(response.response), b'baz')\n        self.assertEqual(response.status, \"418 I'M A TEAPOT\")\n"
  },
  {
    "path": "trytond/tests/tools.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom proteus import Model, Wizard\nfrom proteus import config as pconfig\n\nfrom .test_tryton import backup_db_cache, drop_create, restore_db_cache\n\n__all__ = ['activate_modules', 'set_user']\n\n\ndef activate_modules(modules):\n    if isinstance(modules, str):\n        modules = [modules]\n    cache_name = '-'.join(modules)\n    if restore_db_cache(cache_name):\n        return _get_config()\n    drop_create()\n\n    cfg = _get_config()\n    Module = Model.get('ir.module')\n    records = Module.find([\n            ('name', 'in', modules),\n            ])\n    assert len(records) == len(modules)\n    Module.click(records, 'activate')\n    Wizard('ir.module.activate_upgrade').execute('upgrade')\n\n    backup_db_cache(cache_name)\n    return cfg\n\n\ndef _get_config():\n    cfg = pconfig.set_trytond()\n    cfg.pool.test = True\n    return cfg\n\n\ndef set_user(user, config=None):\n    if not config:\n        config = pconfig.get_config()\n    User = Model.get('res.user', config=config)\n    config.user = int(user)\n    config._context = User.get_preferences(True, {})\n"
  },
  {
    "path": "trytond/tests/tree.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nfrom trytond.model import ModelSQL, fields, tree\nfrom trytond.pool import Pool\n\n\nclass Tree(tree(separator=' / '), ModelSQL):\n    \"Tree\"\n    __name__ = 'test.tree'\n    name = fields.Char(\"Name\")\n    parent = fields.Many2One('test.tree', \"Parent\")\n\n\nclass TreeWildcard(tree(separator='\\\\'), ModelSQL):\n    \"Tree separator wildcard\"\n    __name__ = 'test.tree_wildcard'\n    name = fields.Char(\"Name\")\n    parent = fields.Many2One('test.tree_wildcard', \"Parent\")\n\n\nclass Polytree(tree(parent='parents'), ModelSQL):\n    \"PolyTree\"\n    __name__ = 'test.polytree'\n    name = fields.Char(\"Name\")\n    parents = fields.Many2Many(\n        'test.polytree.edge', 'parent', 'child', \"Parents\")\n\n\nclass PolytreeEdge(ModelSQL):\n    \"Polytree Edge\"\n    __name__ = 'test.polytree.edge'\n    parent = fields.Many2One('test.polytree', \"Parent\")\n    child = fields.Many2One('test.polytree', \"Child\")\n\n\ndef register(module):\n    Pool.register(\n        Tree,\n        TreeWildcard,\n        Polytree,\n        PolytreeEdge,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/trigger.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.model import ModelSQL, fields\nfrom trytond.pool import Pool, PoolMeta\n\nTRIGGER_LOGS = []\n\n\nclass Trigger(metaclass=PoolMeta):\n    __name__ = 'ir.trigger'\n\n    @classmethod\n    def __setup__(cls):\n        super().__setup__()\n        cls.action.selection.append(\n            ('test.trigger_action|trigger', \"Test Trigger\"))\n\n\nclass Triggered(ModelSQL):\n    'Triggered'\n    __name__ = 'test.triggered'\n    name = fields.Char('Name')\n\n\nclass TriggerAction(ModelSQL):\n    'Trigger Action Model'\n    __name__ = 'test.trigger_action'\n\n    @staticmethod\n    def trigger(records, trigger):\n        '''\n        Trigger function for test\n        '''\n        TRIGGER_LOGS.append((records, trigger))\n\n\ndef register(module):\n    Pool.register(\n        Trigger,\n        Triggered,\n        TriggerAction,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/tryton.cfg",
    "content": "[tryton]\ndepends:\n    ir\n    res\nxml:\n    import_data.xml\n    sequence.xml\n    workflow.xml\n    wizard.xml\n    modelview.xml\n    field_function.xml\n    message.xml\n"
  },
  {
    "path": "trytond/tests/wizard.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom trytond.model import ModelSQL, ModelView, fields\nfrom trytond.pool import Pool\nfrom trytond.transaction import Transaction\nfrom trytond.wizard import (\n    Button, StateAction, StateTransition, StateView, Wizard)\n\n\nclass TestWizardStart(ModelSQL, ModelView):\n    'Test Wizard'\n    __name__ = 'test.test_wizard.start'\n    name = fields.Char('Test me')\n    user = fields.Many2One('res.user', 'User')\n    groups = fields.Many2Many('res.group', None, None, 'Groups')\n\n    @staticmethod\n    def default_user():\n        return Transaction().user\n\n\nclass TestWizard(Wizard):\n    'Test Wizard'\n    __name__ = 'test.test_wizard'\n    start = StateView('test.test_wizard.start',\n        'tests.test_wizard_start_view_form', [\n            Button('Cancel', 'end', 'tryton-cancel'),\n            Button('Next', 'next_', 'tryton-next', default=True),\n            ])\n    next_ = StateTransition()\n    action = StateAction('ir.act_menu_tree')\n\n    @staticmethod\n    def default_start(fields):\n        return {\n            'name': 'Test wizard',\n            }\n\n    @staticmethod\n    def transition_next_():\n        return 'action'\n\n    @staticmethod\n    def do_action(action):\n        return action, {}\n\n    @staticmethod\n    def transition_action():\n        return 'end'\n\n\ndef register(module):\n    Pool.register(\n        TestWizardStart,\n        module=module, type_='model')\n    Pool.register(\n        TestWizard,\n        module=module, type_='wizard')\n"
  },
  {
    "path": "trytond/tests/wizard.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of\nthis repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n        <record model=\"ir.ui.view\" id=\"test_wizard_start_view_form\">\n            <field name=\"model\">test.test_wizard.start</field>\n            <field name=\"type\">form</field>\n            <field name=\"arch\" type=\"xml\">\n                <![CDATA[\n                <form>\n                    <label name=\"name\"/>\n                    <field name=\"name\"/>\n                </form>\n                ]]>\n            </field>\n        </record>\n\n        <record model=\"ir.action.wizard\" id=\"test_wizard\">\n            <field name=\"name\">Test Wizard</field>\n            <field name=\"wiz_name\">test.test_wizard</field>\n            <field name=\"model\">test.access</field>\n        </record>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/tests/workflow.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of this\n# repository contains the full copyright notices and license terms.\n\nfrom trytond.model import ModelSQL, Workflow, fields\nfrom trytond.pool import Pool\n\n\nclass WorkflowedModel(Workflow, ModelSQL):\n    'Workflowed Model'\n    __name__ = 'test.workflowed'\n    state = fields.Selection([\n            ('start', 'Start'),\n            ('running', 'Running'),\n            ('end', 'End'),\n            ], 'State')\n\n    @classmethod\n    def __setup__(cls):\n        super(WorkflowedModel, cls).__setup__()\n        cls._transitions |= set((\n                ('start', 'running'),\n                ))\n\n    @staticmethod\n    def default_state():\n        return 'start'\n\n    @classmethod\n    @Workflow.transition('running')\n    def run(cls, records):\n        pass\n\n\ndef register(module):\n    Pool.register(\n        WorkflowedModel,\n        module=module, type_='model')\n"
  },
  {
    "path": "trytond/tests/workflow.xml",
    "content": "<?xml version=\"1.0\"?>\n<!-- This file is part of Tryton.  The COPYRIGHT file at the top level of this\n     repository contains the full copyright notices and license terms. -->\n<tryton>\n    <data>\n    </data>\n</tryton>\n"
  },
  {
    "path": "trytond/tools/__init__.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\ntry:\n    from functools import cached_property\nexcept ImportError:\n    from werkzeug.utils import cached_property\n\nfrom .decimal_ import decistmt\nfrom .misc import (\n    escape_wildcard, file_open, find_dir, find_path, firstline,\n    get_smtp_server, grouped_slice, is_full_text, is_instance_method,\n    lstrip_wildcard, reduce_domain, reduce_ids, remove_forbidden_chars,\n    resolve, rstrip_wildcard, slugify, sortable_values, sql_pairing,\n    strip_wildcard, unescape_wildcard)\n\n\nclass ClassProperty(property):\n    def __get__(self, cls, owner):\n        return self.fget.__get__(None, owner)()\n\n\ndef cursor_dict(cursor, size=None):\n    size = cursor.arraysize if size is None else size\n    while True:\n        rows = cursor.fetchmany(size)\n        if not rows:\n            break\n        for row in rows:\n            yield {d[0]: v for d, v in zip(cursor.description, row)}\n\n\n__all__ = [\n    ClassProperty,\n    cached_property,\n    cursor_dict,\n    decistmt,\n    escape_wildcard,\n    file_open,\n    find_dir,\n    find_path,\n    firstline,\n    get_smtp_server,\n    grouped_slice,\n    is_full_text,\n    is_instance_method,\n    lstrip_wildcard,\n    reduce_domain,\n    reduce_ids,\n    remove_forbidden_chars,\n    resolve,\n    rstrip_wildcard,\n    slugify,\n    sortable_values,\n    sql_pairing,\n    strip_wildcard,\n    unescape_wildcard,\n    ]\n"
  },
  {
    "path": "trytond/tools/decimal_.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom io import BytesIO\nfrom tokenize import NAME, NUMBER, OP, STRING, tokenize, untokenize\n\n# code snippet taken from http://docs.python.org/library/tokenize.html\n\n\ndef decistmt(s):\n    \"\"\"Substitute Decimals for floats or integers in a string of statements.\n\n    >>> from decimal import Decimal\n    >>> s = 'print(+21.3e-5*-.1234/81.7)'\n    >>> decistmt(s)\n    \"print (+Decimal ('21.3e-5')*-Decimal ('.1234')/Decimal ('81.7'))\"\n\n    The format of the exponent is inherited from the platform C library.\n    Known cases are \"e-007\" (Windows) and \"e-07\" (not Windows).  Since\n    we're only showing 12 digits, and the 13th isn't close to 5, the\n    rest of the output should be platform-independent.\n\n    >>> exec(s) #doctest: +ELLIPSIS\n    -3.217160342717258e-0...7\n\n    Output from calculations with Decimal should be identical across all\n    platforms.\n\n    >>> exec(decistmt(s))\n    -3.217160342717258261933904529E-7\n    >>> decistmt('0')\n    \"Decimal ('0')\"\n    >>> decistmt('1.23')\n    \"Decimal ('1.23')\"\n    \"\"\"\n    result = []\n    g = tokenize(BytesIO(s.encode('utf-8')).readline)  # tokenize the string\n    for toknum, tokval, _, _, _ in g:\n        if toknum == NUMBER:  # replace NUMBER tokens\n            result.extend([\n                (NAME, 'Decimal'),\n                (OP, '('),\n                (STRING, repr(tokval)),\n                (OP, ')')\n            ])\n        else:\n            result.append((toknum, tokval))\n    return untokenize(result).decode('utf-8')\n"
  },
  {
    "path": "trytond/tools/domain_inversion.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport datetime\nimport operator\nimport re\nfrom collections import defaultdict\nfrom functools import partial, reduce\n\n\ndef sql_like(value, pattern, ignore_case=True):\n    flag = re.IGNORECASE if ignore_case else 0\n\n    escape = False\n    chars = []\n    for char in re.split(r'(\\\\|.)', pattern)[1::2]:\n        if escape:\n            if char in ('%', '_'):\n                chars.append(char)\n            else:\n                chars.extend(['\\\\', char])\n            escape = False\n        elif char == '\\\\':\n            escape = True\n        elif char == '_':\n            chars.append('.')\n        elif char == '%':\n            chars.append('.*')\n        else:\n            chars.append(re.escape(char))\n\n    regexp = re.compile(''.join(chars), flag)\n    return bool(regexp.fullmatch(value))\n\n\nlike = partial(sql_like, ignore_case=False)\nilike = partial(sql_like, ignore_case=True)\n\n\ndef in_(a, b):\n    if isinstance(a, (list, tuple)):\n        if isinstance(b, (list, tuple)):\n            return any(operator.contains(b, x) for x in a)\n        else:\n            return operator.contains(a, b)\n    else:\n        return operator.contains(b, a)\n\n\nOPERATORS = defaultdict(lambda: lambda a, b: True)\nOPERATORS.update({\n        '=': operator.eq,\n        '>': operator.gt,\n        '<': operator.lt,\n        '<=': operator.le,\n        '>=': operator.ge,\n        '!=': operator.ne,\n        'in': in_,\n        'not in': lambda a, b: not in_(a, b),\n        'ilike': ilike,\n        'not ilike': lambda a, b: not ilike(a, b),\n        'like': like,\n        'not like': lambda a, b: not like(a, b),\n        })\n\n\ndef locale_part(expression, field_name, locale_name='id'):\n    if expression == field_name:\n        return locale_name\n    if '.' in expression:\n        fieldname, local = expression.split('.', 1)\n        return local\n    return expression\n\n\ndef is_leaf(expression):\n    return (isinstance(expression, (list, tuple))\n        and len(expression) > 2\n        and isinstance(expression[1], str))\n\n\ndef constrained_leaf(part, boolop=operator.and_):\n    field, operand, value = part[:3]\n    if operand == '=' and boolop == operator.and_:\n        # We should consider that other domain inversion will set a correct\n        # value to this field\n        return True\n    return False\n\n\ndef eval_leaf(part, context, boolop=operator.and_):\n    field, operand, value = part[:3]\n    if '.' in field:\n        # In the case where the leaf concerns a m2o then having a value in the\n        # evaluation context is deemed suffisant\n        return bool(context.get(field.split('.')[0]))\n    context_field = context.get(field)\n    if (operand not in {'=', '!='}\n            and (context_field is None or value is None)\n            and not (operand in {'in', 'not in'}\n                and context_field is None\n                and (isinstance(value, (list, tuple)) and None in value))):\n        return\n    if isinstance(context_field, datetime.date) and not value:\n        if isinstance(context_field, datetime.datetime):\n            value = datetime.datetime.min\n        else:\n            value = datetime.date.min\n    if isinstance(value, datetime.date) and not context_field:\n        if isinstance(value, datetime.datetime):\n            context_field = datetime.datetime.min\n        else:\n            context_field = datetime.date.min\n    if isinstance(context_field, (list, tuple)) and value is None:\n        value = type(context_field)()\n    if (isinstance(context_field, str)\n            and isinstance(value, (list, tuple))):\n        try:\n            value = '%s,%s' % tuple(value)\n        except TypeError:\n            pass\n    elif (isinstance(context_field, (list, tuple))\n            and isinstance(value, str)):\n        try:\n            context_field = '%s,%s' % tuple(context_field)\n        except TypeError:\n            pass\n    elif ((isinstance(context_field, list) and isinstance(value, tuple))\n            or (isinstance(context_field, tuple) and isinstance(value, list))):\n        context_field = list(context_field)\n        value = list(value)\n    if (operand in ('=', '!=')\n            and isinstance(context_field, (list, tuple))\n            and isinstance(value, int)):\n        operand = {\n            '=': 'in',\n            '!=': 'not in',\n            }[operand]\n    try:\n        return OPERATORS[operand](context_field, value)\n    except TypeError:\n        return False\n\n\ndef inverse_leaf(domain):\n    if domain in ('AND', 'OR'):\n        return domain\n    elif is_leaf(domain):\n        if 'child_of' in domain[1] and '.' not in domain[0]:\n            if len(domain) == 3:\n                return domain\n            else:\n                return [domain[3]] + list(domain[1:])\n        return domain\n    else:\n        return list(map(inverse_leaf, domain))\n\n\ndef filter_leaf(domain, field, model):\n    if domain in ('AND', 'OR'):\n        return domain\n    elif is_leaf(domain):\n        if domain[0].startswith(field) and len(domain) > 3:\n            if domain[3] != model:\n                return ('id', '=', None)\n        return domain\n    else:\n        return [filter_leaf(d, field, model) for d in domain]\n\n\ndef prepare_reference_domain(domain, reference):\n    \"convert domain to replace reference fields by their local part\"\n\n    def value2reference(value):\n        model, ref_id = None, None\n        if isinstance(value, str) and ',' in value:\n            model, ref_id = value.split(',', 1)\n            if ref_id != '%':\n                try:\n                    ref_id = int(ref_id)\n                except ValueError:\n                    model, ref_id = None, value\n        elif (isinstance(value, (list, tuple))\n                and len(value) == 2\n                and isinstance(value[0], str)\n                and (isinstance(value[1], int) or value[1] == '%')):\n            model, ref_id = value\n        else:\n            ref_id = value\n        return model, ref_id\n\n    if domain in ('AND', 'OR'):\n        return domain\n    elif is_leaf(domain):\n        if domain[0] == reference:\n            if domain[1] in {'=', '!='}:\n                model, ref_id = value2reference(domain[2])\n                if model is not None:\n                    if ref_id == '%':\n                        if domain[1] == '=':\n                            return [reference + '.id', '!=', None, model]\n                        else:\n                            return [reference, 'not like', domain[2]]\n                    return [reference + '.id', domain[1], ref_id, model]\n            elif domain[1] in {'in', 'not in'}:\n                model_values = {}\n                for value in domain[2]:\n                    model, ref_id = value2reference(value)\n                    if model is None:\n                        break\n                    model_values.setdefault(model, []).append(ref_id)\n                else:\n                    new_domain = ['OR'] if domain[1] == 'in' else ['AND']\n                    for model, ref_ids in model_values.items():\n                        if '%' in ref_ids:\n                            if domain[1] == 'in':\n                                new_domain.append(\n                                    [reference + '.id', '!=', None, model])\n                            else:\n                                new_domain.append(\n                                    [reference, 'not like', model + ',%'])\n                        else:\n                            new_domain.append(\n                                [reference + '.id', domain[1], ref_ids, model])\n                    return new_domain\n            return []\n        return domain\n    else:\n        return [prepare_reference_domain(d, reference) for d in domain]\n\n\ndef extract_reference_models(domain, field_name):\n    \"returns the set of the models available for field_name\"\n    if domain in ('AND', 'OR'):\n        return set()\n    elif is_leaf(domain):\n        local_part = domain[0].split('.', 1)[0]\n        if local_part == field_name and len(domain) > 3:\n            return {domain[3]}\n        return set()\n    else:\n        return reduce(operator.or_,\n            (extract_reference_models(d, field_name) for d in domain))\n\n\ndef eval_domain(domain, context, boolop=operator.and_):\n    \"compute domain boolean value according to the context\"\n    if is_leaf(domain):\n        return eval_leaf(domain, context, boolop=boolop)\n    elif not domain and boolop is operator.and_:\n        return True\n    elif not domain and boolop is operator.or_:\n        return False\n    elif domain[0] == 'AND':\n        return eval_domain(domain[1:], context)\n    elif domain[0] == 'OR':\n        return eval_domain(domain[1:], context, operator.or_)\n    else:\n        return boolop(bool(eval_domain(domain[0], context)),\n            bool(eval_domain(domain[1:], context, boolop)))\n\n\ndef localize_domain(domain, field_name=None, strip_target=False):\n    \"returns only locale part of domain. eg: langage.code -> code\"\n    if domain in ('AND', 'OR', True, False):\n        return domain\n    elif is_leaf(domain):\n        if 'child_of' in domain[1]:\n            if domain[0].count('.'):\n                _, target_part = domain[0].split('.', 1)\n                return [target_part] + list(domain[1:])\n            if len(domain) == 3:\n                return domain\n            else:\n                return [domain[3]] + list(domain[1:-1])\n        locale_name = 'id'\n        if isinstance(domain[2], str):\n            locale_name = 'rec_name'\n        n = 3 if strip_target else 4\n        return [locale_part(domain[0], field_name, locale_name)] \\\n            + list(domain[1:n]) + list(domain[4:])\n    else:\n        return [localize_domain(part, field_name, strip_target)\n            for part in domain]\n\n\ndef bool_operator(domain):\n    \"Returns the boolean operator used by a domain\"\n    bool_op = 'AND'\n    if domain and domain[0] in ['AND', 'OR']:\n        bool_op = domain[0]\n    return bool_op\n\n\ndef simplify_nested(domain):\n    \"\"\"Simplify extra domain markers\"\"\"\n    if not domain:\n        return []\n    elif is_leaf(domain):\n        return [domain]\n    elif domain in ['OR', 'AND']:\n        return [domain]\n    elif isinstance(domain, list) and len(domain) == 1:\n        return simplify_nested(domain[0])\n    else:\n        simplified = []\n        domain_op = bool_operator(domain)\n        for branch in domain:\n            simplified_branch = simplify_nested(branch)\n            if (bool_operator(simplified_branch) == domain_op\n                    or len(simplified_branch) == 1):\n                if (simplified\n                        and simplified_branch\n                        and simplified_branch[0] in ['AND', 'OR']):\n                    simplified.extend(simplified_branch[1:])\n                else:\n                    simplified.extend(simplified_branch)\n            else:\n                simplified.append(simplified_branch)\n        return simplified\n\n\ndef simplify_duplicate(domain):\n    \"\"\"Remove duplicates subdomain from domain\"\"\"\n    dedup_branches = []\n    bool_op = None\n    if domain[0] in ['AND', 'OR']:\n        bool_op, *domain = domain\n    for branch in domain:\n        simplified_branch = simplify(branch)\n        if not simplified_branch:\n            if bool_op == 'OR':\n                return []\n            else:\n                continue\n        elif simplified_branch not in dedup_branches:\n            dedup_branches.append(simplified_branch)\n    if bool_op and len(dedup_branches) > 1:\n        dedup_branches.insert(0, bool_op)\n    return dedup_branches\n\n\ndef simplify(domain):\n    \"\"\"Remove duplicate expressions and useless OR/AND\"\"\"\n    if is_leaf(domain):\n        return [domain]\n    elif not domain:\n        return domain\n    else:\n        return simplify_nested(simplify_duplicate(domain))\n\n\ndef merge(domain, domoperator=None):\n    if not domain or domain in ('AND', 'OR'):\n        return []\n    domain_type = 'OR' if domain[0] == 'OR' else 'AND'\n    if is_leaf(domain):\n        return [domain]\n    elif domoperator is None:\n        return [domain_type] + reduce(operator.add,\n                [merge(e, domain_type) for e in domain])\n    elif domain_type == domoperator:\n        return reduce(operator.add, [merge(e, domain_type) for e in domain])\n    else:\n        # without setting the domoperator\n        return [merge(domain)]\n\n\ndef concat(*domains, **kwargs):\n    domoperator = kwargs.get('domoperator')\n    result = []\n    if domoperator:\n        result.append(domoperator)\n    for domain in domains:\n        if domain:\n            result.append(domain)\n    return simplify(merge(result))\n\n\ndef unique_value(domain):\n    \"Return if unique, the field and the value\"\n    if (isinstance(domain, list)\n            and len(domain) == 1):\n        domain, = domain\n        name = domain[0]\n        value = domain[2]\n        count = 0\n        if len(domain) == 4 and name[-3:] == '.id':\n            count = 1\n            model = domain[3]\n            value = [model, value]\n        if name.count('.') == count and domain[1] == '=':\n            return True, domain[1], value\n    return False, None, None\n\n\ndef parse(domain):\n    if is_leaf(domain):\n        return domain\n    elif not domain:\n        return And([])\n    elif domain[0] == 'OR':\n        return Or(domain[1:])\n    else:\n        return And(domain[1:] if domain[0] == 'AND' else domain)\n\n\ndef domain_inversion(domain, symbol, context=None):\n    \"\"\"compute an inversion of the domain eventually the context is used to\n    simplify the expression\"\"\"\n    if context is None:\n        context = {}\n    expression = parse(domain)\n    if symbol not in expression.variables:\n        return True\n    return expression.inverse(symbol, context)\n\n\nclass And(object):\n\n    def __init__(self, expressions):\n        self.branches = list(map(parse, expressions))\n        self.variables = set()\n        for expression in self.branches:\n            if is_leaf(expression):\n                self.variables.add(self.base(expression[0]))\n            elif isinstance(expression, And):\n                self.variables |= expression.variables\n\n    def base(self, expression):\n        if '.' not in expression:\n            return expression\n        else:\n            return expression.split('.')[0]\n\n    def inverse(self, symbol, context):\n        result = []\n        for part in self.branches:\n            if isinstance(part, And):\n                part_inversion = part.inverse(symbol, context)\n                evaluated = isinstance(part_inversion, bool)\n                if symbol not in part.variables:\n                    continue\n                if not evaluated:\n                    result.append(part_inversion)\n                elif part_inversion:\n                    continue\n                else:\n                    return False\n            elif is_leaf(part) and self.base(part[0]) == symbol:\n                result.append(part)\n            else:\n                field = part[0]\n                if (field not in context\n                        or field in context\n                        and (eval_leaf(part, context, operator.and_)\n                            or constrained_leaf(part, operator.and_))):\n                    result.append(True)\n                else:\n                    return False\n\n        result = [e for e in result if e is not True]\n        if result == []:\n            return True\n        else:\n            return simplify(result)\n\n\nclass Or(And):\n\n    def inverse(self, symbol, context):\n        result = []\n        known_variables = set(context.keys())\n        if not known_variables >= (self.variables - {symbol}):\n            # In this case we don't know enough about this OR part, we\n            # consider it to be True (because people will have the constraint\n            # on this part later).\n            return True\n        for part in self.branches:\n            if isinstance(part, And):\n                part_inversion = part.inverse(symbol, context)\n                evaluated = isinstance(part_inversion, bool)\n                if symbol not in part.variables:\n                    if evaluated and part_inversion:\n                        return True\n                    continue\n                if not evaluated:\n                    result.append(part_inversion)\n                elif part_inversion:\n                    return True\n                else:\n                    continue\n            elif is_leaf(part) and self.base(part[0]) == symbol:\n                result.append(part)\n            else:\n                field = part[0]\n                field = self.base(field)\n                if (field in context\n                        and (eval_leaf(part, context, operator.or_)\n                            or constrained_leaf(part, operator.or_))):\n                    return True\n                elif (field in context\n                        and not eval_leaf(part, context, operator.or_)):\n                    result.append(False)\n\n        result = [e for e in result if e is not False]\n        if result == []:\n            return False\n        else:\n            return simplify(['OR'] + result)\n"
  },
  {
    "path": "trytond/tools/email_.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom email.utils import parseaddr\n\n\ndef _domainaddr(address):\n    _, email = parseaddr(address)\n    if '@' in email:\n        return email.split('@', 1)[1]\n\n\ndef set_from_header(message, sender, from_):\n    \"Fill email headers to appear at best from the address\"\n    if parseaddr(sender)[1] != parseaddr(from_)[1]:\n        if _domainaddr(sender) == _domainaddr(from_):\n            message['From'] = from_\n            message['Sender'] = sender\n        else:\n            message['From'] = sender\n            message['On-Behalf-Of'] = from_\n            message['Reply-To'] = from_\n    else:\n        message['From'] = from_\n"
  },
  {
    "path": "trytond/tools/gevent.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\n\ndef is_gevent_monkey_patched():\n    try:\n        from gevent import monkey\n    except ImportError:\n        return False\n    else:\n        return monkey.is_module_patched('__builtin__')\n"
  },
  {
    "path": "trytond/tools/immutabledict.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the toplevel of this\n# repository contains the full copyright notices and license terms.\n\nclass ImmutableDict(dict):\n\n    __slots__ = ()\n\n    def _not_allowed(cls, *args, **kwargs):\n        raise TypeError(\"Operation not allowed on ImmutableDict\")\n\n    __setitem__ = _not_allowed\n    __delitem__ = _not_allowed\n    __ior__ = _not_allowed\n    clear = _not_allowed\n    pop = _not_allowed\n    popitem = _not_allowed\n    setdefault = _not_allowed\n    update = _not_allowed\n\n    del _not_allowed\n"
  },
  {
    "path": "trytond/tools/misc.py",
    "content": "# -*- coding: utf-8 -*-\n# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\"\"\"\nMiscelleanous tools used by tryton\n\"\"\"\nimport importlib\nimport io\nimport os\nimport re\nimport sys\nimport types\nimport unicodedata\nimport warnings\nfrom array import array\nfrom collections.abc import Sized\nfrom functools import wraps\nfrom itertools import islice\n\nfrom sql import Literal\nfrom sql.conditionals import Case\nfrom sql.operators import Or\n\nfrom trytond.const import OPERATORS\n\n\ndef file_open(name, mode=\"r\", subdir='modules', encoding=None):\n    \"Open a file from the root directory, using subdir folder\"\n    path = find_path(name, subdir)\n    return io.open(path, mode, encoding=encoding)\n\n\ndef find_path(name, subdir='modules', _test=os.path.isfile):\n    \"Return path from the root directory, using subdir folder\"\n    from trytond.modules import EGG_MODULES\n    root_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))\n\n    def secure_join(root, *paths):\n        \"Join paths and ensure it still below root\"\n        path = os.path.join(root, *paths)\n        path = os.path.normpath(path)\n        if not path.startswith(os.path.join(root, '')):\n            raise IOError(\"Permission denied: %s\" % name)\n        return path\n\n    egg_name = False\n    if subdir == 'modules':\n        module_name = name.split(os.sep)[0]\n        if module_name in EGG_MODULES:\n            epoint = EGG_MODULES[module_name]\n            mod_path = os.path.join(epoint.dist.location,\n                    *epoint.module_name.split('.')[:-1])\n            mod_path = os.path.abspath(mod_path)\n            egg_name = secure_join(mod_path, name)\n            if not _test(egg_name):\n                # Find module in path\n                for path in sys.path:\n                    mod_path = os.path.join(path,\n                            *epoint.module_name.split('.')[:-1])\n                    mod_path = os.path.abspath(mod_path)\n                    egg_name = secure_join(mod_path, name)\n                    if _test(egg_name):\n                        break\n                if not _test(egg_name):\n                    # When testing modules from setuptools location is the\n                    # module directory\n                    egg_name = secure_join(\n                        os.path.dirname(epoint.dist.location), name)\n\n    if subdir:\n        if (subdir == 'modules'\n                and (name.startswith('ir' + os.sep)\n                    or name.startswith('res' + os.sep)\n                    or name.startswith('tests' + os.sep))):\n            name = secure_join(root_path, name)\n        else:\n            name = secure_join(root_path, subdir, name)\n    else:\n        name = secure_join(root_path, name)\n\n    for path in [name, egg_name]:\n        if path and _test(path):\n            return path\n    else:\n        raise FileNotFoundError(\"No such file or directory: %r\" % name)\n\n\ndef find_dir(name, subdir='modules'):\n    \"Return directory from the root directory, using subdir folder\"\n    return find_path(name, subdir=subdir, _test=os.path.isdir)\n\n\ndef get_smtp_server():\n    \"\"\"\n    Instanciate, configure and return a SMTP or SMTP_SSL instance from\n    smtplib.\n    :return: A SMTP instance. The quit() method must be call when all\n    the calls to sendmail() have been made.\n    \"\"\"\n    from trytond.sendmail import get_smtp_server\n    warnings.warn(\n        'get_smtp_server is deprecated use trytond.sendmail',\n        DeprecationWarning)\n    return get_smtp_server()\n\n\ndef reduce_ids(field, ids):\n    '''\n    Return a small SQL expression for the list of ids and the sql column\n    '''\n    if __debug__:\n        def strict_int(value):\n            assert not isinstance(value, float) or value.is_integer(), \\\n                \"ids must be integer\"\n            return int(value)\n    else:\n        strict_int = int\n    ids = list(map(strict_int, ids))\n    if not ids:\n        return Literal(False)\n    ids.sort()\n    prev = ids.pop(0)\n    continue_list = [prev, prev]\n    discontinue_list = array('l')\n    sql = Or()\n    for i in ids:\n        if i == prev:\n            continue\n        if i != prev + 1:\n            if continue_list[-1] - continue_list[0] < 5:\n                discontinue_list.extend([continue_list[0] + x for x in\n                    range(continue_list[-1] - continue_list[0] + 1)])\n            else:\n                sql.append((field >= continue_list[0])\n                    & (field <= continue_list[-1]))\n            continue_list = []\n        continue_list.append(i)\n        prev = i\n    if continue_list[-1] - continue_list[0] < 5:\n        discontinue_list.extend([continue_list[0] + x for x in\n            range(continue_list[-1] - continue_list[0] + 1)])\n    else:\n        sql.append((field >= continue_list[0]) & (field <= continue_list[-1]))\n    if discontinue_list:\n        sql.append(field.in_(discontinue_list))\n    return sql\n\n\ndef reduce_domain(domain):\n    '''\n    Reduce domain\n    '''\n    if not domain:\n        return []\n    operator = 'AND'\n    if isinstance(domain[0], str):\n        operator = domain[0]\n        domain = domain[1:]\n    result = [operator]\n    for arg in domain:\n        if (isinstance(arg, tuple)\n                or (isinstance(arg, list)\n                    and len(arg) > 2\n                    and arg[1] in OPERATORS)):\n            # clause\n            result.append(arg)\n        elif isinstance(arg, list) and arg:\n            # sub-domain\n            sub_domain = reduce_domain(arg)\n            sub_operator = sub_domain[0]\n            if sub_operator == operator:\n                result.extend(sub_domain[1:])\n            else:\n                result.append(sub_domain)\n        else:\n            result.append(arg)\n    return result\n\n\ndef grouped_slice(records, count=None):\n    'Grouped slice'\n    from trytond.transaction import Transaction\n    if count is None:\n        count = Transaction().database.IN_MAX\n    count = max(1, count)\n    if not isinstance(records, Sized):\n        records = list(records)\n    for i in range(0, len(records), count):\n        yield islice(records, i, i + count)\n\n\ndef is_instance_method(cls, method):\n    for klass in cls.__mro__:\n        type_ = klass.__dict__.get(method)\n        if type_ is not None:\n            return isinstance(type_, types.FunctionType)\n\n\ndef resolve(name):\n    \"Resolve a dotted name to a global object.\"\n    name = name.split('.')\n    used = name.pop(0)\n    found = importlib.import_module(used)\n    for n in name:\n        used = used + '.' + n\n        try:\n            found = getattr(found, n)\n        except AttributeError:\n            found = importlib.import_module(used)\n    return found\n\n\ndef strip_wildcard(string, wildcard='%', escape='\\\\'):\n    \"Strip starting and ending wildcard from string\"\n    string = lstrip_wildcard(string, wildcard)\n    return rstrip_wildcard(string, wildcard, escape)\n\n\ndef lstrip_wildcard(string, wildcard='%'):\n    \"Strip starting wildcard from string\"\n    if string and string.startswith(wildcard):\n        string = string[1:]\n    return string\n\n\ndef rstrip_wildcard(string, wildcard='%', escape='\\\\'):\n    \"Strip ending wildcard from string\"\n    if (string\n            and string.endswith(wildcard)\n            and not string.endswith(escape + wildcard)):\n        string = string[:-1]\n    return string\n\n\ndef escape_wildcard(string, wildcards='%_', escape='\\\\'):\n    for wildcard in escape + wildcards:\n        string = string.replace(wildcard, escape + wildcard)\n    return string\n\n\ndef unescape_wildcard(string, wildcards='%_', escape='\\\\'):\n    for wildcard in wildcards + escape:\n        string = string.replace(escape + wildcard, wildcard)\n    return string\n\n\ndef is_full_text(value, escape='\\\\'):\n    escaped = strip_wildcard(value, escape=escape)\n    escaped = escaped.replace(escape + '%', '').replace(escape + '_', '')\n    if '%' in escaped or '_' in escaped:\n        return False\n    return value.startswith('%') == value.endswith('%')\n\n\n_slugify_strip_re = re.compile(r'[^\\w\\s-]')\n_slugify_hyphenate_re = re.compile(r'[-\\s]+')\n\n\ndef slugify(value, hyphenate='-'):\n    if not isinstance(value, str):\n        value = str(value)\n    value = unicodedata.normalize('NFKD', value)\n    value = str(_slugify_strip_re.sub('', value).strip())\n    return _slugify_hyphenate_re.sub(hyphenate, value)\n\n\ndef sortable_values(func):\n    \"Decorator that makes list of couple values sortable\"\n    @wraps(func)\n    def wrapper(*args, **kwargs):\n        result = list(func(*args, **kwargs))\n        for i, (name, value) in enumerate(list(result)):\n            result[i] = (name, value is None, value)\n        return result\n    return wrapper\n\n\ndef sql_pairing(x, y):\n    \"\"\"Return SQL expression to pair x and y\n    Pairing function from http://szudzik.com/ElegantPairing.pdf\"\"\"\n    return Case(\n        (x < y, (y * y) + x),\n        else_=(x * x) + x + y)\n\n\ndef firstline(text):\n    \"Returns first non-empty line\"\n    try:\n        return next((x for x in text.splitlines() if x.strip()))\n    except StopIteration:\n        return ''\n\n\ndef remove_forbidden_chars(value):\n    from trytond.model.fields import Char\n    if value is None:\n        return value\n    for c in Char.forbidden_chars:\n        if c in value:\n            value = value.replace(c, ' ')\n    return value.strip()\n"
  },
  {
    "path": "trytond/tools/multivalue.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom decimal import Decimal\n\nfrom sql import Column, Literal, Null, Table, Union\nfrom sql.aggregate import Max\n\nfrom trytond import backend\nfrom trytond.pool import Pool\nfrom trytond.transaction import Transaction\n\n\ndef migrate_property(\n        model_name, field_names, ValueModel, value_names,\n        parent=None, fields=None):\n    \"Migrate property from model_name.field_name to ValueModel.value_name\"\n    pool = Pool()\n    Field = pool.get('ir.model.field')\n    Model = pool.get('ir.model')\n    if not backend.TableHandler.table_exist('ir_property'):\n        return\n    cursor = Transaction().connection.cursor()\n    field = Field.__table__()\n    model = Model.__table__()\n    table = ValueModel.__table__()\n\n    if fields is None:\n        fields = []\n    if isinstance(field_names, str):\n        field_names = [field_names]\n    if isinstance(value_names, str):\n        value_names = [value_names]\n\n    def split_value(value):\n        return value.split(',')[1]\n    cast_funcs = {\n        'numeric': lambda v: Decimal(split_value(v)) if v else None,\n        'integer': lambda v: int(split_value(v)) if v else None,\n        'float': lambda v: float(split_value(v)) if v else None,\n        'char': lambda v: split_value(v) if v else None,\n        'selection': lambda v: split_value(v) if v else None,\n        'many2one': lambda v: int(split_value(v)) if v else None,\n        'reference': lambda v: v,\n        }\n\n    casts = []\n    queries = []\n    for field_name, value_name in zip(field_names, value_names):\n        value_field = getattr(ValueModel, value_name)\n        casts.append(cast_funcs[value_field._type])\n\n        property_ = Table('ir_property')\n        columns = [\n            Literal(None).as_(f) if f != value_name\n            else property_.value.as_(value_name)\n            for f in value_names]\n        if parent:\n            columns.append(property_.res.as_(parent))\n            where = property_.res.like(model_name + ',%')\n        else:\n            where = property_.res == Null\n        columns.extend([Column(property_, f).as_(f) for f in fields])\n        query = property_.join(field,\n            condition=property_.field == field.id\n            ).join(model,\n                condition=field.model == model.id\n                ).select(*columns,\n                    where=where\n                    & (field.name == field_name)\n                    & (model.model == model_name))\n        queries.append(query)\n\n    union = Union(*queries)\n    columns = [Max(Column(union, f)).as_(f) for f in value_names]\n    if parent:\n        columns.append(Column(union, parent).as_(parent))\n        pcolumns = [Column(union, parent)]\n    else:\n        pcolumns = []\n    vcolumns = [Column(union, f).as_(f) for f in fields]\n    cursor.execute(\n        *union.select(*(columns + vcolumns), group_by=pcolumns + vcolumns))\n\n    columns = [Column(table, f) for f in value_names]\n    if parent:\n        pcolumns = [Column(table, parent)]\n    else:\n        pcolumns = []\n    vcolumns = [Column(table, f) for f in fields]\n    values = []\n    length = len(value_names)\n    for row in cursor:\n        value = [c(v) for v, c in zip(row, casts)]\n        if parent:\n            value.append(\n                int(row[length].split(',')[1])\n                if row[length] else None)\n            i = 1\n        else:\n            i = 0\n        value.extend(row[length + i:])\n        values.append(value)\n    if (values and not (\n                # No property defined\n                len(values) == 1\n                and all(x is None for x in values[0][:len(columns)]))):\n\n        # Delete previous migrated values\n        cursor.execute(*table.delete())\n\n        cursor.execute(*table.insert(\n                columns + pcolumns + vcolumns, values=values))\n"
  },
  {
    "path": "trytond/tools/singleton.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\n\nclass Singleton(type):\n    '''\n    Metaclass for singleton pattern\n    '''\n    def __init__(cls, name, bases, dict):\n        super(Singleton, cls).__init__(name, bases, dict)\n        cls.instance = None\n\n    def __call__(cls, *args, **kwargs):\n        if cls.instance is None:\n            cls.instance = super(Singleton, cls).__call__(*args, **kwargs)\n        return cls.instance\n"
  },
  {
    "path": "trytond/tools/string_.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\n# Code come from python-Levenshtein\n\n__all__ = ['StringMatcher', 'StringPartitioned', 'LazyString']\n\nfrom warnings import warn\n\ntry:\n    from Levenshtein import distance, editops, matching_blocks, opcodes, ratio\n\n    class StringMatcher:\n        \"\"\"A SequenceMatcher-like class built on the top of Levenshtein\"\"\"\n\n        def _reset_cache(self):\n            self._ratio = self._distance = None\n            self._opcodes = self._editops = self._matching_blocks = None\n\n        def __init__(self, isjunk=None, seq1='', seq2=''):\n            if isjunk:\n                warn(\"isjunk not NOT implemented, it will be ignored\")\n            self._str1, self._str2 = seq1, seq2\n            self._reset_cache()\n\n        def set_seqs(self, seq1, seq2):\n            self._str1, self._str2 = seq1, seq2\n            self._reset_cache()\n\n        def set_seq1(self, seq1):\n            self._str1 = seq1\n            self._reset_cache()\n\n        def set_seq2(self, seq2):\n            self._str2 = seq2\n            self._reset_cache()\n\n        def get_opcodes(self):\n            if not self._opcodes:\n                if self._editops:\n                    self._opcodes = opcodes(\n                        self._editops, self._str1, self._str2)\n                else:\n                    self._opcodes = opcodes(self._str1, self._str2)\n            return self._opcodes\n\n        def get_editops(self):\n            if not self._editops:\n                if self._opcodes:\n                    self._editops = editops(\n                        self._opcodes, self._str1, self._str2)\n                else:\n                    self._editops = editops(self._str1, self._str2)\n            return self._editops\n\n        def get_matching_blocks(self):\n            if not self._matching_blocks:\n                self._matching_blocks = matching_blocks(self.get_opcodes(),\n                                                        self._str1, self._str2)\n            return self._matching_blocks\n\n        def ratio(self):\n            if not self._ratio:\n                self._ratio = ratio(self._str1, self._str2)\n            return self._ratio\n\n        def quick_ratio(self):\n            # This is usually quick enough :o)\n            if not self._ratio:\n                self._ratio = ratio(self._str1, self._str2)\n            return self._ratio\n\n        def real_quick_ratio(self):\n            len1, len2 = len(self._str1), len(self._str2)\n            return 2.0 * min(len1, len2) / (len1 + len2)\n\n        def distance(self):\n            if not self._distance:\n                self._distance = distance(self._str1, self._str2)\n            return self._distance\nexcept ImportError:\n    from difflib import SequenceMatcher as StringMatcher\n\n\nclass StringPartitioned(str):\n    \"A string subclass that stores parts that composes itself.\"\n    __slots__ = ('_parts',)\n\n    def __init__(self, base):\n        super().__init__()\n        if isinstance(base, StringPartitioned):\n            self._parts = base._parts\n        else:\n            self._parts = (base,)\n\n    def __iter__(self):\n        return iter(self._parts)\n\n    def __add__(self, other):\n        new = self.__class__(str(self) + other)\n        new._parts = self._parts + (other,)\n        return new\n\n    def __radd__(self, other):\n        new = self.__class__(other + str(self))\n        new._parts = (other,) + self._parts\n        return new\n\n\nclass LazyString():\n    def __init__(self, func, *args, **kwargs):\n        self._func = func\n        self._args = args\n        self._kwargs = kwargs\n\n    def __str__(self):\n        return self._func(*self._args, **self._kwargs)\n\n    def __add__(self, other):\n        return str(self) + other\n\n    def __radd__(self, other):\n        return other + str(self)\n"
  },
  {
    "path": "trytond/tools/timezone.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport logging\nimport os\n\ntry:\n    import zoneinfo\n    ZoneInfo = zoneinfo.ZoneInfo\n    ZoneInfoNotFoundError = zoneinfo.ZoneInfoNotFoundError\nexcept ImportError:\n    zoneinfo = None\n    import pytz\n    from dateutil.tz import gettz as ZoneInfo\n\n    class ZoneInfoNotFoundError(KeyError):\n        pass\n\n__all__ = ['SERVER', 'UTC', 'get_tzinfo', 'available_timezones']\nlogger = logging.getLogger(__name__)\n_ALL_ZONES = None\n\n\ndef available_timezones():\n    global _ALL_ZONES\n\n    if not _ALL_ZONES:\n        if zoneinfo:\n            _ALL_ZONES = zoneinfo.available_timezones()\n        else:\n            _ALL_ZONES = set(pytz.all_timezones)\n    return set(_ALL_ZONES)\n\n\ndef get_tzinfo(zoneid):\n    try:\n        zi = ZoneInfo(zoneid)\n        if not zi:\n            raise ZoneInfoNotFoundError\n    except ZoneInfoNotFoundError:\n        logger.warning(\"Timezone %s not found falling back to UTC\", zoneid)\n        zi = UTC\n    return zi\n\n\nUTC = ZoneInfo('UTC')\nSERVER = get_tzinfo(os.environ['TRYTOND_TZ'])\n"
  },
  {
    "path": "trytond/transaction.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport logging\nimport time\nfrom collections import defaultdict\nfrom threading import local\n\nfrom sql import Flavor\n\nfrom trytond.config import config\nfrom trytond.tools.immutabledict import ImmutableDict\n\n_cache_transaction = config.getint('cache', 'transaction')\n_cache_model = config.getint('cache', 'model')\n_cache_record = config.getint('cache', 'record')\nlogger = logging.getLogger(__name__)\n\n\ndef record_cache_size(transaction):\n    return transaction.context.get('_record_cache_size', _cache_record)\n\n\nclass _AttributeManager(object):\n    '''\n    Manage Attribute of transaction\n    '''\n\n    def __init__(self, **kwargs):\n        self.kwargs = kwargs\n\n    def __enter__(self):\n        return Transaction()\n\n    def __exit__(self, type, value, traceback):\n        for name, value in self.kwargs.items():\n            setattr(Transaction(), name, value)\n\n\nclass _Local(local):\n\n    def __init__(self):\n        # Transaction stack control\n        self.transactions = []\n        self.tasks = []\n\n\nclass Transaction(object):\n    '''\n    Control the transaction\n    '''\n\n    _local = _Local()\n\n    cache_keys = {'language', 'fuzzy_translation', '_datetime'}\n\n    database = None\n    readonly = False\n    connection = None\n    close = None\n    user = None\n    context = None\n    create_records = None\n    delete_records = None\n    trigger_records = None\n    check_warnings = None\n    timestamp = None\n    started_at = None\n\n    def __new__(cls, new=False):\n        from trytond.cache import LRUDict\n        from trytond.pool import Pool\n        transactions = cls._local.transactions\n        if new or not transactions:\n            instance = super(Transaction, cls).__new__(cls)\n            instance.cache = LRUDict(\n                _cache_transaction,\n                lambda: LRUDict(\n                    _cache_model,\n                    lambda name: LRUDict(\n                        record_cache_size(instance),\n                        Pool().get(name)._record),\n                    default_factory_with_key=True))\n            instance._atexit = []\n            transactions.append(instance)\n        else:\n            instance = transactions[-1]\n        return instance\n\n    @staticmethod\n    def monotonic_time():\n        try:\n            return time.monotonic_ns()\n        except AttributeError:\n            return time.monotonic()\n\n    @property\n    def tasks(self):\n        return self._local.tasks\n\n    def get_cache(self):\n        keys = tuple(((key, self.context[key])\n                for key in sorted(self.cache_keys)\n                if key in self.context))\n        return self.cache[(self.user, keys)]\n\n    def start(self, database_name, user, readonly=False, context=None,\n            close=False, autocommit=False):\n        '''\n        Start transaction\n        '''\n        from trytond import backend\n        assert self.user is None\n        assert self.database is None\n        assert self.close is None\n        assert self.context is None\n        # Compute started_at before connect to ensure\n        # it is strictly before all transactions started after\n        # but it may be also before transactions started before\n        self.started_at = self.monotonic_time()\n        if not database_name:\n            database = backend.Database().connect()\n        else:\n            database = backend.Database(database_name).connect()\n        Flavor.set(backend.Database.flavor)\n        self.connection = database.get_connection(readonly=readonly,\n            autocommit=autocommit)\n        self.user = user\n        self.database = database\n        self.readonly = readonly\n        self.close = close\n        self.context = ImmutableDict(context or {})\n        self.create_records = defaultdict(set)\n        self.delete_records = defaultdict(set)\n        self.trigger_records = defaultdict(set)\n        self.check_warnings = set()\n        self.timestamp = {}\n        self.counter = 0\n        self._datamanagers = []\n        if database_name:\n            from trytond.cache import Cache\n            try:\n                Cache.sync(self)\n            except BaseException:\n                self.stop(False)\n                raise\n        return self\n\n    def __enter__(self):\n        return self\n\n    def __exit__(self, type, value, traceback):\n        self.stop(type is None)\n\n    def stop(self, commit=False):\n        transactions = self._local.transactions\n        try:\n            if transactions.count(self) == 1:\n                try:\n                    try:\n                        # Transaction must be commited to send notifications\n                        if commit and (not self.readonly\n                                or self.database.has_channel()):\n                            self.commit()\n                        else:\n                            self.rollback()\n                    finally:\n                        self.database.put_connection(\n                            self.connection, self.close)\n                finally:\n                    self.database = None\n                    self.readonly = False\n                    self.connection = None\n                    self.close = None\n                    self.user = None\n                    self.context = None\n                    self.create_records = None\n                    self.delete_records = None\n                    self.trigger_records = None\n                    self.timestamp = None\n                    self._datamanagers = []\n\n                for func, args, kwargs in self._atexit:\n                    func(*args, **kwargs)\n        finally:\n            transactions.reverse()\n            try:\n                transactions.remove(self)\n            finally:\n                transactions.reverse()\n\n    def set_context(self, context=None, **kwargs):\n        if context is None:\n            context = {}\n        manager = _AttributeManager(context=self.context)\n        ctx = self.context.copy()\n        ctx.update(context)\n        if kwargs:\n            ctx.update(kwargs)\n        self.context = ImmutableDict(ctx)\n        return manager\n\n    def reset_context(self):\n        manager = _AttributeManager(context=self.context)\n        self.context = ImmutableDict()\n        return manager\n\n    def set_user(self, user, set_context=False):\n        if user != 0 and set_context:\n            raise ValueError('set_context only allowed for root')\n        manager = _AttributeManager(user=self.user,\n                context=self.context)\n        ctx = self.context.copy()\n        if set_context:\n            if user != self.user:\n                ctx['user'] = self.user\n        else:\n            ctx.pop('user', None)\n        self.context = ImmutableDict(ctx)\n        self.user = user\n        return manager\n\n    def set_current_transaction(self, transaction):\n        self._local.transactions.append(transaction)\n        return transaction\n\n    def new_transaction(self, autocommit=False, readonly=False):\n        transaction = Transaction(new=True)\n        return transaction.start(self.database.name, self.user,\n            context=self.context, close=self.close, readonly=readonly,\n            autocommit=autocommit)\n\n    def commit(self):\n        from trytond.cache import Cache\n        try:\n            if self._datamanagers:\n                for datamanager in self._datamanagers:\n                    datamanager.tpc_begin(self)\n                for datamanager in self._datamanagers:\n                    datamanager.commit(self)\n                for datamanager in self._datamanagers:\n                    datamanager.tpc_vote(self)\n            self.started_at = self.monotonic_time()\n            for cache in self.cache.values():\n                cache.clear()\n            Cache.commit(self)\n            self.connection.commit()\n        except Exception:\n            self.rollback()\n            raise\n        else:\n            try:\n                for datamanager in self._datamanagers:\n                    datamanager.tpc_finish(self)\n            except Exception:\n                logger.critical('A datamanager raised an exception in'\n                    ' tpc_finish, the data might be inconsistant',\n                    exc_info=True)\n\n    def rollback(self):\n        from trytond.cache import Cache\n        for cache in self.cache.values():\n            cache.clear()\n        for datamanager in self._datamanagers:\n            datamanager.tpc_abort(self)\n        Cache.rollback(self)\n        self.connection.rollback()\n\n    def join(self, datamanager):\n        try:\n            idx = self._datamanagers.index(datamanager)\n            return self._datamanagers[idx]\n        except ValueError:\n            self._datamanagers.append(datamanager)\n            return datamanager\n\n    def atexit(self, func, *args, **kwargs):\n        self._atexit.append((func, args, kwargs))\n\n    @property\n    def language(self):\n        def get_language():\n            from trytond.pool import Pool\n            Config = Pool().get('ir.configuration')\n            return Config.get_language()\n        if self.context:\n            return self.context.get('language') or get_language()\n        return get_language()\n"
  },
  {
    "path": "trytond/tryton.rnc",
    "content": "namespace a = \"http://relaxng.org/ns/compatibility/annotations/1.0\"\n\ntryton = element tryton { attlist.tryton, data* }\nattlist.tryton &= empty\ndata = element data { attlist.data, (record | menuitem)* }\nattlist.data &=\n  [ a:defaultValue = \"0\" ] attribute noupdate { \"0\" | \"1\" }?\nattlist.data &=\n  [ a:defaultValue = \"0\" ] attribute grouped { \"0\" | \"1\" }?\nattlist.data &= attribute depends { text }?\nattlist.data &= attribute language { text }?\nrecord = element record { attlist.record, field* }\nattlist.record &= attribute model { text }\nattlist.record &= attribute id { text }\nattlist.record &=\n  [ a:defaultValue = \"0\" ] attribute update { \"0\" | \"1\" }?\nfield = element field { attlist.field, text }\nattlist.field &= attribute name { text }\nattlist.field &= attribute search { text }?\nattlist.field &= attribute ref { text }?\nattlist.field &= attribute eval { text }?\nattlist.field &= attribute pyson { \"0\" | \"1\" }?\nattlist.field &= attribute type { \"xml\" }?\nattlist.field &= attribute depends { text }?\nmenuitem = element menuitem { attlist.menuitem, empty }\nattlist.menuitem &= attribute id { text }\nattlist.menuitem &= attribute name { text }?\nattlist.menuitem &= attribute icon { text }?\nattlist.menuitem &= attribute sequence { text }?\nattlist.menuitem &= attribute parent { text }?\nattlist.menuitem &= attribute action { text }?\nattlist.menuitem &= attribute groups { text }?\nattlist.menuitem &= attribute active { text }?\nstart = tryton\n"
  },
  {
    "path": "trytond/tryton.rng",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<grammar xmlns=\"http://relaxng.org/ns/structure/1.0\"\n         xmlns:a=\"http://relaxng.org/ns/compatibility/annotations/1.0\">\n  <define name=\"tryton\">\n    <element>\n      <name ns=\"\">tryton</name>\n      <ref name=\"attlist.tryton\"/>\n      <zeroOrMore>\n        <ref name=\"data\"/>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.tryton\" combine=\"interleave\">\n    <empty/>\n  </define>\n  <define name=\"data\">\n    <element>\n      <name ns=\"\">data</name>\n      <ref name=\"attlist.data\"/>\n      <zeroOrMore>\n        <choice>\n          <ref name=\"record\"/>\n          <ref name=\"menuitem\"/>\n        </choice>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.data\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">noupdate</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.data\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">grouped</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.data\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">depends</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.data\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">language</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"record\">\n    <element>\n      <name ns=\"\">record</name>\n      <ref name=\"attlist.record\"/>\n      <zeroOrMore>\n        <ref name=\"field\"/>\n      </zeroOrMore>\n    </element>\n  </define>\n  <define name=\"attlist.record\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">model</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.record\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">id</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.record\" combine=\"interleave\">\n    <optional>\n      <attribute a:defaultValue=\"0\">\n        <name ns=\"\">update</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"field\">\n    <element>\n      <name ns=\"\">field</name>\n      <ref name=\"attlist.field\"/>\n      <text/>\n    </element>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">name</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">search</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">ref</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">eval</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">pyson</name>\n        <choice>\n          <value>0</value>\n          <value>1</value>\n        </choice>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">type</name>\n        <value>xml</value>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.field\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">depends</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"menuitem\">\n    <element>\n      <name ns=\"\">menuitem</name>\n      <ref name=\"attlist.menuitem\"/>\n      <empty/>\n    </element>\n  </define>\n  <define name=\"attlist.menuitem\" combine=\"interleave\">\n    <attribute>\n      <name ns=\"\">id</name>\n      <text/>\n    </attribute>\n  </define>\n  <define name=\"attlist.menuitem\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">name</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.menuitem\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">icon</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.menuitem\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">sequence</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.menuitem\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">parent</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.menuitem\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">action</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.menuitem\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">groups</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <define name=\"attlist.menuitem\" combine=\"interleave\">\n    <optional>\n      <attribute>\n        <name ns=\"\">active</name>\n        <text/>\n      </attribute>\n    </optional>\n  </define>\n  <start>\n    <ref name=\"tryton\"/>\n  </start>\n</grammar>\n"
  },
  {
    "path": "trytond/url.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\nimport encodings.idna\nimport socket\nimport urllib.parse\n\nfrom trytond.config import config\nfrom trytond.transaction import Transaction\n\n__all__ = ['URLMixin', 'is_secure', 'host', 'http_host']\n\nHOSTNAME = (config.get('web', 'hostname')\n    or socket.getfqdn())\nHOSTNAME = '.'.join(encodings.idna.ToASCII(part).decode('ascii')\n    if part else '' for part in HOSTNAME.split('.'))\n\n\nclass URLAccessor(object):\n    __slots__ = ('_protocol',)\n\n    def __init__(self, protocol='tryton'):\n        self._protocol = protocol\n\n    @classmethod\n    def is_secure(cls):\n        context = Transaction().context\n        if context:\n            request = context.get('_request')\n            if request and request['is_secure']:\n                return True\n        return bool(\n            config.get('ssl', 'certificate')\n            or config.get('ssl', 'privatekey'))\n\n    @classmethod\n    def host(cls):\n        context = Transaction().context\n        if context:\n            request = context.get('_request')\n            if request:\n                return request['http_host']\n        return HOSTNAME\n\n    @classmethod\n    def http_host(cls):\n        return urllib.parse.urlunsplit((\n                'http' + ('s' if cls.is_secure() else ''),\n                cls.host(), '', '', ''))\n\n    @property\n    def protocol(self):\n        if self._protocol == 'http':\n            return 'http' + ('s' if self.is_secure() else '')\n        return self._protocol\n\n    @property\n    def separator(self):\n        if self._protocol == 'http':\n            return '#'\n        return ''\n\n    def __get__(self, inst, cls):\n        from trytond.model import Model\n        from trytond.report import Report\n        from trytond.wizard import Wizard\n\n        url_part = {}\n        if issubclass(cls, Model):\n            url_part['type'] = 'model'\n        elif issubclass(cls, Wizard):\n            url_part['type'] = 'wizard'\n        elif issubclass(cls, Report):\n            url_part['type'] = 'report'\n        else:\n            raise NotImplementedError\n\n        url_part['name'] = cls.__name__\n        url_part['database'] = Transaction().database.name\n\n        local_part = urllib.parse.quote(\n            '%(database)s/%(type)s/%(name)s' % url_part)\n        if isinstance(inst, Model) and inst.id:\n            local_part += '/%d' % inst.id\n        return '%s://%s/%s%s' % (\n            self.protocol, self.host(), self.separator, local_part)\n\n\nis_secure = URLAccessor.is_secure\nhost = URLAccessor.host\nhttp_host = URLAccessor.http_host\n\n\nclass URLMixin:\n    __slots__ = ()\n    __url__ = URLAccessor()\n    __href__ = URLAccessor('http')\n"
  },
  {
    "path": "trytond/wizard/__init__.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nfrom .wizard import (\n    Button, StateAction, StateReport, StateTransition, StateView, Wizard)\n\n__all__ = ['Wizard',\n    'StateView', 'StateTransition', 'StateAction', 'StateReport',\n    'Button']\n"
  },
  {
    "path": "trytond/wizard/wizard.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\n\n__all__ = ['Wizard',\n    'StateView', 'StateTransition', 'StateAction', 'StateReport',\n    'Button']\n\nimport copy\nimport json\n\nfrom trytond.i18n import gettext\nfrom trytond.model import ModelSQL\nfrom trytond.model.exceptions import AccessError\nfrom trytond.model.fields import states_validate\nfrom trytond.pool import Pool, PoolBase\nfrom trytond.protocols.jsonrpc import JSONDecoder, JSONEncoder\nfrom trytond.pyson import PYSONEncoder\nfrom trytond.rpc import RPC\nfrom trytond.tools import cached_property\nfrom trytond.transaction import Transaction\nfrom trytond.url import URLMixin\n\n\nclass Button(object):\n    '''\n    Define a button on wizard.\n    '''\n\n    def __init__(self, string, state,\n            icon='', default=False, states=None, validate=None):\n        self.string = string\n        self.state = state\n        self.icon = icon\n        self.default = bool(default)\n        self.__states = None\n        self.states = states or {}\n        self.validate = validate\n\n    @property\n    def states(self):\n        return self.__states\n\n    @states.setter\n    def states(self, value):\n        states_validate(value)\n        self.__states = value\n\n\nclass State(object):\n    '''\n    A State of a wizard.\n    '''\n    name = None\n\n\nclass StateView(State):\n    '''\n    A view state of a wizard.\n    '''\n\n    def __init__(self, model_name, view, buttons):\n        '''\n        model_name is the name of the model\n        view is the xml id of the view\n        buttons is a list of Button\n        '''\n        self.model_name = model_name\n        self.view = view\n        self.buttons = buttons\n        assert len(self.buttons) == len(set(b.state for b in self.buttons))\n        assert len([b for b in self.buttons if b.default]) <= 1\n\n    def get_view(self, wizard, state_name):\n        '''\n        Returns the view definition\n        '''\n        Model_ = Pool().get(self.model_name)\n        ModelData = Pool().get('ir.model.data')\n        if self.view:\n            module, fs_id = self.view.split('.')\n            view_id = ModelData.get_id(module, fs_id)\n        else:\n            view_id = None\n        return Model_.fields_view_get(view_id=view_id, view_type='form')\n\n    def get_defaults(self, wizard, state_name, fields):\n        '''\n        Returns defaults values for the fields\n        '''\n        pool = Pool()\n        Model_ = pool.get(self.model_name)\n        defaults = Model_.default_get(fields)\n        default = getattr(wizard, 'default_%s' % state_name, None)\n        if default:\n            defaults.update(default(fields))\n            self._complete_values(defaults)\n        return defaults\n\n    def get_values(self, wizard, state_name, fields):\n        \"Return values for the fields\"\n        values = {}\n        value = getattr(wizard, 'value_%s' % state_name, None)\n        if value:\n            values.update(value(fields))\n        self._complete_values(values)\n        return values\n\n    def _complete_values(self, values):\n        pool = Pool()\n        Model_ = pool.get(self.model_name)\n        for field_name, value in list(values.items()):\n            if '.' in field_name:\n                continue\n            field = Model_._fields[field_name]\n            if value and field._type == 'many2one':\n                Target = field.get_target()\n                if 'rec_name' in Target._fields:\n                    values.setdefault(\n                        field_name + '.', {})['rec_name'] = Target(\n                            value).rec_name\n\n    def get_buttons(self, wizard, state_name):\n        '''\n        Returns button definitions translated\n        '''\n        Translation = Pool().get('ir.translation')\n\n        def translation_key(button):\n            return (','.join((wizard.__name__, state_name, button.state)),\n                'wizard_button', Transaction().language, button.string)\n        translation_keys = [translation_key(button) for button in self.buttons]\n        translations = Translation.get_sources(translation_keys)\n        encoder = PYSONEncoder()\n        result = []\n        for button in self.buttons:\n            validate = (button.validate\n                if button.validate is not None\n                else button.state != wizard.end_state)\n            result.append({\n                    'state': button.state,\n                    'icon': button.icon,\n                    'default': button.default,\n                    'validate': validate,\n                    'string': (translations.get(translation_key(button))\n                        or button.string),\n                    'states': encoder.encode(button.states),\n                    })\n        return result\n\n\nclass StateTransition(State):\n    '''\n    A transition state of a wizard.\n    '''\n\n\nclass StateAction(StateTransition):\n    '''\n    An action state of a wizard.\n    '''\n\n    def __init__(self, action_id):\n        '''\n        action_id is a string containing ``module.xml_id``\n        '''\n        super(StateAction, self).__init__()\n        self.action_id = action_id\n\n    def get_action(self):\n        \"Returns action definition\"\n        pool = Pool()\n        ModelData = pool.get('ir.model.data')\n        Action = pool.get('ir.action')\n        module, fs_id = self.action_id.split('.')\n        action_id = Action.get_action_id(\n            ModelData.get_id(module, fs_id))\n        action = Action(action_id)\n        return action.get_action_value()\n\n\nclass StateReport(StateAction):\n    'An report state of a wizard'\n\n    def __init__(self, report_name):\n        super(StateReport, self).__init__(None)\n        self.report_name = report_name\n\n    def get_action(self):\n        'Return report definition'\n        pool = Pool()\n        ActionReport = pool.get('ir.action.report')\n        action_reports = ActionReport.search([\n                ('report_name', '=', self.report_name),\n                ])\n        assert action_reports, '%s not found' % self.report_name\n        action_report = action_reports[0]\n        action = action_report.action\n        return action.get_action_value()\n\n\nclass Wizard(URLMixin, PoolBase):\n    __no_slots__ = True  # To allow setting State\n    start_state = 'start'\n    end_state = 'end'\n\n    @classmethod\n    def __setup__(cls):\n        super(Wizard, cls).__setup__()\n        cls.__rpc__ = {\n            'create': RPC(readonly=False),\n            'delete': RPC(readonly=False),\n            'execute': RPC(readonly=False, check_access=False),\n            }\n\n        # Copy states\n        for attr in dir(cls):\n            if isinstance(getattr(cls, attr), State):\n                setattr(cls, attr, copy.deepcopy(getattr(cls, attr)))\n\n    @classmethod\n    def __post_setup__(cls):\n        super(Wizard, cls).__post_setup__()\n        # Set states\n        cls.states = {}\n        for attr in dir(cls):\n            if attr.startswith('_'):\n                continue\n            if isinstance(getattr(cls, attr), State):\n                cls.states[attr] = getattr(cls, attr)\n\n    @classmethod\n    def __register__(cls, module_name):\n        super(Wizard, cls).__register__(module_name)\n        pool = Pool()\n        Translation = pool.get('ir.translation')\n        Translation.register_wizard(cls, module_name)\n\n    @classmethod\n    def check_access(cls):\n        pool = Pool()\n        ModelAccess = pool.get('ir.model.access')\n        ActionWizard = pool.get('ir.action.wizard')\n        User = pool.get('res.user')\n        context = Transaction().context\n\n        if Transaction().user == 0:\n            return\n\n        with Transaction().set_context(_check_access=True):\n            model = context.get('active_model')\n            if model:\n                Model = pool.get(model)\n            if model and model != 'ir.ui.menu':\n                ModelAccess.check(model, 'read')\n            models = ActionWizard.get_models(\n                cls.__name__, action_id=context.get('action_id'))\n            if model and models and model not in models:\n                raise AccessError(gettext(\n                        'ir.msg_access_wizard_model_error',\n                        wizard=cls.__name__,\n                        model=model))\n            groups = set(User.get_groups())\n            wizard_groups = ActionWizard.get_groups(cls.__name__,\n                action_id=context.get('action_id'))\n            if wizard_groups:\n                if not groups & wizard_groups:\n                    raise AccessError(gettext(\n                            'ir.msg_access_wizard_error',\n                            name=cls.__name__))\n            elif model and model != 'ir.ui.menu':\n                if (not callable(getattr(Model, 'table_query', None))\n                        or Model.write.__func__ != ModelSQL.write.__func__):\n                    ModelAccess.check(model, 'write')\n\n            if model:\n                ids = context.get('active_ids') or []\n                id_ = context.get('active_id')\n                if id_ not in ids and id_ is not None:\n                    ids.append(id_)\n                # Check read access\n                Model.read(ids, ['id'])\n\n    @classmethod\n    def create(cls):\n        \"Create a session\"\n        Session = Pool().get('ir.session.wizard')\n        cls.check_access()\n        return (Session.create([{}])[0].id, cls.start_state, cls.end_state)\n\n    @classmethod\n    def delete(cls, session_id):\n        \"Delete the session\"\n        Session = Pool().get('ir.session.wizard')\n        end = getattr(cls, cls.end_state, None)\n        if end:\n            wizard = cls(session_id)\n            action = end(wizard)\n        else:\n            action = None\n        Session.delete([Session(session_id)])\n        return action\n\n    @classmethod\n    def execute(cls, session_id, data, state_name):\n        '''\n        Execute the wizard state.\n\n        session_id is a Session id\n        data is a dictionary with the session data to update\n        state_name is the name of state to execute\n\n        Returns a dictionary with:\n            - ``actions``: a list of Action to execute\n            - ``view``: a dictionary with:\n                - ``fields_view``: a fields/view definition\n                - ``defaults``: a dictionary with default values\n                - ``values``: a dictionary with values\n                - ``buttons``: a list of buttons\n        '''\n        cls.check_access()\n        wizard = cls(session_id)\n        for key, values in data.items():\n            record = getattr(wizard, key)\n            for field, value in values.items():\n                if field == 'id':\n                    continue\n                setattr(record, field, value)\n        return wizard._execute(state_name)\n\n    def _execute(self, state_name):\n        if state_name == self.end_state:\n            return {}\n\n        state = self.states[state_name]\n        result = {}\n\n        if isinstance(state, StateView):\n            view = state.get_view(self, state_name)\n            fields = list(view['fields'].keys())\n            defaults = state.get_defaults(self, state_name, fields)\n            values = state.get_values(self, state_name, fields)\n            buttons = state.get_buttons(self, state_name)\n            result['view'] = {\n                'fields_view': view,\n                'defaults': defaults,\n                'values': values,\n                'buttons': buttons,\n                'state': state_name,\n                }\n        elif isinstance(state, StateTransition):\n            do_result = None\n            if isinstance(state, StateAction):\n                action = state.get_action()\n                do = getattr(self, 'do_%s' % state_name, None)\n                if do:\n                    do_result = do(action)\n                else:\n                    do_result = action, {}\n            transition = getattr(self, 'transition_%s' % state_name, None)\n            if transition:\n                result = self._execute(transition())\n            if do_result:\n                result.setdefault('actions', []).append(do_result)\n        self._save()\n        return result\n\n    def __init__(self, session_id):\n        pool = Pool()\n        Session = pool.get('ir.session.wizard')\n        self._session_id = session_id\n        session = Session(session_id)\n        data = json.loads(session.data, object_hook=JSONDecoder())\n        for state_name, state in self.states.items():\n            if isinstance(state, StateView):\n                Target = pool.get(state.model_name)\n                data.setdefault(state_name, {})\n                setattr(self, state_name, Target(**data[state_name]))\n\n    def _save(self):\n        \"Save the session in database\"\n        Session = Pool().get('ir.session.wizard')\n        data = {}\n        for state_name, state in self.states.items():\n            if isinstance(state, StateView):\n                data[state_name] = getattr(self, state_name)._default_values\n        session = Session(self._session_id)\n        data = json.dumps(data, cls=JSONEncoder, separators=(',', ':'))\n        if data != session.data.encode('utf-8'):\n            Session.write([session], {\n                    'data': data,\n                    })\n\n    @cached_property\n    def model(self):\n        pool = Pool()\n        context = Transaction().context\n        if context.get('active_model'):\n            return pool.get(context['active_model'])\n\n    @cached_property\n    def record(self):\n        context = Transaction().context\n        if context.get('active_id') is not None:\n            return self.model(context['active_id'])\n\n    @cached_property\n    def records(self):\n        context = Transaction().context\n        if context.get('active_ids'):\n            return self.model.browse(context['active_ids'])\n        return []\n"
  },
  {
    "path": "trytond/worker.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport datetime as dt\nimport logging\nimport random\nimport selectors\nimport signal\nimport time\nfrom multiprocessing import Pool as MPool\nfrom multiprocessing import cpu_count\n\nfrom sql import Flavor\n\nfrom trytond import backend\nfrom trytond.config import config\nfrom trytond.exceptions import UserError, UserWarning\nfrom trytond.pool import Pool\nfrom trytond.status import processing\nfrom trytond.transaction import Transaction\n\n__all__ = ['work']\nlogger = logging.getLogger(__name__)\n\n\nclass Queue(object):\n    def __init__(self, database_name, mpool):\n        self.database = backend.Database(database_name).connect()\n        self.connection = self.database.get_connection(autocommit=True)\n        self.mpool = mpool\n\n    def pull(self, name=None):\n        database_list = Pool.database_list()\n        pool = Pool(self.database.name)\n        if self.database.name not in database_list:\n            with Transaction().start(self.database.name, 0, readonly=True):\n                pool.init()\n        Queue = pool.get('ir.queue')\n        return Queue.pull(self.database, self.connection, name=name)\n\n    def run(self, task_id):\n        return self.mpool.apply_async(run_task, (self.database.name, task_id))\n\n\nclass TaskList(list):\n    def filter(self):\n        for t in list(self):\n            if t.ready():\n                self.remove(t)\n        return self\n\n\ndef work(options):\n    Flavor.set(backend.Database.flavor)\n    if not config.getboolean('queue', 'worker', default=False):\n        return\n    try:\n        processes = options.processes or cpu_count()\n    except NotImplementedError:\n        processes = 1\n    logger.info(\"start %d workers\", processes)\n    mpool = MPool(\n        processes, initializer, (options.database_names,),\n        options.maxtasksperchild)\n    queues = [Queue(name, mpool) for name in options.database_names]\n\n    tasks = TaskList()\n    selector = selectors.DefaultSelector()\n    for queue in queues:\n        selector.register(queue.connection, selectors.EVENT_READ)\n    try:\n        while True:\n            timeout = options.timeout\n            while len(tasks.filter()) >= processes:\n                time.sleep(0.1)\n            for queue in queues:\n                task_id, next_ = queue.pull(options.name)\n                if next_ is not None:\n                    timeout = min(next_, timeout)\n                if task_id:\n                    tasks.append(queue.run(task_id))\n                    break\n            else:\n                for key, _ in selector.select(timeout=timeout):\n                    connection = key.fileobj\n                    connection.poll()\n                    while connection.notifies:\n                        connection.notifies.pop(0)\n    except KeyboardInterrupt:\n        mpool.close()\n    finally:\n        selector.close()\n\n\ndef initializer(database_names, worker=True):\n    if worker:\n        signal.signal(signal.SIGINT, signal.SIG_IGN)\n    pools = []\n    database_list = Pool.database_list()\n    for database_name in database_names:\n        pool = Pool(database_name)\n        if database_name not in database_list:\n            with Transaction().start(database_name, 0, readonly=True):\n                pool.init()\n        pools.append(pool)\n    return pools\n\n\ndef run_task(pool, task_id):\n    if not isinstance(pool, Pool):\n        database_list = Pool.database_list()\n        pool = Pool(pool)\n        if pool.database_name not in database_list:\n            with Transaction().start(pool.database_name, 0, readonly=True):\n                pool.init()\n    Queue = pool.get('ir.queue')\n    Error = pool.get('ir.error')\n\n    def duration():\n        return (time.monotonic() - started) * 1000\n    started = time.monotonic()\n    name = '<Task %s@%s>' % (task_id, pool.database_name)\n    retry = config.getint('database', 'retry')\n    try:\n        for count in range(retry, -1, -1):\n            if count != retry:\n                time.sleep(0.02 * (retry - count))\n            with Transaction().start(pool.database_name, 0) as transaction:\n                try:\n                    try:\n                        task, = Queue.search([('id', '=', task_id)])\n                    except ValueError:\n                        # the task was rollbacked, nothing to do\n                        break\n                    with processing(name):\n                        task.run()\n                    break\n                except backend.DatabaseOperationalError:\n                    if count:\n                        transaction.rollback()\n                        logger.debug(\"Retry: %i\", retry - count + 1)\n                        continue\n                    raise\n                except (UserError, UserWarning) as e:\n                    Error.log(task, e)\n                    raise\n        logger.info(\"%s in %i ms\", name, duration())\n    except backend.DatabaseOperationalError:\n        logger.info(\n            \"%s failed after %i ms, retrying\", name, duration(),\n            exc_info=logger.isEnabledFor(logging.DEBUG))\n        if not config.getboolean('queue', 'worker', default=False):\n            time.sleep(0.02 * retry)\n        try:\n            with Transaction().start(pool.database_name, 0) as transaction:\n                if not transaction.database.has_channel():\n                    logger.critical('%s failed', name, exc_info=True)\n                    return\n                task = Queue(task_id)\n                if task.scheduled_at and task.enqueued_at < task.scheduled_at:\n                    duration = (task.scheduled_at - task.enqueued_at) * 2\n                else:\n                    duration = dt.timedelta(seconds=2 * retry)\n                duration = max(duration, dt.timedelta(hours=1))\n                scheduled_at = dt.datetime.now() + duration * random.random()\n                Queue.push(task.name, task.data, scheduled_at=scheduled_at)\n        except Exception:\n            logger.critical(\n                \"rescheduling %s failed\", name, exc_info=True)\n    except (UserError, UserWarning):\n        logger.info(\n            \"%s failed after %i ms\", name, duration(),\n            exc_info=logger.isEnabledFor(logging.DEBUG))\n    except Exception:\n        logger.critical(\n            \"%s failed after %i ms\", name, duration(), exc_info=True)\n"
  },
  {
    "path": "trytond/wsgi.py",
    "content": "# This file is part of Tryton.  The COPYRIGHT file at the top level of\n# this repository contains the full copyright notices and license terms.\nimport base64\nimport http.client\nimport logging\nimport os\nimport posixpath\nimport sys\nimport traceback\nimport urllib.parse\n\ntry:\n    from http import HTTPStatus\nexcept ImportError:\n    from http import client as HTTPStatus\n\nfrom werkzeug.exceptions import HTTPException, InternalServerError, abort\nfrom werkzeug.routing import BaseConverter, Map, Rule\nfrom werkzeug.wrappers import Response\n\ntry:\n    from werkzeug.middleware.proxy_fix import ProxyFix\n\n    def NumProxyFix(app, num_proxies):\n        return ProxyFix(app,\n            x_for=num_proxies, x_proto=num_proxies, x_host=num_proxies,\n            x_port=num_proxies, x_prefix=num_proxies)\nexcept ImportError:\n    from werkzeug.contrib.fixers import ProxyFix as NumProxyFix\ntry:\n    from werkzeug.security import safe_join\nexcept ImportError:\n    safe_join = posixpath.join\ntry:\n    from werkzeug.middleware.shared_data import SharedDataMiddleware\nexcept ImportError:\n    from werkzeug.wsgi import SharedDataMiddleware\n\nimport wrapt\n\nfrom trytond.config import config\nfrom trytond.protocols.jsonrpc import JSONProtocol\nfrom trytond.protocols.wrappers import Request\nfrom trytond.protocols.xmlrpc import XMLProtocol\nfrom trytond.status import processing\nfrom trytond.tools import resolve\n\n__all__ = ['TrytondWSGI', 'app']\n\nlogger = logging.getLogger(__name__)\n\n\nclass Base64Converter(BaseConverter):\n\n    def to_python(self, value):\n        return base64.urlsafe_b64decode(value).decode('utf-8')\n\n    def to_url(self, value):\n        return base64.urlsafe_b64encode(value.encode('utf-8')).decode('ascii')\n\n\nclass TrytondWSGI(object):\n\n    def __init__(self):\n        self.url_map = Map([], converters={\n                'base64': Base64Converter,\n                })\n        self.protocols = [JSONProtocol, XMLProtocol]\n        self.error_handlers = []\n\n    def route(self, string, methods=None, defaults=None):\n        def decorator(func):\n            self.url_map.add(Rule(\n                    string, endpoint=func, methods=methods, defaults=defaults))\n            return func\n        return decorator\n\n    def error_handler(self, handler):\n        self.error_handlers.append(handler)\n        return handler\n\n    @wrapt.decorator\n    def auth_required(self, wrapped, instance, args, kwargs):\n        request = args[0]\n        if request.user_id:\n            return wrapped(*args, **kwargs)\n        else:\n            headers = {}\n            if request.headers.get('X-Requested-With') != 'XMLHttpRequest':\n                headers['WWW-Authenticate'] = 'Basic realm=\"Tryton\"'\n            response = Response(None, http.client.UNAUTHORIZED, headers)\n            abort(http.client.UNAUTHORIZED, response=response)\n\n    def check_request_size(self, request, size=None):\n        if request.method not in {'POST', 'PUT', 'PATCH'}:\n            return\n        if size is None:\n            if request.user_id:\n                max_size = config.getint(\n                    'request', 'max_size_authenticated')\n            else:\n                max_size = config.getint(\n                    'request', 'max_size')\n        else:\n            max_size = size\n        if max_size:\n            content_length = request.content_length\n            if content_length is None:\n                abort(http.client.LENGTH_REQUIRED)\n            elif content_length > max_size:\n                abort(http.client.REQUEST_ENTITY_TOO_LARGE)\n\n    def dispatch_request(self, request):\n        adapter = self.url_map.bind_to_environ(request.environ)\n        try:\n            endpoint, request.view_args = adapter.match()\n            max_request_size = getattr(endpoint, 'max_request_size', None)\n            self.check_request_size(request, max_request_size)\n            return endpoint(request, **request.view_args)\n        except HTTPException as e:\n            logger.debug(\n                \"Exception when processing %s\", request, exc_info=True)\n            return e\n        except Exception as e:\n            logger.debug(\n                \"Exception when processing %s\", request, exc_info=True)\n            tb_s = ''.join(traceback.format_exception(*sys.exc_info()))\n            for path in sys.path:\n                tb_s = tb_s.replace(path, '')\n            e.__format_traceback__ = tb_s\n            response = e\n            for error_handler in self.error_handlers:\n                rv = error_handler(self, request, e)\n                if isinstance(rv, Response):\n                    response = rv\n            return response\n\n    def make_response(self, request, data):\n        for cls in self.protocols:\n            for mimetype, _ in request.accept_mimetypes:\n                if cls.content_type in mimetype:\n                    response = cls.response(data, request)\n                    break\n            else:\n                continue\n            break\n        else:\n            for cls in self.protocols:\n                if cls.content_type in request.environ.get('CONTENT_TYPE', ''):\n                    response = cls.response(data, request)\n                    break\n            else:\n                if isinstance(data, Exception):\n                    try:\n                        response = InternalServerError(original_exception=data)\n                    except TypeError:\n                        response = InternalServerError(data)\n                else:\n                    response = Response(data)\n        return response\n\n    def wsgi_app(self, environ, start_response):\n        for cls in self.protocols:\n            if cls.content_type in environ.get('CONTENT_TYPE', ''):\n                request = cls.request(environ)\n                break\n        else:\n            request = Request(environ)\n        logger.info('%s', request)\n\n        origin = request.headers.get('Origin')\n        origin_host = urllib.parse.urlparse(origin).netloc if origin else ''\n        host = request.headers.get('Host')\n        if origin and origin != 'null' and origin_host != host:\n            cors = filter(\n                None, config.get('web', 'cors', default='').splitlines())\n            if origin not in cors:\n                if (origin.startswith('moz-extension://')\n                        or origin.startswith('chrome-extension://')):\n                    origin = 'null'\n                else:\n                    abort(HTTPStatus.FORBIDDEN)\n        if origin == 'null':\n            adapter = self.url_map.bind_to_environ(request.environ)\n            endpoint = adapter.match()[0]\n            if not getattr(endpoint, 'allow_null_origin', False):\n                abort(HTTPStatus.FORBIDDEN)\n\n        with processing(request):\n            data = self.dispatch_request(request)\n            if not isinstance(data, (Response, HTTPException)):\n                response = self.make_response(request, data)\n            else:\n                response = data\n\n        if origin and isinstance(response, Response):\n            response.headers['Access-Control-Allow-Origin'] = origin\n            response.headers['Vary'] = 'Origin'\n            method = request.headers.get('Access-Control-Request-Method')\n            if method:\n                response.headers['Access-Control-Allow-Methods'] = method\n            headers = request.headers.get('Access-Control-Request-Headers')\n            if headers:\n                response.headers['Access-Control-Allow-Headers'] = headers\n            response.headers['Access-Control-Max-Age'] = config.getint(\n                'web', 'cache_timeout')\n        return response(environ, start_response)\n\n    def __call__(self, environ, start_response):\n        return self.wsgi_app(environ, start_response)\n\n\nclass SharedDataMiddlewareIndex(SharedDataMiddleware):\n    def __call__(self, environ, start_response):\n        if environ['REQUEST_METHOD'] not in {'GET', 'HEAD'}:\n            return self.app(environ, start_response)\n        return super(SharedDataMiddlewareIndex, self).__call__(\n            environ, start_response)\n\n    def get_directory_loader(self, directory):\n        def loader(path):\n            if path is not None:\n                path = safe_join(directory, path)\n            else:\n                path = directory\n            if path is not None:\n                if os.path.isdir(path):\n                    path = posixpath.join(path, 'index.html')\n                if os.path.isfile(path):\n                    return os.path.basename(path), self._opener(path)\n            return None, None\n        return loader\n\n\napp = TrytondWSGI()\nif config.get('web', 'root'):\n    static_files = {\n        '/': config.get('web', 'root'),\n        }\n    app.wsgi_app = SharedDataMiddlewareIndex(\n        app.wsgi_app, static_files,\n        cache_timeout=config.getint('web', 'cache_timeout'))\nnum_proxies = config.getint('web', 'num_proxies')\nif num_proxies:\n    app.wsgi_app = NumProxyFix(app.wsgi_app, num_proxies)\n\nif config.has_section('wsgi middleware'):\n    for middleware in config.options('wsgi middleware'):\n        Middleware = resolve(config.get('wsgi middleware', middleware))\n        args, kwargs = (), {}\n        section = 'wsgi %s' % middleware\n        if config.has_section(section):\n            if config.has_option(section, 'args'):\n                args = eval(config.get(section, 'args'))\n            if config.has_option(section, 'kwargs'):\n                kwargs = eval(config.get(section, 'kwargs'))\n        app.wsgi_app = Middleware(app.wsgi_app, *args, **kwargs)\n\nimport trytond.bus  # noqa: E402,F401\nimport trytond.protocols.dispatcher  # noqa: E402,F401\n"
  }
]