django-jinx


Namedjango-jinx JSON
Version 0.0.1 PyPI version JSON
download
home_page
SummaryA full-stack i18n solution for Django
upload_time2023-03-23 16:40:15
maintainer
docs_urlNone
author
requires_python>=3.11
licenseMIT License Copyright (c) 2023 kiritoscs@gmail.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords django i18n internationalization translation localization l10n django-i18n django-internationalization django-translation django-localization django-l10n
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Jinx

## 什么是Jinx
Jinx是一个Django项目国际化的一站式辅助工具

Django国际化常常包含以下流程
1. 检查翻译标记
2. 提取词条
3. 机器翻译词条
4. 人工检验词条(将机器翻译好的词条导出交付给相应的人员进行校对)
5. 将确认无误的词条写入po文件
6. 编译

可以看到国际化不是一蹴而就的, 而且每个项目的国际化流程都不尽相同

那么jinx可以帮助你完成以下工作

1. [检查翻译标记](#1检查翻译标记)由[Marker](marker/README.md)负责
2. [提取词条](#2提取词条) 由[Extractor](extractor/README.md)负责, 或者 利用Django自带makemessages命令进行词条提取
3. [机器翻译词条](#3机器翻译词条) 由[Translator](translator/README.md)负责
4. [人工检验词条](#4人工检验词条) 由[Exporter](exporter/README.md)导出json文件, 交付给负责人
5. [将确认无误的词条写入po文件](#5将确认无误的词条写入po文件) 由[Translator](translator/README.md)负责
6. [编译](#6编译) 由[Compiler](compiler/README.md)负责, 或者 利用Django自带compilemessages命令进行编译


## 快速开始

### 安装
因为暂时未提供pip的方式, 可以使用git clone的方式安装, 推荐使用poetry安装依赖

```bash
git clone https://github.com/kiritoscs/jinx
cd jinx
poetry install
```

如果你不想使用poetry, 可以使用pip安装依赖

参考[pyproject.toml](pyproject.toml)里的`[tool.poetry.dependencies]`

### 生成配置文件
```bash
mv jinx.template.toml jinx.toml
```

### 1.检查翻译标记

```bash
python jinx.py marker -d ${YOUR_DJANGO_PROJECT_DIR}
```
- YOUR_DJANGO_PROJECT_DIR: 你的Django项目目录

详细配置参考[配置说明](#配置说明)

标记之后, 需要检查一下标记是否正确, 有时候会出现标记错误的情况, 具体参考[Marker](marker/README.md)

### 2.提取词条
**PlanA**: 利用extractor提取词条, 本质是基于marker的结果进行提取, 所以需要先检查标记结果
```bash
python jinx.py extractor -t ${YOUR_DJANGO_PROJECT_DIR} -l ${YOUR_PO_FILE}
```
- YOUR_DJANGO_PROJECT_DIR: 你的Django项目目录
- YOUR_PO_FILE: 你的po文件目录, 也支持填入locale目录, 会自动寻找locale目录下的对应语言po文件


**PlanB**: Django自带的makemessages命令(推荐)
```bash
python manage.py makemessages -l ${YOUR_LANGUAGE}
```
或者
```bash
djano-admin makemessages -l ${YOUR_LANGUAGE}
```

### 3.机器翻译词条
```bash
python jinx.py translator -p ${YOUR_PO_FILE} -o {YOUR_OFFICIAL_DICT_DIR}
```
- YOUR_PO_FILE: 你的po文件目录, 也支持填入locale目录, 会自动寻找locale目录下的对应语言po文件
- YOUR_OFFICIAL_DICT_DIR: 你的官方词典目录, JSON格式, 用于翻译时的参考, 最大匹配翻译, 参考[官方词典official_dict](official_dict.template.json)

默认白嫖使用GoogleAPI翻译, 略慢

目前内置了以下翻译来源
- youdao_client, 有道翻译服务, 需要自己去申请
- google_api, 暂时通过爬虫的形式使用, 速度较慢

详细配置参考[配置说明](#配置说明)

### 4.人工检验词条
导出词条
```bash
python jinx.py exporter -p ${YOUR_PO_FILE} -e ${YOUR_OUTPUT_DIR}
```
- YOUR_PO_FILE: 你的po文件目录, 也支持填入locale目录, 会自动寻找locale目录下的对应语言po文件
- YOUR_OUTPUT_DIR: 你的输出文件名, 暂时支持json, 默认为contents.json

### 5.将确认无误的词条写入po文件
```bash
python jinx.py translator -p ${YOUR_PO_FILE} -o ${YOUR_FINAL_JSON_FILE} -m overwrite
```
- YOUR_PO_FILE: 你的po文件目录, 也支持填入locale目录, 会自动寻找locale目录下的对应语言po文件
- YOUR_FINAL_JSON_FILE: 你的最终json文件, 用于更新po文件

### 6.编译
**PlanA**: 利用compiler编译
```bash
python jinx.py compiler -l ${YOUR_PO_FILE}
```
- YOUR_PO_FILE: 你的po文件目录, 也支持填入locale目录, 会自动寻找locale目录下的对应语言po文件

**PlanB**: 利用Django compilemessages编译
```bash
python manage.py compilemessages
```
或者
```bash
djano-admin compilemessages
```


### 配置说明

```toml
[language]
# 当前项目语言, 枚举参考 common/constants.py/LanguageEnum
current = "zh-CN"
# 翻译目标语言, 枚举参考 common/constants.py/LanguageEnum
dest = "en"

[marker]
# 标记器
## 严格模式, 存在f-string格式化的需要国际化的字符串时, 会跳过该文件的标记
strict_mode = false

[marker.filter]
# 过滤器, 不想翻译的文件或者目录
## 过滤目录
exclude_paths = [
    "web",
    "scripts",
    "migrations",
    "tests"
]
## 过滤文件
exclude_files = [
    "manage.py",
    "urls.py",
    "wsgi.py",
    "tests.py"
]

[marker.translation_func]
# 默认的翻译函数配置
## 默认的翻译函数
default = "ugettext_lazy"
## 翻译函数别名
alias = "_"

[marker.str_conditions.token]
# token(单词)的字符串条件配置
## 包含
contains = []
## 不包含
not_contains = []
## 以...开头
startswith = []
## 不以...开头
not_startswith = []
## 以...结尾
endswith = []
## 不以...结尾
not_endswith = ["\"\"\"", "'''"]

[marker.str_conditions.source_line]
# source_line(源码)的字符串条件配置
## 包含
contains = []
## 不包含
not_contains = ["logger", "__name__"]
## 以...开头
startswith = []
## 不以...开头
not_startswith = []
## 以...结尾
endswith = []
## 不以...结尾
not_endswith = ["\"\"\"", "'''"]


[translator]
# 翻译器
provider = "google_api"
mode = "update"


[youdao_client]
# 有道翻译客户端配置
url = "https://openapi.youdao.com/api"
app_key = ""
app_secret = ""
# domain是有道翻译的一个参数, 用于区分不同的翻译场景, 一般不需要修改
# 支持的领域参考: common/constants.py/YouDaoSupportDomainEnum
domain = "general"

```

            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "django-jinx",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.11",
    "maintainer_email": "",
    "keywords": "django i18n internationalization translation localization l10n django-i18n django-internationalization django-translation django-localization django-l10n",
    "author": "",
    "author_email": "kiritoscs <kiritoscs@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/81/9f/4e5e9407db8f9c6f1bd3174d005989fd180b409f5a0007b076632a1d2603/django_jinx-0.0.1.tar.gz",
    "platform": null,
    "description": "# Jinx\n\n## \u4ec0\u4e48\u662fJinx\nJinx\u662f\u4e00\u4e2aDjango\u9879\u76ee\u56fd\u9645\u5316\u7684\u4e00\u7ad9\u5f0f\u8f85\u52a9\u5de5\u5177\n\nDjango\u56fd\u9645\u5316\u5e38\u5e38\u5305\u542b\u4ee5\u4e0b\u6d41\u7a0b\n1. \u68c0\u67e5\u7ffb\u8bd1\u6807\u8bb0\n2. \u63d0\u53d6\u8bcd\u6761\n3. \u673a\u5668\u7ffb\u8bd1\u8bcd\u6761\n4. \u4eba\u5de5\u68c0\u9a8c\u8bcd\u6761(\u5c06\u673a\u5668\u7ffb\u8bd1\u597d\u7684\u8bcd\u6761\u5bfc\u51fa\u4ea4\u4ed8\u7ed9\u76f8\u5e94\u7684\u4eba\u5458\u8fdb\u884c\u6821\u5bf9)\n5. \u5c06\u786e\u8ba4\u65e0\u8bef\u7684\u8bcd\u6761\u5199\u5165po\u6587\u4ef6\n6. \u7f16\u8bd1\n\n\u53ef\u4ee5\u770b\u5230\u56fd\u9645\u5316\u4e0d\u662f\u4e00\u8e74\u800c\u5c31\u7684, \u800c\u4e14\u6bcf\u4e2a\u9879\u76ee\u7684\u56fd\u9645\u5316\u6d41\u7a0b\u90fd\u4e0d\u5c3d\u76f8\u540c\n\n\u90a3\u4e48jinx\u53ef\u4ee5\u5e2e\u52a9\u4f60\u5b8c\u6210\u4ee5\u4e0b\u5de5\u4f5c\n\n1. [\u68c0\u67e5\u7ffb\u8bd1\u6807\u8bb0](#1\u68c0\u67e5\u7ffb\u8bd1\u6807\u8bb0)\u7531[Marker](marker/README.md)\u8d1f\u8d23\n2. [\u63d0\u53d6\u8bcd\u6761](#2\u63d0\u53d6\u8bcd\u6761) \u7531[Extractor](extractor/README.md)\u8d1f\u8d23, \u6216\u8005 \u5229\u7528Django\u81ea\u5e26makemessages\u547d\u4ee4\u8fdb\u884c\u8bcd\u6761\u63d0\u53d6\n3. [\u673a\u5668\u7ffb\u8bd1\u8bcd\u6761](#3\u673a\u5668\u7ffb\u8bd1\u8bcd\u6761) \u7531[Translator](translator/README.md)\u8d1f\u8d23\n4. [\u4eba\u5de5\u68c0\u9a8c\u8bcd\u6761](#4\u4eba\u5de5\u68c0\u9a8c\u8bcd\u6761) \u7531[Exporter](exporter/README.md)\u5bfc\u51fajson\u6587\u4ef6, \u4ea4\u4ed8\u7ed9\u8d1f\u8d23\u4eba\n5. [\u5c06\u786e\u8ba4\u65e0\u8bef\u7684\u8bcd\u6761\u5199\u5165po\u6587\u4ef6](#5\u5c06\u786e\u8ba4\u65e0\u8bef\u7684\u8bcd\u6761\u5199\u5165po\u6587\u4ef6) \u7531[Translator](translator/README.md)\u8d1f\u8d23\n6. [\u7f16\u8bd1](#6\u7f16\u8bd1) \u7531[Compiler](compiler/README.md)\u8d1f\u8d23, \u6216\u8005 \u5229\u7528Django\u81ea\u5e26compilemessages\u547d\u4ee4\u8fdb\u884c\u7f16\u8bd1\n\n\n## \u5feb\u901f\u5f00\u59cb\n\n### \u5b89\u88c5\n\u56e0\u4e3a\u6682\u65f6\u672a\u63d0\u4f9bpip\u7684\u65b9\u5f0f, \u53ef\u4ee5\u4f7f\u7528git clone\u7684\u65b9\u5f0f\u5b89\u88c5, \u63a8\u8350\u4f7f\u7528poetry\u5b89\u88c5\u4f9d\u8d56\n\n```bash\ngit clone https://github.com/kiritoscs/jinx\ncd jinx\npoetry install\n```\n\n\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528poetry, \u53ef\u4ee5\u4f7f\u7528pip\u5b89\u88c5\u4f9d\u8d56\n\n\u53c2\u8003[pyproject.toml](pyproject.toml)\u91cc\u7684`[tool.poetry.dependencies]`\n\n### \u751f\u6210\u914d\u7f6e\u6587\u4ef6\n```bash\nmv jinx.template.toml jinx.toml\n```\n\n### 1.\u68c0\u67e5\u7ffb\u8bd1\u6807\u8bb0\n\n```bash\npython jinx.py marker -d ${YOUR_DJANGO_PROJECT_DIR}\n```\n- YOUR_DJANGO_PROJECT_DIR: \u4f60\u7684Django\u9879\u76ee\u76ee\u5f55\n\n\u8be6\u7ec6\u914d\u7f6e\u53c2\u8003[\u914d\u7f6e\u8bf4\u660e](#\u914d\u7f6e\u8bf4\u660e)\n\n\u6807\u8bb0\u4e4b\u540e, \u9700\u8981\u68c0\u67e5\u4e00\u4e0b\u6807\u8bb0\u662f\u5426\u6b63\u786e, \u6709\u65f6\u5019\u4f1a\u51fa\u73b0\u6807\u8bb0\u9519\u8bef\u7684\u60c5\u51b5, \u5177\u4f53\u53c2\u8003[Marker](marker/README.md)\n\n### 2.\u63d0\u53d6\u8bcd\u6761\n**PlanA**: \u5229\u7528extractor\u63d0\u53d6\u8bcd\u6761, \u672c\u8d28\u662f\u57fa\u4e8emarker\u7684\u7ed3\u679c\u8fdb\u884c\u63d0\u53d6, \u6240\u4ee5\u9700\u8981\u5148\u68c0\u67e5\u6807\u8bb0\u7ed3\u679c\n```bash\npython jinx.py extractor -t ${YOUR_DJANGO_PROJECT_DIR} -l ${YOUR_PO_FILE}\n```\n- YOUR_DJANGO_PROJECT_DIR: \u4f60\u7684Django\u9879\u76ee\u76ee\u5f55\n- YOUR_PO_FILE: \u4f60\u7684po\u6587\u4ef6\u76ee\u5f55, \u4e5f\u652f\u6301\u586b\u5165locale\u76ee\u5f55, \u4f1a\u81ea\u52a8\u5bfb\u627elocale\u76ee\u5f55\u4e0b\u7684\u5bf9\u5e94\u8bed\u8a00po\u6587\u4ef6\n\n\n**PlanB**: Django\u81ea\u5e26\u7684makemessages\u547d\u4ee4(\u63a8\u8350)\n```bash\npython manage.py makemessages -l ${YOUR_LANGUAGE}\n```\n\u6216\u8005\n```bash\ndjano-admin makemessages -l ${YOUR_LANGUAGE}\n```\n\n### 3.\u673a\u5668\u7ffb\u8bd1\u8bcd\u6761\n```bash\npython jinx.py translator -p ${YOUR_PO_FILE} -o {YOUR_OFFICIAL_DICT_DIR}\n```\n- YOUR_PO_FILE: \u4f60\u7684po\u6587\u4ef6\u76ee\u5f55, \u4e5f\u652f\u6301\u586b\u5165locale\u76ee\u5f55, \u4f1a\u81ea\u52a8\u5bfb\u627elocale\u76ee\u5f55\u4e0b\u7684\u5bf9\u5e94\u8bed\u8a00po\u6587\u4ef6\n- YOUR_OFFICIAL_DICT_DIR: \u4f60\u7684\u5b98\u65b9\u8bcd\u5178\u76ee\u5f55, JSON\u683c\u5f0f, \u7528\u4e8e\u7ffb\u8bd1\u65f6\u7684\u53c2\u8003, \u6700\u5927\u5339\u914d\u7ffb\u8bd1, \u53c2\u8003[\u5b98\u65b9\u8bcd\u5178official_dict](official_dict.template.json)\n\n\u9ed8\u8ba4\u767d\u5ad6\u4f7f\u7528GoogleAPI\u7ffb\u8bd1, \u7565\u6162\n\n\u76ee\u524d\u5185\u7f6e\u4e86\u4ee5\u4e0b\u7ffb\u8bd1\u6765\u6e90\n- youdao_client, \u6709\u9053\u7ffb\u8bd1\u670d\u52a1, \u9700\u8981\u81ea\u5df1\u53bb\u7533\u8bf7\n- google_api, \u6682\u65f6\u901a\u8fc7\u722c\u866b\u7684\u5f62\u5f0f\u4f7f\u7528, \u901f\u5ea6\u8f83\u6162\n\n\u8be6\u7ec6\u914d\u7f6e\u53c2\u8003[\u914d\u7f6e\u8bf4\u660e](#\u914d\u7f6e\u8bf4\u660e)\n\n### 4.\u4eba\u5de5\u68c0\u9a8c\u8bcd\u6761\n\u5bfc\u51fa\u8bcd\u6761\n```bash\npython jinx.py exporter -p ${YOUR_PO_FILE} -e ${YOUR_OUTPUT_DIR}\n```\n- YOUR_PO_FILE: \u4f60\u7684po\u6587\u4ef6\u76ee\u5f55, \u4e5f\u652f\u6301\u586b\u5165locale\u76ee\u5f55, \u4f1a\u81ea\u52a8\u5bfb\u627elocale\u76ee\u5f55\u4e0b\u7684\u5bf9\u5e94\u8bed\u8a00po\u6587\u4ef6\n- YOUR_OUTPUT_DIR: \u4f60\u7684\u8f93\u51fa\u6587\u4ef6\u540d, \u6682\u65f6\u652f\u6301json, \u9ed8\u8ba4\u4e3acontents.json\n\n### 5.\u5c06\u786e\u8ba4\u65e0\u8bef\u7684\u8bcd\u6761\u5199\u5165po\u6587\u4ef6\n```bash\npython jinx.py translator -p ${YOUR_PO_FILE} -o ${YOUR_FINAL_JSON_FILE} -m overwrite\n```\n- YOUR_PO_FILE: \u4f60\u7684po\u6587\u4ef6\u76ee\u5f55, \u4e5f\u652f\u6301\u586b\u5165locale\u76ee\u5f55, \u4f1a\u81ea\u52a8\u5bfb\u627elocale\u76ee\u5f55\u4e0b\u7684\u5bf9\u5e94\u8bed\u8a00po\u6587\u4ef6\n- YOUR_FINAL_JSON_FILE: \u4f60\u7684\u6700\u7ec8json\u6587\u4ef6, \u7528\u4e8e\u66f4\u65b0po\u6587\u4ef6\n\n### 6.\u7f16\u8bd1\n**PlanA**: \u5229\u7528compiler\u7f16\u8bd1\n```bash\npython jinx.py compiler -l ${YOUR_PO_FILE}\n```\n- YOUR_PO_FILE: \u4f60\u7684po\u6587\u4ef6\u76ee\u5f55, \u4e5f\u652f\u6301\u586b\u5165locale\u76ee\u5f55, \u4f1a\u81ea\u52a8\u5bfb\u627elocale\u76ee\u5f55\u4e0b\u7684\u5bf9\u5e94\u8bed\u8a00po\u6587\u4ef6\n\n**PlanB**: \u5229\u7528Django compilemessages\u7f16\u8bd1\n```bash\npython manage.py compilemessages\n```\n\u6216\u8005\n```bash\ndjano-admin compilemessages\n```\n\n\n### \u914d\u7f6e\u8bf4\u660e\n\n```toml\n[language]\n# \u5f53\u524d\u9879\u76ee\u8bed\u8a00, \u679a\u4e3e\u53c2\u8003 common/constants.py/LanguageEnum\ncurrent = \"zh-CN\"\n# \u7ffb\u8bd1\u76ee\u6807\u8bed\u8a00, \u679a\u4e3e\u53c2\u8003 common/constants.py/LanguageEnum\ndest = \"en\"\n\n[marker]\n# \u6807\u8bb0\u5668\n## \u4e25\u683c\u6a21\u5f0f, \u5b58\u5728f-string\u683c\u5f0f\u5316\u7684\u9700\u8981\u56fd\u9645\u5316\u7684\u5b57\u7b26\u4e32\u65f6, \u4f1a\u8df3\u8fc7\u8be5\u6587\u4ef6\u7684\u6807\u8bb0\nstrict_mode = false\n\n[marker.filter]\n# \u8fc7\u6ee4\u5668, \u4e0d\u60f3\u7ffb\u8bd1\u7684\u6587\u4ef6\u6216\u8005\u76ee\u5f55\n## \u8fc7\u6ee4\u76ee\u5f55\nexclude_paths = [\n    \"web\",\n    \"scripts\",\n    \"migrations\",\n    \"tests\"\n]\n## \u8fc7\u6ee4\u6587\u4ef6\nexclude_files = [\n    \"manage.py\",\n    \"urls.py\",\n    \"wsgi.py\",\n    \"tests.py\"\n]\n\n[marker.translation_func]\n# \u9ed8\u8ba4\u7684\u7ffb\u8bd1\u51fd\u6570\u914d\u7f6e\n## \u9ed8\u8ba4\u7684\u7ffb\u8bd1\u51fd\u6570\ndefault = \"ugettext_lazy\"\n## \u7ffb\u8bd1\u51fd\u6570\u522b\u540d\nalias = \"_\"\n\n[marker.str_conditions.token]\n# token(\u5355\u8bcd)\u7684\u5b57\u7b26\u4e32\u6761\u4ef6\u914d\u7f6e\n## \u5305\u542b\ncontains = []\n## \u4e0d\u5305\u542b\nnot_contains = []\n## \u4ee5...\u5f00\u5934\nstartswith = []\n## \u4e0d\u4ee5...\u5f00\u5934\nnot_startswith = []\n## \u4ee5...\u7ed3\u5c3e\nendswith = []\n## \u4e0d\u4ee5...\u7ed3\u5c3e\nnot_endswith = [\"\\\"\\\"\\\"\", \"'''\"]\n\n[marker.str_conditions.source_line]\n# source_line(\u6e90\u7801)\u7684\u5b57\u7b26\u4e32\u6761\u4ef6\u914d\u7f6e\n## \u5305\u542b\ncontains = []\n## \u4e0d\u5305\u542b\nnot_contains = [\"logger\", \"__name__\"]\n## \u4ee5...\u5f00\u5934\nstartswith = []\n## \u4e0d\u4ee5...\u5f00\u5934\nnot_startswith = []\n## \u4ee5...\u7ed3\u5c3e\nendswith = []\n## \u4e0d\u4ee5...\u7ed3\u5c3e\nnot_endswith = [\"\\\"\\\"\\\"\", \"'''\"]\n\n\n[translator]\n# \u7ffb\u8bd1\u5668\nprovider = \"google_api\"\nmode = \"update\"\n\n\n[youdao_client]\n# \u6709\u9053\u7ffb\u8bd1\u5ba2\u6237\u7aef\u914d\u7f6e\nurl = \"https://openapi.youdao.com/api\"\napp_key = \"\"\napp_secret = \"\"\n# domain\u662f\u6709\u9053\u7ffb\u8bd1\u7684\u4e00\u4e2a\u53c2\u6570, \u7528\u4e8e\u533a\u5206\u4e0d\u540c\u7684\u7ffb\u8bd1\u573a\u666f, \u4e00\u822c\u4e0d\u9700\u8981\u4fee\u6539\n# \u652f\u6301\u7684\u9886\u57df\u53c2\u8003: common/constants.py/YouDaoSupportDomainEnum\ndomain = \"general\"\n\n```\n",
    "bugtrack_url": null,
    "license": "MIT License  Copyright (c) 2023 kiritoscs@gmail.com  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
    "summary": "A full-stack i18n solution for Django",
    "version": "0.0.1",
    "split_keywords": [
        "django",
        "i18n",
        "internationalization",
        "translation",
        "localization",
        "l10n",
        "django-i18n",
        "django-internationalization",
        "django-translation",
        "django-localization",
        "django-l10n"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "26a4bc9888b08966bbb6f35f58f562a60276a343bcabebd847d7f86dd385599f",
                "md5": "598f292f982a6a7c28f77257ee65bc8d",
                "sha256": "b2e2903a2b1cb9a1a1a2e209e9468290c8ce75451e05640ddc33b0f15bbb44db"
            },
            "downloads": -1,
            "filename": "django_jinx-0.0.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "598f292f982a6a7c28f77257ee65bc8d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.11",
            "size": 29125,
            "upload_time": "2023-03-23T16:40:12",
            "upload_time_iso_8601": "2023-03-23T16:40:12.836036Z",
            "url": "https://files.pythonhosted.org/packages/26/a4/bc9888b08966bbb6f35f58f562a60276a343bcabebd847d7f86dd385599f/django_jinx-0.0.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "819f4e5e9407db8f9c6f1bd3174d005989fd180b409f5a0007b076632a1d2603",
                "md5": "34a29bd5e8d325b9da6b9251c879f396",
                "sha256": "8c65f1e27c4d4674864d72f2b9d255ca5490f11ecb216c577d1dbda27522d754"
            },
            "downloads": -1,
            "filename": "django_jinx-0.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "34a29bd5e8d325b9da6b9251c879f396",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.11",
            "size": 23242,
            "upload_time": "2023-03-23T16:40:15",
            "upload_time_iso_8601": "2023-03-23T16:40:15.443550Z",
            "url": "https://files.pythonhosted.org/packages/81/9f/4e5e9407db8f9c6f1bd3174d005989fd180b409f5a0007b076632a1d2603/django_jinx-0.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-03-23 16:40:15",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "lcname": "django-jinx"
}
        
Elapsed time: 0.05168s