{ "info": { "author": "Develatio Technologies S.L.", "author_email": "contacto@develat.io", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Internationalization", "Topic :: Software Development :: Libraries :: Application Frameworks", "Topic :: Software Development :: Localization" ], "description": "![PyPI](https://img.shields.io/pypi/v/django-tradukoj.svg)\n[![Python 3.6](https://img.shields.io/badge/python-3.6-blue.svg)](https://www.python.org/downloads/release/python-360/)\n[![Python 3.7](https://img.shields.io/badge/python-3.7-blue.svg)](https://www.python.org/downloads/release/python-370/)\n![t](https://img.shields.io/badge/status-stable-green.svg)\n\n# Tradukoj\n\nTradujok is a django db-based translation system with IETF's BCP 47 standard support\nand django-rest-framework serializers.\n\nTradukoj can be integrated with common js i18n libs thanks to his JSON tree generation feature.\n\nThis app is maintained and internally used by Develatio Technologies.\n\n## Requierements\n\n* Python: >= 3.6\n\n* Django: >= 2.1, 2.2\n\n## Features\n\n* Namespaces to separate projects or big sections of your app\n* JSON tree generation with your translations\n* django-rest-framework urls/views/serializers\n* django-rest-framework fields to be used in serializers\n* Fallback translation for drf fields\n* Translate model fields\n* Languaje detection endpoint\n* RTL - LTR support\n* PO files Import/Export\n* Public/Private translations isolation\n\n## Quick start\n\n1. Install `pip install django-tradukoj`\n\n2. Add \"tradukoj\" to INSTALLED_APPS:\n\n```\nINSTALLED_APPS = {\n ...\n 'tradukoj'\n}\n```\n\n3. Include the tradukoj URLconf in urls.py: `url(r'^tradukoj/', include('tradukoj.urls'))`\n\n4. Run `python manage.py migrate` to create db records.\n\n\n## Translate model fields\n\nUsage of `OneToOneTradukojField`:\n\n```\nfrom tradukoj.fields import OneToOneTradukojField\n\nclass MyModel(models.Model):\n name = OneToOneTradukojField(null=True, blank=True, verbose_name='Name')\n\n```\n\n## Handle translations\n\n### Automatic key generation:\n\n```\n>>> from tradukoj.models import TranslationKey\n>>> from myapp.models import MyModel\n\n>>> instance = MyModel()\n>>> # This creates a translatable key with automatically generated name\n>>> instance.name = TranslationKey(init_namespace='mynamespace', public=True)\n>>> instance.name\n\n\n>>> # This will add a translation for es-ES to instance.name\n>>> # A record with 'es-ES' into tradukoj.models.BCP47 will be created if it\n>>> # does not exist.\n>>> instance.name.translate('es-ES', 'mi nombre')\n\n>>> # Access translations:\n>>> instance.name.translations.all()\n mi nombre>]>\n\n>>> instance.name.translations.get(bcp47__langtag='es-ES')\n mi nombre>\n\n>>> instance.name.translations.get(bcp47__langtag='es-ES').str_translation()\n'mi nombre'\n\n```\n\n\n## Custom key name:\n\nIf you dont specify a key for translation, a random one will be generated. To\nspecify a key, you should pass it as argument to `TranslationKey`:\n\n```\n>>> instance.name = TranslationKey(init_namespace='test', text='A translatable string', public=True)\n>>> instance.name\n\n>>> instance.name.save()\n>>> instance.name.translate('es-ES', 'Una cadena traducible')\n>>> instance.name.translations.all()\n Una cadena traducible>]>\n```\n\n\n## JSON tree of translations\n\nIf you are planning to use json tree feature of tradukoj, remember that a dot in\nkey are handled as subobject.\n\n```\nTranslationKey(init_namespace='project', text='home.title', public=True)\nTranslationKey(init_namespace='project', text='home.subtitle', public=True)\n```\n\nresults into this json object:\n```\n{\n es-ES: {\n project: {\n home: {\n title: 'Bienvenido',\n subtitle: 'Secciones'\n }\n }\n },\n en-US: {\n project: {\n home: {\n title: 'Welcome',\n subtitle: 'Sections'\n }\n }\n }\n}\n```\n\n\n## API REST Endpoints\n\n* Languaje detection: `YOUR_API_URL/tradukoj/bestlangtag/`\nAsking from `es-ES;en` (spanish-Spain,english) a web with only\n`es-MX` (spanish-Mexico) lang:\n\n```\n[\n {\n \"langtag\": \"es-MX\",\n \"score\":92,\n \"accept_lang\": \"es-es\"\n },\n {\n \"langtag\": \"es-MX\",\n \"score\": 92,\n \"accept_lang\":\"es\"\n },\n {\n \"langtag\":\"en\",\n \"score\":100,\n \"accept_lang\":\"en\"\n }\n]\n```\n\n* Available langs: `YOUR_API_URL/tradukoj/available/`\n```\n{\n \"count\": 28,\n \"next\": null,\n \"previous\": null,\n \"results\": [\n {\"langtag\":\"en-EN\",\"name\":\"English (English)\",\"best_match_score\":92,\"default\":false,\"direction\":0},\n {\"langtag\":\"es-MX\",\"name\":\"espa\u00f1ol (Spanish)\",\"best_match_score\":92,\"default\":false,\"direction\":0},\n {\"langtag\":\"en-US\",\"name\":\"English (English)\",\"best_match_score\":98,\"default\":false,\"direction\":0},\n {\"langtag\":\"ar-LB\",\"name\":\"\u0627\u0644\u0639\u0631\u0628\u064a\u0629 (Arabic)\",\"best_match_score\":0,\"default\":false,\"direction\":1},\n {\"langtag\":\"fr-FR\",\"name\":\"fran\u00e7ais (French)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"pt-PT\",\"name\":\"portugu\u00eas (Portuguese)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"ru-RU\",\"name\":\"\u0440\u0443\u0441\u0441\u043a\u0438\u0439 (Russian)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"de-DE\",\"name\":\"Deutsch (German)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"it-IT\",\"name\":\"italiano (Italian)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"hu-HU\",\"name\":\"magyar (Hungarian)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"cs-CZ\",\"name\":\"\u010de\u0161tina (Czech)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"zh-CN\",\"name\":\"\u4e2d\u6587 (Chinese)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"vi-VN\",\"name\":\"Ti\u1ebfng Vi\u1ec7t (Vietnamese)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"hi-IN\",\"name\":\"\u0939\u093f\u0928\u094d\u0926\u0940 (Hindi)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"uk_UA\",\"name\":\"\u0443\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430 (Ukrainian)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"hy_AM\",\"name\":\"\u0570\u0561\u0575\u0565\u0580\u0565\u0576 (Armenian)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"be_BY\",\"name\":\"\u0431\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f (Belarusian)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"bg_BG\",\"name\":\"\u0431\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438 (Bulgarian)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"km_KH\",\"name\":\"\u1781\u17d2\u1798\u17c2\u179a (Khmer)\",\"best_match_score\":84,\"default\":false,\"direction\":0},\n {\"langtag\":\"et_EE\",\"name\":\"eesti (Estonian)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"lv_LV\",\"name\":\"latvie\u0161u (Latvian)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"pl_PL\",\"name\":\"polski (Polish)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"ro_RO\",\"name\":\"rom\u00e2n\u0103 (Romanian)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"uz_Latn\",\"name\":\"o\u2018zbek (Uzbek)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"tr_TR\",\"name\":\"T\u00fcrk\u00e7e (Turkish)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"th_TH\",\"name\":\"\u0e44\u0e17\u0e22 (Thai)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"zh_TW\",\"name\":\"\u4e2d\u6587 (Chinese)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n {\"langtag\":\"az_AZ\",\"name\":\"az\u0259rbaycan (Azerbaijani)\",\"best_match_score\":0,\"default\":false,\"direction\":0},\n ]\n}\n```\n\n* Get all public translations list: `YOUR_API_URL/tradukoj/public/`\n* Get all private translations list: `YOUR_API_URL/tradukoj/private/`\n* Get plain JSON of all public translations: `YOUR_API_URL/tradukoj/public/plain/`\n* Get plain JSON of all private translations: `YOUR_API_URL/tradukoj/private/plain/`\n* Get filtered public translations: `YOUR_API_URL/tradukoj/public/plain/?bcp47__langtag=es&key__namespace__text=mynamespace`\n* Get filtered private translations: `YOUR_API_URL/tradukoj/public/plain/?bcp47__langtag=es&key__namespace__text=mynamespace`\n\n\n## Django Rest Framework, Tradukoj Field.\n\nTo handle a model translatable field into your drf serializers, `TradukojSerializedField`\n\n```\nfrom tradukoj.drf_fields import TradukojSerializedField\n\nclass MySerializer(serializers.ModelSerializer):\n name = TradukojSerializedField(read_only=True, fallback_langtag='en-US')\n\n class Meta:\n model = MyModel\n exclude = ('id', )\n\n```\n\nThis will give you a JSON like:\n\n```\n{\n name: {\n 'fallback': 'Welcome',\n 'text': 'mykey',\n 'translations': {\n 'es-ES': 'Bienvenido',\n 'en-US': 'Welcome'\n }\n }\n}\n```\n\n\n## Command line tools\n\n### Generate .po file\n```\nusage: manage.py generate_pofile [-h] --langtag LANGTAG --output OUTPUT\n --namespace NAMESPACE --reference_langtag\n REFERENCE_LANGTAG [--version] [-v {0,1,2,3}]\n [--settings SETTINGS]\n [--pythonpath PYTHONPATH] [--traceback]\n [--no-color] [--force-color]\n\nGenerate a .po file of langtag\n\noptional arguments:\n -h, --help show this help message and exit\n --langtag LANGTAG tag used in BCP47\n --output OUTPUT output file\n --namespace NAMESPACE\n namespace of translations\n --reference_langtag REFERENCE_LANGTAG\n translated text used in comments to help translator\n team\n --version show program's version number and exit\n -v {0,1,2,3}, --verbosity {0,1,2,3}\n Verbosity level; 0=minimal output, 1=normal output,\n 2=verbose output, 3=very verbose output\n --settings SETTINGS The Python path to a settings module, e.g.\n \"myproject.settings.main\". If this isn't provided, the\n DJANGO_SETTINGS_MODULE environment variable will be\n used.\n --pythonpath PYTHONPATH\n A directory to add to the Python path, e.g.\n \"/home/djangoprojects/myproject\".\n --traceback Raise on CommandError exceptions\n --no-color Don't colorize the command output.\n --force-color Force colorization of the command output.\n```\n\nGenerate a .po file of `es-ES` and put `en-US` translations as a commentary of\nevery `msgid`:\n\n`python manage.py generate_pofile --langtag es-ES --output ./pofile.po --namespace mynamespace --reference_langtag en-US`\n\n\n### Destroy keys not in a .po file:\n\nThis will destroy those keys not in a .po file and related translations.\n\n```\nusage: manage.py destroy_dbkeys_not_in_pofile [-h] --pofile POFILE --namespace\n NAMESPACE [--safe] [--version]\n [-v {0,1,2,3}]\n [--settings SETTINGS]\n [--pythonpath PYTHONPATH]\n [--traceback] [--no-color]\n [--force-color]\n\nRemove those translations key in DB that does not exists in a given pofile\n\noptional arguments:\n -h, --help show this help message and exit\n --pofile POFILE The pofile\n --namespace NAMESPACE\n The namespace\n --safe Show those keys that should be deleted but do not\n commit delete command on db\n --version show program's version number and exit\n -v {0,1,2,3}, --verbosity {0,1,2,3}\n Verbosity level; 0=minimal output, 1=normal output,\n 2=verbose output, 3=very verbose output\n --settings SETTINGS The Python path to a settings module, e.g.\n \"myproject.settings.main\". If this isn't provided, the\n DJANGO_SETTINGS_MODULE environment variable will be\n used.\n --pythonpath PYTHONPATH\n A directory to add to the Python path, e.g.\n \"/home/djangoprojects/myproject\".\n --traceback Raise on CommandError exceptions\n --no-color Don't colorize the command output.\n --force-color Force colorization of the command output.\n```\n\n\n### Show incompatible keys when use JSON tree generation feature\n\nIf you are planning to use JSON tree generation, some keys will be incompatible\nwith this scheme:\n\n* namespace.section.title = 'test'\n* namespace.section = 'test'\n\nto detect those incompatibility, use `show_incompatible_tree_key` command:\n\n```\nusage: manage.py show_incompatible_tree_key [-h] [--pofile POFILE] [--version]\n [-v {0,1,2,3}]\n [--settings SETTINGS]\n [--pythonpath PYTHONPATH]\n [--traceback] [--no-color]\n [--force-color]\n\nShow incompatible Translation Key for plain tree generation\n\noptional arguments:\n -h, --help show this help message and exit\n --pofile POFILE Test pofile instead database\n --version show program's version number and exit\n -v {0,1,2,3}, --verbosity {0,1,2,3}\n Verbosity level; 0=minimal output, 1=normal output,\n 2=verbose output, 3=very verbose output\n --settings SETTINGS The Python path to a settings module, e.g.\n \"myproject.settings.main\". If this isn't provided, the\n DJANGO_SETTINGS_MODULE environment variable will be\n used.\n --pythonpath PYTHONPATH\n A directory to add to the Python path, e.g.\n \"/home/djangoprojects/myproject\".\n --traceback Raise on CommandError exceptions\n --no-color Don't colorize the command output.\n --force-color Force colorization of the command output.\n```\n\n### Load .po files\n\nImporting `tradukoj.admin` models into your admin, will give you some features\nlike importing .po files.\n\n```\nfrom tradukoj import models\n\n\nclass TranslationKeyAdmin(admin.ModelAdmin):\n search_fields = ('text',)\n\nclass TranslationAdmin(admin.ModelAdmin):\n search_fields = ('key__text',)\n\n\nadmin.site.register(models.TranslationKey, TranslationKeyAdmin)\nadmin.site.register(models.GetTextFile)\nadmin.site.register(models.Namespace)\nadmin.site.register(models.Translation, TranslationAdmin)\nadmin.site.register(models.BCP47)\n\n```\n\n\n### Vue.js: Translate fields POC\n\nAssuming that you are storing your current languaje tag in `store.state.i18n.active_langtag`,\nuse this POC vuejs code:\n\ncreate a `plugins/tradukoj-translate.js` with this content:\n\n```\nimport store from \"../store\";\n\nconst TradukojTranslatable = {\n install(Vue) {\n Vue.mixin({\n methods: {\n $tradukojTranslate(translatable) {\n if (!translatable) {\n return \"\";\n }\n\n if (\n translatable.translations &&\n translatable.translations[store.state.i18n.active_langtag]\n ) {\n return translatable.translations[\n store.state.i18n.active_langtag\n ];\n }\n\n if (translatable.fallback) {\n return translatable.fallback;\n }\n\n return \"\";\n }\n }\n });\n }\n};\nexport default TradukojTranslatable;\n```\n\nRegister globally:\n\n```\nimport TradukojTranslatable from \"@/plugins/tradukoj-translatable\";\nVue.use(TradukojTranslatable);\n```\n\nUse in component:\n\n```\n\n[...]\n```\n\nOnce you change the value of `store.state.i18n.active_langtag`, the translations will be\nautomatically updated to current selected lang.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/develatio/django-tradukoj/", "keywords": "", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "django-tradukoj", "package_url": "https://pypi.org/project/django-tradukoj/", "platform": "", "project_url": "https://pypi.org/project/django-tradukoj/", "project_urls": { "Homepage": "https://github.com/develatio/django-tradukoj/" }, "release_url": "https://pypi.org/project/django-tradukoj/1.2.1/", "requires_dist": [ "Django (>=2.0)", "langcodes (>=1.4.1)" ], "requires_python": ">=3.6.0", "summary": "A django IETF's BCP 47 DB-based translation system", "version": "1.2.1" }, "last_serial": 5446828, "releases": { "1.0": [ { "comment_text": "", "digests": { "md5": "8d872151988add892021fb8f55305f87", "sha256": "a04dab3ad4dd399a3124338365daa3770801078394cd4a4bf1d5b85628f365ee" }, "downloads": -1, "filename": "django_tradukoj-1.0-py2-none-any.whl", "has_sig": false, "md5_digest": "8d872151988add892021fb8f55305f87", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 15497, "upload_time": "2019-06-05T10:45:52", "url": "https://files.pythonhosted.org/packages/3a/f3/a6213f35fc0644d6fc1ab3b52a5e1950d540dd5d9a08ca2d238542ba61c4/django_tradukoj-1.0-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5440c7d697ea55187aa74a5613feeb52", "sha256": "7c01ec877cbc4592aa99e392931231db4c87a70304ce5dbdca012152703f92b6" }, "downloads": -1, "filename": "django-tradukoj-1.0.tar.gz", "has_sig": false, "md5_digest": "5440c7d697ea55187aa74a5613feeb52", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12754, "upload_time": "2019-06-05T10:45:54", "url": "https://files.pythonhosted.org/packages/37/30/a960e08fde53d145e20b4f4926a21e0bc2b4d8389403d8efe1c5d732c6e5/django-tradukoj-1.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "4f11ef099c345f087601923e68040607", "sha256": "c6aa5d9e5b9f54304368361a0384ec7b27a69f035b9fef49c7cebb0e8e628f68" }, "downloads": -1, "filename": "django_tradukoj-1.0.1-py2-none-any.whl", "has_sig": false, "md5_digest": "4f11ef099c345f087601923e68040607", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=3.6.0", "size": 15613, "upload_time": "2019-06-05T11:12:19", "url": "https://files.pythonhosted.org/packages/af/7c/1ade21f62e1de9a2cc4f8c53ef09f58cb7af0f14dffd91a80ae6d27b2a6e/django_tradukoj-1.0.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9a497f2348463b803db08101b1401c20", "sha256": "0f46ab610f7b28e5463df3712044c97efb0e81cccbb7000b96064a2ec0e6109e" }, "downloads": -1, "filename": "django-tradukoj-1.0.1.tar.gz", "has_sig": false, "md5_digest": "9a497f2348463b803db08101b1401c20", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 12869, "upload_time": "2019-06-05T11:12:21", "url": "https://files.pythonhosted.org/packages/d2/90/ac2c554076e3842e2732d4e5f7e33c85918253cdac86f782ddfc961b251d/django-tradukoj-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "e5ccaa696e4f70a69aea9938fc3d8c3d", "sha256": "4e62b2abfdc25553d4039510f236b49572e0a008ca40d2b095cdf5e1cb1b488c" }, "downloads": -1, "filename": "django_tradukoj-1.0.2-py2-none-any.whl", "has_sig": false, "md5_digest": "e5ccaa696e4f70a69aea9938fc3d8c3d", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=3.6.0", "size": 15836, "upload_time": "2019-06-05T11:42:11", "url": "https://files.pythonhosted.org/packages/3d/4e/617ae00eaceb747e3865f0c7823684c997f2a9e45bd226c43d54b2d1a013/django_tradukoj-1.0.2-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2c5a7ff3bcd6eddb9a133137850a2ffe", "sha256": "f2f208e28f0a24cf7602cdab70099c1819aa17154ddb546a97f9553e72b08163" }, "downloads": -1, "filename": "django-tradukoj-1.0.2.tar.gz", "has_sig": false, "md5_digest": "2c5a7ff3bcd6eddb9a133137850a2ffe", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 13230, "upload_time": "2019-06-05T11:42:13", "url": "https://files.pythonhosted.org/packages/1e/f8/ee75d453e5fa5b591c6dcb500a1757ed1dd837cba7025582c0e5562dd462/django-tradukoj-1.0.2.tar.gz" } ], "1.0.3": [ { "comment_text": "", "digests": { "md5": "50503100b8ec2994b398f3b128cb4759", "sha256": "b83eaf9cb4e71ec26378193e6b6c9133e44f1643287e9c8b1f8ceb89d275a4af" }, "downloads": -1, "filename": "django_tradukoj-1.0.3-py2-none-any.whl", "has_sig": false, "md5_digest": "50503100b8ec2994b398f3b128cb4759", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=3.6.0", "size": 27377, "upload_time": "2019-06-10T19:58:19", "url": "https://files.pythonhosted.org/packages/31/2d/e8046b68c15dfcb2a05f197923a92c48d2b29481c4692dd8b9ae2845cb1d/django_tradukoj-1.0.3-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "680985d029ff3d5e4b3a54deced50991", "sha256": "263fe3dbe357c510c38f2456676e8100e4fda91af1297662c0a5802df1ea3d46" }, "downloads": -1, "filename": "django-tradukoj-1.0.3.tar.gz", "has_sig": false, "md5_digest": "680985d029ff3d5e4b3a54deced50991", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 17342, "upload_time": "2019-06-10T19:58:21", "url": "https://files.pythonhosted.org/packages/82/42/318869ad54fc7ea6e4bfed9d092d98f0ad089a5630edf0af1880ca80f19f/django-tradukoj-1.0.3.tar.gz" } ], "1.0.4": [ { "comment_text": "", "digests": { "md5": "013b3b036225026a6b65857e191ff221", "sha256": "934f6fc7e37618b9ead3f229b419821ff67fe3ef04a73a9af68cfa55680eaa13" }, "downloads": -1, "filename": "django_tradukoj-1.0.4-py2-none-any.whl", "has_sig": false, "md5_digest": "013b3b036225026a6b65857e191ff221", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": ">=3.6.0", "size": 27453, "upload_time": "2019-06-13T20:03:06", "url": "https://files.pythonhosted.org/packages/e6/2b/bd567f68817dec70db182b490993f28e793ae9af11216859a65d9e33e584/django_tradukoj-1.0.4-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ccf5e851415df714df9771722326c68c", "sha256": "fe24295b570f59e820a0458a338991cecc7e6a7e1e92a15d89c682ba012a419a" }, "downloads": -1, "filename": "django-tradukoj-1.0.4.tar.gz", "has_sig": false, "md5_digest": "ccf5e851415df714df9771722326c68c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 17360, "upload_time": "2019-06-13T20:03:09", "url": "https://files.pythonhosted.org/packages/ce/e4/30aa523946ffa2733ec41b22193ecfdf2eeb1eacb4d18614eebd96163fe1/django-tradukoj-1.0.4.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "6039113a40955ecda44afd1280c3683a", "sha256": "0e9c173f8ed36f25677790f4d0df7ba7d22c9f20cb77edd4a4a9a3ad3cd5f1a2" }, "downloads": -1, "filename": "django-tradukoj-1.1.0.tar.gz", "has_sig": false, "md5_digest": "6039113a40955ecda44afd1280c3683a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 17752, "upload_time": "2019-06-25T13:32:03", "url": "https://files.pythonhosted.org/packages/7e/ff/0ff2ab692f6593ddf552910a09e6e2460f20a4e128a59b39f1f8d37b903f/django-tradukoj-1.1.0.tar.gz" } ], "1.2.1": [ { "comment_text": "", "digests": { "md5": "001c76505aa856f1599539520c98e832", "sha256": "d0cf2b3ff25f309d58077a5c32ac258a1bbd228e1aa8ee4f9f9a40bb26923e75" }, "downloads": -1, "filename": "django_tradukoj-1.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "001c76505aa856f1599539520c98e832", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.0", "size": 27551, "upload_time": "2019-06-25T15:30:02", "url": "https://files.pythonhosted.org/packages/b8/7c/998edd6bb8c67fec548be3da2141353c8303b014d774392f3a77ea433b90/django_tradukoj-1.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fe21843879dfb10666a6d79afdca7ec3", "sha256": "8224671ed2a1e8af7f6f6984244d5aa42ebef114443ae121b2694d83cbde58d0" }, "downloads": -1, "filename": "django-tradukoj-1.2.1.tar.gz", "has_sig": false, "md5_digest": "fe21843879dfb10666a6d79afdca7ec3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 18995, "upload_time": "2019-06-25T15:30:04", "url": "https://files.pythonhosted.org/packages/f4/e8/0515be754d86561a176174b949fac387675a31f30310d13bae6bd53ca350/django-tradukoj-1.2.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "001c76505aa856f1599539520c98e832", "sha256": "d0cf2b3ff25f309d58077a5c32ac258a1bbd228e1aa8ee4f9f9a40bb26923e75" }, "downloads": -1, "filename": "django_tradukoj-1.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "001c76505aa856f1599539520c98e832", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.6.0", "size": 27551, "upload_time": "2019-06-25T15:30:02", "url": "https://files.pythonhosted.org/packages/b8/7c/998edd6bb8c67fec548be3da2141353c8303b014d774392f3a77ea433b90/django_tradukoj-1.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fe21843879dfb10666a6d79afdca7ec3", "sha256": "8224671ed2a1e8af7f6f6984244d5aa42ebef114443ae121b2694d83cbde58d0" }, "downloads": -1, "filename": "django-tradukoj-1.2.1.tar.gz", "has_sig": false, "md5_digest": "fe21843879dfb10666a6d79afdca7ec3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6.0", "size": 18995, "upload_time": "2019-06-25T15:30:04", "url": "https://files.pythonhosted.org/packages/f4/e8/0515be754d86561a176174b949fac387675a31f30310d13bae6bd53ca350/django-tradukoj-1.2.1.tar.gz" } ] }