# LangLint
> **Breaking Language Barriers in Global Collaboration** 🚀 | As Fast as Ruff, Integrate into Your CI/CD Pipeline
[](https://badge.fury.io/py/langlint)
[](https://pypi.org/project/langlint/)
[](https://opensource.org/licenses/MIT)
**LangLint** is an extensible automated translation platform designed to eliminate language barriers in code comments and docstrings across software development and international collaboration.
## 🚀 Quick Start
```bash
# Install
pip install langlint
# Scan translatable content
langlint scan src/
# Translate (preserve original files)
langlint translate src/ -o output/
# In-place translation (auto backup)
langlint fix src/
```
### 📸 Translation Effect
**Before** (Japanese code with comments):
```python
def calculate_total(items):
"""商品の合計金額を計算する"""
total = 0
for item in items:
total += item.price # 価格を累積
return total
```
**After** (One command: `langlint fix example.py`):
```python
def calculate_total(items):
"""Calculate the total price of the product"""
total = 0
for item in items:
total += item.price # Accumulate prices
return total
```
✨ **Code still works perfectly!** Only comments and docstrings are translated.
### Core Commands
| Command | Function | Example |
|---------|----------|---------|
| `scan` | Scan translatable content | `langlint scan .` |
| `translate` | Translate to new directory | `langlint translate . -o output/` |
| `fix` | In-place translate + backup | `langlint fix .` |
**Default: Google Translate, Auto-detect → English** (Free, no API Key required)
<details>
<summary>Other Translators (OpenAI, DeepL, Azure)</summary>
- `openai` - OpenAI GPT (requires `OPENAI_API_KEY`)
- `deepl` - DeepL (requires `DEEPL_API_KEY`)
- `azure` - Azure Translator (requires `AZURE_API_KEY`)
</details>
## ✨ Key Features
### 🌍 Multilingual Translation Support
- ✅ **100+ Language Pairs**: French↔English, German↔Chinese, Spanish↔Japanese, etc.
- ✅ **Smart Language Detection**: Auto-detect source language or specify manually
- ✅ **Syntax Protection**: Automatically excludes string literals and f-strings
- ✅ **High-Performance Concurrency**: Batch translation for multiple files
```bash
# Basic usage (auto-detect → English)
langlint fix src/
# European languages (French → English, specify source to avoid misdetection)
langlint fix french_code.py -s fr
# Translate to other languages (German → Chinese)
langlint fix german_code.py -s de -l zh-CN
```
<details>
<summary>📋 Supported Languages List</summary>
**European Languages**: English (en), French (fr), German (de), Spanish (es), Italian (it), Portuguese (pt), Russian (ru), Dutch (nl), Polish (pl), Swedish (sv)
**Asian Languages**: Simplified Chinese (zh-CN), Traditional Chinese (zh-TW), Japanese (ja), Korean (ko), Thai (th), Vietnamese (vi), Hindi (hi), Indonesian (id)
**Other Languages**: Arabic (ar), Hebrew (he), Turkish (tr), Greek (el), Persian (fa)
**Note**: European languages (French, German, Spanish, Italian, etc.) **must** use the `-s` parameter to specify source language, otherwise they will be misidentified as English!
</details>
### 🔌 Supported File Types
Python • Jupyter Notebook • JavaScript/TypeScript • Go • Rust • Java • C/C++ • Config files (YAML/TOML/JSON) • 20+ types
**What gets translated**: Comments and docstrings in code files. String literals and configuration values are preserved.
### ⚡ High Performance
Concurrent processing is **10-20x faster** than serial 🚀
<details>
<summary>📖 Detailed Usage Guide (Click to expand)</summary>
### Basic Commands
```bash
# Scan translatable content
langlint scan path/to/files
# Translate to new directory
langlint translate path/to/files -o output/
# In-place translation (auto backup)
langlint fix path/to/files
```
### Multilingual Translation Scenarios
```bash
# Scenario 1: Translate French code comments to English
langlint scan french_project/ -o report.json --format json
langlint translate french_project/ -s fr -o english_project/
# Scenario 2: Internationalize codebase
langlint fix src/
pytest tests/ # Verify code still works
# Scenario 3: Translate Jupyter Notebook
langlint fix notebooks/ -s zh-CN -l en
```
### Advanced Parameters
```bash
# Exclude specific files
langlint translate src/ -o output/ -e "**/test_*" -e "**/__pycache__/"
# Dry-run preview
langlint translate src/ -s fr --dry-run
# Use other translators
langlint translate src/ -t openai # Requires OPENAI_API_KEY
langlint translate src/ -t deepl # Requires DEEPL_API_KEY
```
</details>
<details>
<summary>🔧 Low-Level API Usage (Click to expand)</summary>
LangLint can be used as a Python library in your projects.
#### Basic API Usage
```python
import asyncio
from langlint.core.client import Dispatcher
from langlint.translators.google_translator import GoogleTranslator, GoogleConfig
from langlint.core.types import TranslatableUnit, UnitType
from pathlib import Path
async def translate_file_example():
"""Example of translating a single file"""
# 1. Create translator
config = GoogleConfig(
delay_range=(0.3, 0.6), # Delay 0.3-0.6s per request to avoid rate limits
timeout=30,
retry_count=3
)
translator = GoogleTranslator(config)
# 2. Create dispatcher
dispatcher = Dispatcher()
# 3. Parse file
file_path = Path("example.py")
result = await dispatcher.parse_file(str(file_path))
if result.success:
# 4. Translate extracted units
source_lang = "fr" # French
target_lang = "en" # English
texts = [unit.content for unit in result.units]
translation_results = await translator.translate_batch(
texts,
source_lang,
target_lang
)
# 5. Create translated units
translated_units = []
for unit, trans_result in zip(result.units, translation_results):
translated_unit = TranslatableUnit(
content=trans_result.translated_text,
unit_type=unit.unit_type,
line_number=unit.line_number,
column_number=unit.column_number,
context=unit.context
)
translated_units.append(translated_unit)
# 6. Reconstruct file
original_content = file_path.read_text(encoding='utf-8')
reconstructed = result.parser.reconstruct_file(
original_content,
translated_units,
str(file_path)
)
# 7. Write output
output_path = Path("example_translated.py")
output_path.write_text(reconstructed, encoding='utf-8')
print(f"Translation completed: {output_path}")
# Run example
asyncio.run(translate_file_example())
```
#### Batch Translate Multiple Files
```python
import asyncio
from pathlib import Path
from langlint.core.client import Dispatcher
from langlint.translators.google_translator import GoogleTranslator, GoogleConfig
async def batch_translate_project(
source_dir: str,
output_dir: str,
source_lang: str = "zh-CN",
target_lang: str = "en"
):
"""Batch translate project files"""
translator = GoogleTranslator(GoogleConfig())
dispatcher = Dispatcher()
source_path = Path(source_dir)
output_path = Path(output_dir)
output_path.mkdir(parents=True, exist_ok=True)
# Get all Python files
py_files = list(source_path.rglob("*.py"))
print(f"Found {len(py_files)} Python files")
for file_path in py_files:
try:
print(f"Translating: {file_path}")
# Parse file
result = await dispatcher.parse_file(str(file_path))
if not result.success or not result.units:
print(f" Skipped (no translatable content)")
continue
# Translate
texts = [unit.content for unit in result.units]
translations = await translator.translate_batch(
texts, source_lang, target_lang
)
# Reconstruct
translated_units = [
unit._replace(content=trans.translated_text)
for unit, trans in zip(result.units, translations)
]
original = file_path.read_text(encoding='utf-8')
reconstructed = result.parser.reconstruct_file(
original, translated_units, str(file_path)
)
# Save
relative = file_path.relative_to(source_path)
out_file = output_path / relative
out_file.parent.mkdir(parents=True, exist_ok=True)
out_file.write_text(reconstructed, encoding='utf-8')
print(f" ✓ Completed")
except Exception as e:
print(f" ✗ Error: {e}")
# Usage example
asyncio.run(batch_translate_project(
"src/", # Source directory
"src_en/", # Output directory
"fr", # French
"en" # English
))
```
#### Custom Translator
```python
from langlint.translators.base import Translator, TranslationResult, TranslationStatus
from typing import List
class CustomTranslator(Translator):
"""Custom translator example"""
def __init__(self, api_key: str):
super().__init__(name="custom")
self.api_key = api_key
async def translate(
self,
text: str,
source_language: str,
target_language: str
) -> TranslationResult:
"""Single text translation"""
# Implement your translation logic
translated = await self._call_your_api(text, source_language, target_language)
return TranslationResult(
original_text=text,
translated_text=translated,
source_language=source_language,
target_language=target_language,
status=TranslationStatus.SUCCESS,
confidence=0.9,
metadata={"translator": "custom"}
)
async def translate_batch(
self,
texts: List[str],
source_language: str,
target_language: str
) -> List[TranslationResult]:
"""Batch translation"""
# Use concurrency for efficiency
import asyncio
tasks = [
self.translate(text, source_language, target_language)
for text in texts
]
return await asyncio.gather(*tasks)
async def _call_your_api(self, text, source, target):
"""Call your translation API"""
# Implement API call logic
pass
```
#### 🎯 Best Practices
**1. Performance Optimization**
```python
# ✅ Recommended: Use batch translation
texts = ["text1", "text2", "text3"]
results = await translator.translate_batch(texts, "zh-CN", "en")
# ❌ Avoid: Translate one by one (slow)
for text in texts:
result = await translator.translate(text, "zh-CN", "en")
```
**2. Error Handling**
```python
try:
result = await translator.translate(text, source_lang, target_lang)
if result.status == TranslationStatus.SUCCESS:
print(f"Translation succeeded: {result.translated_text}")
else:
print(f"Translation failed: {result.metadata.get('error')}")
except Exception as e:
print(f"Exception: {e}")
```
**3. Rate Limit Management**
```python
# Google Translate limit: ~5 requests/sec
config = GoogleConfig(
delay_range=(0.3, 0.6), # Delay per request to avoid limits
retry_count=3, # Retry attempts on failure
timeout=30 # Timeout duration
)
translator = GoogleTranslator(config)
```
**4. Concurrency Control**
```python
import asyncio
# Use Semaphore to control concurrency
sem = asyncio.Semaphore(5) # Max 5 concurrent requests
async def translate_with_limit(text):
async with sem:
return await translator.translate(text, "fr", "en")
tasks = [translate_with_limit(t) for t in texts]
results = await asyncio.gather(*tasks)
```
**5. Language Code Standards**
```python
# ✅ Recommended: Use standard language codes with region specifiers
"zh-CN" # Simplified Chinese (REQUIRED - use this instead of "zh")
"zh-TW" # Traditional Chinese
"en" # English
"fr" # French
"de" # German
"es" # Spanish
"ja" # Japanese
"ko" # Korean
# ⚠️ Warning: Ambiguous codes (will show warnings)
"zh" # Ambiguous! Will be auto-converted to zh-CN with a warning
# ❌ Avoid: Non-standard codes
"chinese" # Not supported - use "zh-CN" or "zh-TW"
```
**重要提示**:对于中文翻译,请务必使用 `zh-CN`(简体中文)或 `zh-TW`(繁体中文),而不是单独的 `zh`。虽然系统会自动将 `zh` 转换为 `zh-CN`,但会显示警告信息。
</details>
<details>
<summary>⚙️ Configuration File (Click to expand)</summary>
Configure in `pyproject.toml`:
```toml
[tool.langlint]
translator = "google"
target_lang = "en"
source_lang = ["zh-CN", "ja", "ko"]
exclude = ["**/test_*", "**/data/"]
# Path-specific settings (example for different code directories)
[tool.langlint."backend/**/*.py"]
translator = "deepl"
```
</details>
## 🤖 CI/CD Integration
**Integrate into Your Workflow Like Ruff** - Automate multilingual code checking and translation!
Supports: GitHub Actions ✅ | GitLab CI ✅ | Azure Pipelines ✅ | Pre-commit Hooks ✅ | Docker ✅
### 🎯 Best Practice: Use with Ruff
```bash
# First, check code quality with Ruff
ruff check . --fix
# Then, translate with LangLint (auto-detects non-English, translates to English)
langlint fix .
# Finally, run Ruff again to ensure translated code meets standards
ruff check .
```
<details>
<summary>📋 View Complete CI/CD Integration Configuration (Click to expand)</summary>
Integrate LangLint into your CI/CD pipeline to automate multilingual code checking and translation, just as simple as using Ruff for code quality checks!
### GitHub Actions Integration ⭐ Recommended
#### 1️⃣ Automatic Translation Coverage Check
Add to `.github/workflows/langlint-check.yml`:
```yaml
name: LangLint Check
on:
push:
branches: [main, develop]
pull_request:
branches: [main, develop]
jobs:
langlint-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: 'pip'
- name: Install LangLint
run: |
pip install langlint
- name: Scan for translatable content
run: |
langlint scan . -o report.json --format json
- name: Check translation requirements
run: |
# Check for translatable content
if [ -s report.json ]; then
echo "⚠️ Found translatable content. Run 'langlint translate' locally."
cat report.json
else
echo "✅ No translatable content found."
fi
```
#### 2️⃣ Auto-Translate and Create PR
Automatically translate Chinese code to English and create a Pull Request:
```yaml
name: Auto Translate
on:
workflow_dispatch: # Manual trigger
schedule:
- cron: '0 0 * * 0' # Run every Sunday
jobs:
translate:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install LangLint
run: pip install langlint
- name: Translate code
run: |
langlint translate src/ -o src_en/
- name: Create Pull Request
uses: peter-evans/create-pull-request@v5
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: 'chore: auto translate to English'
title: '🌐 Auto-translated code to English'
body: |
This PR contains auto-translated code from Chinese to English.
**Translation Details:**
- Source Language: Chinese (zh-CN)
- Target Language: English (en)
- Translator: Google Translate
Please review carefully before merging.
branch: auto-translate/en
delete-branch: true
```
#### 3️⃣ Pre-commit Integration Check
Block commits containing untranslated Chinese comments:
```yaml
name: Pre-commit Check
on:
pull_request:
types: [opened, synchronize]
jobs:
check-translation:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install LangLint
run: pip install langlint
- name: Check for non-English content
run: |
# Scan for translatable content
langlint scan . -o report.json --format json
# Check if any non-English content exists
# This checks for common non-English language codes
if grep -qE '"(zh-CN|zh-TW|ja|ko|fr|de|es|it|pt|ru|ar|hi|th|vi)"' report.json; then
echo "❌ Found non-English content. Please translate before committing."
echo "Run: langlint fix ."
echo ""
echo "Detected languages:"
grep -oE '"(zh-CN|zh-TW|ja|ko|fr|de|es|it|pt|ru|ar|hi|th|vi)"' report.json | sort -u
exit 1
fi
echo "✅ All content is in English."
```
#### 4️⃣ Batch Translate Project Code
Automatically translate all code comments in a project:
```yaml
name: Translate Project
on:
workflow_dispatch: # Manual trigger
jobs:
translate-project:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: 'pip'
- name: Install LangLint
run: pip install langlint
- name: Translate all code comments
run: |
# Translate Python files
langlint fix src/ -s zh-CN -l en
# Translate JavaScript files
langlint fix frontend/ -s zh-CN -l en
# Translate Jupyter Notebooks
langlint fix notebooks/ -s zh-CN -l en
- name: Create Pull Request
uses: peter-evans/create-pull-request@v5
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: 'chore: translate code comments to English'
title: '🌐 Translated code comments'
branch: translate-comments
```
### Pre-commit Hooks Integration
Like Ruff, add LangLint to your pre-commit configuration.
#### Install pre-commit
```bash
pip install pre-commit
```
#### Configure `.pre-commit-config.yaml`
**Option 1: Remote Hook (Recommended)** - Automatically installs LangLint when needed:
```yaml
repos:
# LangLint - Check translatable content
- repo: https://github.com/HzaCode/Langlint
rev: main # Or use a specific tag when available
hooks:
- id: langlint-scan
# Optional: Auto-translate (use with caution)
- id: langlint-fix
stages: [manual] # Manual trigger only
# Ruff - Code checking (for comparison)
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.1.0
hooks:
- id: ruff
args: [--fix, --exit-non-zero-on-fix]
```
**Option 2: Local Hook** - Uses your locally installed LangLint:
```yaml
repos:
# LangLint - Check translatable content
- repo: local
hooks:
- id: langlint-scan
name: LangLint Scan
entry: langlint scan
language: system
types: [python]
pass_filenames: true
verbose: true
# Optional: Auto-translate (use with caution)
- id: langlint-fix
name: LangLint Auto-fix
entry: langlint fix
language: system
types: [python]
pass_filenames: true
stages: [manual] # Manual trigger only
# Ruff - Code checking (for comparison)
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.1.0
hooks:
- id: ruff
args: [--fix, --exit-non-zero-on-fix]
```
**Note**:
- **Remote hook**: pre-commit will automatically install LangLint in an isolated environment. No manual installation needed!
- **Local hook**: Requires `pip install langlint` first, but gives you control over the version.
#### Use pre-commit
```bash
# Install hooks
pre-commit install
# Auto-run on each commit
git commit -m "feat: add new feature"
# Manually run all hooks
pre-commit run --all-files
# Manually trigger translation
pre-commit run langlint-fix --all-files
```
### GitLab CI Integration
Add to `.gitlab-ci.yml`:
```yaml
stages:
- lint
- translate
langlint-check:
stage: lint
image: python:3.11
script:
- pip install langlint
- langlint scan . -o report.json --format json
- |
if [ -s report.json ]; then
echo "⚠️ Found translatable content"
cat report.json
fi
artifacts:
paths:
- report.json
expire_in: 1 week
langlint-translate:
stage: translate
image: python:3.11
only:
- main
script:
- pip install langlint
- langlint translate src/ -o src_en/
artifacts:
paths:
- src_en/
expire_in: 1 month
```
### Azure Pipelines Integration
Add to `azure-pipelines.yml`:
```yaml
trigger:
- main
- develop
pool:
vmImage: 'ubuntu-latest'
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.11'
displayName: 'Use Python 3.11'
- script: |
pip install langlint
displayName: 'Install LangLint'
- script: |
langlint scan . -o $(Build.ArtifactStagingDirectory)/report.json --format json
displayName: 'Scan translatable content'
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: '$(Build.ArtifactStagingDirectory)'
artifactName: 'langlint-report'
```
### Docker Integration
#### Dockerfile Example
```dockerfile
FROM python:3.11-slim
WORKDIR /app
# Install LangLint
RUN pip install --no-cache-dir langlint
# Copy source code
COPY . .
# Run translation
CMD ["langlint", "translate", ".", "-t", "google", "-s", "zh-CN", "-l", "en", "-o", "output/"]
```
#### Use Docker Compose
```yaml
version: '3.8'
services:
langlint:
image: python:3.11-slim
volumes:
- .:/app
working_dir: /app
command: >
sh -c "
pip install langlint &&
langlint translate src/ -o src_en/
"
```
### VS Code Integration (Coming Soon)
Upcoming VS Code extension will provide:
- ✅ Real-time translation suggestions
- ✅ Right-click menu translation
- ✅ Auto-translate on save
- ✅ Translation status indicator
### Best Practices
#### 1️⃣ Phased Integration
```bash
# Phase 1: Scan only, don't block CI
langlint scan . -o report.json --format json
# Phase 2: Generate warnings
if grep -qE '"(zh-CN|zh-TW|ja|ko|fr|de|es|it|pt|ru|ar|hi|th|vi)"' report.json; then
echo "⚠️ Warning: Found non-English content"
grep -oE '"(zh-CN|zh-TW|ja|ko|fr|de|es|it|pt|ru|ar|hi|th|vi)"' report.json | sort -u
fi
# Phase 3: Block commits (strict mode)
if grep -qE '"(zh-CN|zh-TW|ja|ko|fr|de|es|it|pt|ru|ar|hi|th|vi)"' report.json; then
echo "❌ Error: Non-English content found. Must translate before merging"
grep -oE '"(zh-CN|zh-TW|ja|ko|fr|de|es|it|pt|ru|ar|hi|th|vi)"' report.json | sort -u
exit 1
fi
```
#### 2️⃣ Translate Only New Content
```bash
# Get changed files (handles filenames with spaces)
git diff -z --name-only origin/main... | xargs -0 langlint fix
# Or using a loop for more control
git diff --name-only origin/main... | while IFS= read -r file; do
langlint fix "$file"
done
```
#### 3️⃣ Cache Optimization
```yaml
# Enable cache in GitHub Actions
- name: Cache LangLint
uses: actions/cache@v3
with:
path: ~/.cache/langlint
key: ${{ runner.os }}-langlint-${{ hashFiles('**/*.py') }}
restore-keys: |
${{ runner.os }}-langlint-
```
### Enterprise Deployment
#### Self-hosted Runner
```yaml
jobs:
translate:
runs-on: [self-hosted, linux, x64]
steps:
- name: Translate with enterprise translator
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: |
langlint translate src/ -t openai -o src_en/
```
#### Secrets Management
```yaml
# Configure in GitHub Secrets
# Settings > Secrets and variables > Actions > New repository secret
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
DEEPL_API_KEY: ${{ secrets.DEEPL_API_KEY }}
```
Through CI/CD integration, LangLint can become an indispensable part of your development workflow, just like Ruff, automating multilingual code translation and improving team collaboration efficiency!
</details>
## 🤝 Contributing
Contributions welcome! See the [Contributing Guide](CONTRIBUTING.md).
## 📄 License
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.
## 📞 Contact
- **Homepage**: https://github.com/HzaCode/Langlint
- **Issue Tracker**: https://github.com/HzaCode/Langlint/issues
- **Discussions**: https://github.com/HzaCode/Langlint/discussions
---
⭐ **LLM too slow? Try LangLint!**
Raw data
{
"_id": null,
"home_page": null,
"name": "langlint",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "LangLint Team <ang@hezhiang.com>",
"keywords": "translation, internationalization, scientific-collaboration, parsing, i18n",
"author": null,
"author_email": "LangLint Team <ang@hezhiang.com>",
"download_url": "https://files.pythonhosted.org/packages/44/13/d34d5dba8a20123287e9b90395d22fe0db617772d470bb6f6b03a6090cc9/langlint-0.0.6.tar.gz",
"platform": null,
"description": "# LangLint\r\n\r\n> **Breaking Language Barriers in Global Collaboration** \ud83d\ude80 | As Fast as Ruff, Integrate into Your CI/CD Pipeline\r\n\r\n[](https://badge.fury.io/py/langlint)\r\n[](https://pypi.org/project/langlint/)\r\n[](https://opensource.org/licenses/MIT)\r\n\r\n**LangLint** is an extensible automated translation platform designed to eliminate language barriers in code comments and docstrings across software development and international collaboration.\r\n\r\n## \ud83d\ude80 Quick Start\r\n\r\n```bash\r\n# Install\r\npip install langlint\r\n\r\n# Scan translatable content\r\nlanglint scan src/\r\n\r\n# Translate (preserve original files)\r\nlanglint translate src/ -o output/\r\n\r\n# In-place translation (auto backup)\r\nlanglint fix src/\r\n```\r\n\r\n### \ud83d\udcf8 Translation Effect\r\n\r\n**Before** (Japanese code with comments):\r\n```python\r\ndef calculate_total(items):\r\n \"\"\"\u5546\u54c1\u306e\u5408\u8a08\u91d1\u984d\u3092\u8a08\u7b97\u3059\u308b\"\"\"\r\n total = 0\r\n for item in items:\r\n total += item.price # \u4fa1\u683c\u3092\u7d2f\u7a4d\r\n return total\r\n```\r\n\r\n**After** (One command: `langlint fix example.py`):\r\n```python\r\ndef calculate_total(items):\r\n \"\"\"Calculate the total price of the product\"\"\"\r\n total = 0\r\n for item in items:\r\n total += item.price # Accumulate prices\r\n return total\r\n```\r\n\r\n\u2728 **Code still works perfectly!** Only comments and docstrings are translated.\r\n\r\n### Core Commands\r\n\r\n| Command | Function | Example |\r\n|---------|----------|---------|\r\n| `scan` | Scan translatable content | `langlint scan .` |\r\n| `translate` | Translate to new directory | `langlint translate . -o output/` |\r\n| `fix` | In-place translate + backup | `langlint fix .` |\r\n\r\n**Default: Google Translate, Auto-detect \u2192 English** (Free, no API Key required)\r\n\r\n<details>\r\n<summary>Other Translators (OpenAI, DeepL, Azure)</summary>\r\n\r\n- `openai` - OpenAI GPT (requires `OPENAI_API_KEY`)\r\n- `deepl` - DeepL (requires `DEEPL_API_KEY`)\r\n- `azure` - Azure Translator (requires `AZURE_API_KEY`)\r\n\r\n</details>\r\n\r\n## \u2728 Key Features\r\n\r\n### \ud83c\udf0d Multilingual Translation Support\r\n\r\n- \u2705 **100+ Language Pairs**: French\u2194English, German\u2194Chinese, Spanish\u2194Japanese, etc.\r\n- \u2705 **Smart Language Detection**: Auto-detect source language or specify manually\r\n- \u2705 **Syntax Protection**: Automatically excludes string literals and f-strings\r\n- \u2705 **High-Performance Concurrency**: Batch translation for multiple files\r\n\r\n```bash\r\n# Basic usage (auto-detect \u2192 English)\r\nlanglint fix src/\r\n\r\n# European languages (French \u2192 English, specify source to avoid misdetection)\r\nlanglint fix french_code.py -s fr\r\n\r\n# Translate to other languages (German \u2192 Chinese)\r\nlanglint fix german_code.py -s de -l zh-CN\r\n```\r\n\r\n<details>\r\n<summary>\ud83d\udccb Supported Languages List</summary>\r\n\r\n**European Languages**: English (en), French (fr), German (de), Spanish (es), Italian (it), Portuguese (pt), Russian (ru), Dutch (nl), Polish (pl), Swedish (sv)\r\n\r\n**Asian Languages**: Simplified Chinese (zh-CN), Traditional Chinese (zh-TW), Japanese (ja), Korean (ko), Thai (th), Vietnamese (vi), Hindi (hi), Indonesian (id)\r\n\r\n**Other Languages**: Arabic (ar), Hebrew (he), Turkish (tr), Greek (el), Persian (fa)\r\n\r\n**Note**: European languages (French, German, Spanish, Italian, etc.) **must** use the `-s` parameter to specify source language, otherwise they will be misidentified as English!\r\n\r\n</details>\r\n\r\n### \ud83d\udd0c Supported File Types\r\nPython \u2022 Jupyter Notebook \u2022 JavaScript/TypeScript \u2022 Go \u2022 Rust \u2022 Java \u2022 C/C++ \u2022 Config files (YAML/TOML/JSON) \u2022 20+ types\r\n\r\n**What gets translated**: Comments and docstrings in code files. String literals and configuration values are preserved.\r\n\r\n### \u26a1 High Performance\r\nConcurrent processing is **10-20x faster** than serial \ud83d\ude80\r\n\r\n<details>\r\n<summary>\ud83d\udcd6 Detailed Usage Guide (Click to expand)</summary>\r\n\r\n### Basic Commands\r\n\r\n```bash\r\n# Scan translatable content\r\nlanglint scan path/to/files\r\n\r\n# Translate to new directory\r\nlanglint translate path/to/files -o output/\r\n\r\n# In-place translation (auto backup)\r\nlanglint fix path/to/files\r\n```\r\n\r\n### Multilingual Translation Scenarios\r\n\r\n```bash\r\n# Scenario 1: Translate French code comments to English\r\nlanglint scan french_project/ -o report.json --format json\r\nlanglint translate french_project/ -s fr -o english_project/\r\n\r\n# Scenario 2: Internationalize codebase\r\nlanglint fix src/\r\npytest tests/ # Verify code still works\r\n\r\n# Scenario 3: Translate Jupyter Notebook\r\nlanglint fix notebooks/ -s zh-CN -l en\r\n```\r\n\r\n### Advanced Parameters\r\n\r\n```bash\r\n# Exclude specific files\r\nlanglint translate src/ -o output/ -e \"**/test_*\" -e \"**/__pycache__/\"\r\n\r\n# Dry-run preview\r\nlanglint translate src/ -s fr --dry-run\r\n\r\n# Use other translators\r\nlanglint translate src/ -t openai # Requires OPENAI_API_KEY\r\nlanglint translate src/ -t deepl # Requires DEEPL_API_KEY\r\n```\r\n\r\n</details>\r\n\r\n<details>\r\n<summary>\ud83d\udd27 Low-Level API Usage (Click to expand)</summary>\r\n\r\nLangLint can be used as a Python library in your projects.\r\n\r\n#### Basic API Usage\r\n\r\n```python\r\nimport asyncio\r\nfrom langlint.core.client import Dispatcher\r\nfrom langlint.translators.google_translator import GoogleTranslator, GoogleConfig\r\nfrom langlint.core.types import TranslatableUnit, UnitType\r\nfrom pathlib import Path\r\n\r\nasync def translate_file_example():\r\n \"\"\"Example of translating a single file\"\"\"\r\n \r\n # 1. Create translator\r\n config = GoogleConfig(\r\n delay_range=(0.3, 0.6), # Delay 0.3-0.6s per request to avoid rate limits\r\n timeout=30,\r\n retry_count=3\r\n )\r\n translator = GoogleTranslator(config)\r\n \r\n # 2. Create dispatcher\r\n dispatcher = Dispatcher()\r\n \r\n # 3. Parse file\r\n file_path = Path(\"example.py\")\r\n result = await dispatcher.parse_file(str(file_path))\r\n \r\n if result.success:\r\n # 4. Translate extracted units\r\n source_lang = \"fr\" # French\r\n target_lang = \"en\" # English\r\n \r\n texts = [unit.content for unit in result.units]\r\n translation_results = await translator.translate_batch(\r\n texts, \r\n source_lang, \r\n target_lang\r\n )\r\n \r\n # 5. Create translated units\r\n translated_units = []\r\n for unit, trans_result in zip(result.units, translation_results):\r\n translated_unit = TranslatableUnit(\r\n content=trans_result.translated_text,\r\n unit_type=unit.unit_type,\r\n line_number=unit.line_number,\r\n column_number=unit.column_number,\r\n context=unit.context\r\n )\r\n translated_units.append(translated_unit)\r\n \r\n # 6. Reconstruct file\r\n original_content = file_path.read_text(encoding='utf-8')\r\n reconstructed = result.parser.reconstruct_file(\r\n original_content, \r\n translated_units, \r\n str(file_path)\r\n )\r\n \r\n # 7. Write output\r\n output_path = Path(\"example_translated.py\")\r\n output_path.write_text(reconstructed, encoding='utf-8')\r\n \r\n print(f\"Translation completed: {output_path}\")\r\n\r\n# Run example\r\nasyncio.run(translate_file_example())\r\n```\r\n\r\n#### Batch Translate Multiple Files\r\n\r\n```python\r\nimport asyncio\r\nfrom pathlib import Path\r\nfrom langlint.core.client import Dispatcher\r\nfrom langlint.translators.google_translator import GoogleTranslator, GoogleConfig\r\n\r\nasync def batch_translate_project(\r\n source_dir: str, \r\n output_dir: str, \r\n source_lang: str = \"zh-CN\",\r\n target_lang: str = \"en\"\r\n):\r\n \"\"\"Batch translate project files\"\"\"\r\n \r\n translator = GoogleTranslator(GoogleConfig())\r\n dispatcher = Dispatcher()\r\n \r\n source_path = Path(source_dir)\r\n output_path = Path(output_dir)\r\n output_path.mkdir(parents=True, exist_ok=True)\r\n \r\n # Get all Python files\r\n py_files = list(source_path.rglob(\"*.py\"))\r\n \r\n print(f\"Found {len(py_files)} Python files\")\r\n \r\n for file_path in py_files:\r\n try:\r\n print(f\"Translating: {file_path}\")\r\n \r\n # Parse file\r\n result = await dispatcher.parse_file(str(file_path))\r\n \r\n if not result.success or not result.units:\r\n print(f\" Skipped (no translatable content)\")\r\n continue\r\n \r\n # Translate\r\n texts = [unit.content for unit in result.units]\r\n translations = await translator.translate_batch(\r\n texts, source_lang, target_lang\r\n )\r\n \r\n # Reconstruct\r\n translated_units = [\r\n unit._replace(content=trans.translated_text)\r\n for unit, trans in zip(result.units, translations)\r\n ]\r\n \r\n original = file_path.read_text(encoding='utf-8')\r\n reconstructed = result.parser.reconstruct_file(\r\n original, translated_units, str(file_path)\r\n )\r\n \r\n # Save\r\n relative = file_path.relative_to(source_path)\r\n out_file = output_path / relative\r\n out_file.parent.mkdir(parents=True, exist_ok=True)\r\n out_file.write_text(reconstructed, encoding='utf-8')\r\n \r\n print(f\" \u2713 Completed\")\r\n \r\n except Exception as e:\r\n print(f\" \u2717 Error: {e}\")\r\n\r\n# Usage example\r\nasyncio.run(batch_translate_project(\r\n \"src/\", # Source directory\r\n \"src_en/\", # Output directory\r\n \"fr\", # French\r\n \"en\" # English\r\n))\r\n```\r\n\r\n#### Custom Translator\r\n\r\n```python\r\nfrom langlint.translators.base import Translator, TranslationResult, TranslationStatus\r\nfrom typing import List\r\n\r\nclass CustomTranslator(Translator):\r\n \"\"\"Custom translator example\"\"\"\r\n \r\n def __init__(self, api_key: str):\r\n super().__init__(name=\"custom\")\r\n self.api_key = api_key\r\n \r\n async def translate(\r\n self, \r\n text: str, \r\n source_language: str, \r\n target_language: str\r\n ) -> TranslationResult:\r\n \"\"\"Single text translation\"\"\"\r\n # Implement your translation logic\r\n translated = await self._call_your_api(text, source_language, target_language)\r\n \r\n return TranslationResult(\r\n original_text=text,\r\n translated_text=translated,\r\n source_language=source_language,\r\n target_language=target_language,\r\n status=TranslationStatus.SUCCESS,\r\n confidence=0.9,\r\n metadata={\"translator\": \"custom\"}\r\n )\r\n \r\n async def translate_batch(\r\n self, \r\n texts: List[str], \r\n source_language: str, \r\n target_language: str\r\n ) -> List[TranslationResult]:\r\n \"\"\"Batch translation\"\"\"\r\n # Use concurrency for efficiency\r\n import asyncio\r\n tasks = [\r\n self.translate(text, source_language, target_language) \r\n for text in texts\r\n ]\r\n return await asyncio.gather(*tasks)\r\n \r\n async def _call_your_api(self, text, source, target):\r\n \"\"\"Call your translation API\"\"\"\r\n # Implement API call logic\r\n pass\r\n```\r\n\r\n#### \ud83c\udfaf Best Practices\r\n\r\n**1. Performance Optimization**\r\n\r\n```python\r\n# \u2705 Recommended: Use batch translation\r\ntexts = [\"text1\", \"text2\", \"text3\"]\r\nresults = await translator.translate_batch(texts, \"zh-CN\", \"en\")\r\n\r\n# \u274c Avoid: Translate one by one (slow)\r\nfor text in texts:\r\n result = await translator.translate(text, \"zh-CN\", \"en\")\r\n```\r\n\r\n**2. Error Handling**\r\n\r\n```python\r\ntry:\r\n result = await translator.translate(text, source_lang, target_lang)\r\n if result.status == TranslationStatus.SUCCESS:\r\n print(f\"Translation succeeded: {result.translated_text}\")\r\n else:\r\n print(f\"Translation failed: {result.metadata.get('error')}\")\r\nexcept Exception as e:\r\n print(f\"Exception: {e}\")\r\n```\r\n\r\n**3. Rate Limit Management**\r\n\r\n```python\r\n# Google Translate limit: ~5 requests/sec\r\nconfig = GoogleConfig(\r\n delay_range=(0.3, 0.6), # Delay per request to avoid limits\r\n retry_count=3, # Retry attempts on failure\r\n timeout=30 # Timeout duration\r\n)\r\ntranslator = GoogleTranslator(config)\r\n```\r\n\r\n**4. Concurrency Control**\r\n\r\n```python\r\nimport asyncio\r\n\r\n# Use Semaphore to control concurrency\r\nsem = asyncio.Semaphore(5) # Max 5 concurrent requests\r\n\r\nasync def translate_with_limit(text):\r\n async with sem:\r\n return await translator.translate(text, \"fr\", \"en\")\r\n\r\ntasks = [translate_with_limit(t) for t in texts]\r\nresults = await asyncio.gather(*tasks)\r\n```\r\n\r\n**5. Language Code Standards**\r\n\r\n```python\r\n# \u2705 Recommended: Use standard language codes with region specifiers\r\n\"zh-CN\" # Simplified Chinese (REQUIRED - use this instead of \"zh\")\r\n\"zh-TW\" # Traditional Chinese\r\n\"en\" # English\r\n\"fr\" # French\r\n\"de\" # German\r\n\"es\" # Spanish\r\n\"ja\" # Japanese\r\n\"ko\" # Korean\r\n\r\n# \u26a0\ufe0f Warning: Ambiguous codes (will show warnings)\r\n\"zh\" # Ambiguous! Will be auto-converted to zh-CN with a warning\r\n\r\n# \u274c Avoid: Non-standard codes\r\n\"chinese\" # Not supported - use \"zh-CN\" or \"zh-TW\"\r\n```\r\n\r\n**\u91cd\u8981\u63d0\u793a**\uff1a\u5bf9\u4e8e\u4e2d\u6587\u7ffb\u8bd1\uff0c\u8bf7\u52a1\u5fc5\u4f7f\u7528 `zh-CN`\uff08\u7b80\u4f53\u4e2d\u6587\uff09\u6216 `zh-TW`\uff08\u7e41\u4f53\u4e2d\u6587\uff09\uff0c\u800c\u4e0d\u662f\u5355\u72ec\u7684 `zh`\u3002\u867d\u7136\u7cfb\u7edf\u4f1a\u81ea\u52a8\u5c06 `zh` \u8f6c\u6362\u4e3a `zh-CN`\uff0c\u4f46\u4f1a\u663e\u793a\u8b66\u544a\u4fe1\u606f\u3002\r\n\r\n</details>\r\n\r\n<details>\r\n<summary>\u2699\ufe0f Configuration File (Click to expand)</summary>\r\n\r\nConfigure in `pyproject.toml`:\r\n\r\n```toml\r\n[tool.langlint]\r\ntranslator = \"google\"\r\ntarget_lang = \"en\"\r\nsource_lang = [\"zh-CN\", \"ja\", \"ko\"]\r\nexclude = [\"**/test_*\", \"**/data/\"]\r\n\r\n# Path-specific settings (example for different code directories)\r\n[tool.langlint.\"backend/**/*.py\"]\r\ntranslator = \"deepl\"\r\n```\r\n\r\n</details>\r\n\r\n## \ud83e\udd16 CI/CD Integration\r\n\r\n**Integrate into Your Workflow Like Ruff** - Automate multilingual code checking and translation!\r\n\r\nSupports: GitHub Actions \u2705 | GitLab CI \u2705 | Azure Pipelines \u2705 | Pre-commit Hooks \u2705 | Docker \u2705\r\n\r\n### \ud83c\udfaf Best Practice: Use with Ruff\r\n\r\n```bash\r\n# First, check code quality with Ruff\r\nruff check . --fix\r\n\r\n# Then, translate with LangLint (auto-detects non-English, translates to English)\r\nlanglint fix .\r\n\r\n# Finally, run Ruff again to ensure translated code meets standards\r\nruff check .\r\n```\r\n\r\n<details>\r\n<summary>\ud83d\udccb View Complete CI/CD Integration Configuration (Click to expand)</summary>\r\n\r\nIntegrate LangLint into your CI/CD pipeline to automate multilingual code checking and translation, just as simple as using Ruff for code quality checks!\r\n\r\n### GitHub Actions Integration \u2b50 Recommended\r\n\r\n#### 1\ufe0f\u20e3 Automatic Translation Coverage Check\r\n\r\nAdd to `.github/workflows/langlint-check.yml`:\r\n\r\n```yaml\r\nname: LangLint Check\r\n\r\non:\r\n push:\r\n branches: [main, develop]\r\n pull_request:\r\n branches: [main, develop]\r\n\r\njobs:\r\n langlint-check:\r\n runs-on: ubuntu-latest\r\n steps:\r\n - uses: actions/checkout@v4\r\n \r\n - name: Set up Python\r\n uses: actions/setup-python@v5\r\n with:\r\n python-version: '3.11'\r\n cache: 'pip'\r\n \r\n - name: Install LangLint\r\n run: |\r\n pip install langlint\r\n \r\n - name: Scan for translatable content\r\n run: |\r\n langlint scan . -o report.json --format json\r\n \r\n - name: Check translation requirements\r\n run: |\r\n # Check for translatable content\r\n if [ -s report.json ]; then\r\n echo \"\u26a0\ufe0f Found translatable content. Run 'langlint translate' locally.\"\r\n cat report.json\r\n else\r\n echo \"\u2705 No translatable content found.\"\r\n fi\r\n```\r\n\r\n#### 2\ufe0f\u20e3 Auto-Translate and Create PR\r\n\r\nAutomatically translate Chinese code to English and create a Pull Request:\r\n\r\n```yaml\r\nname: Auto Translate\r\n\r\non:\r\n workflow_dispatch: # Manual trigger\r\n schedule:\r\n - cron: '0 0 * * 0' # Run every Sunday\r\n\r\njobs:\r\n translate:\r\n runs-on: ubuntu-latest\r\n permissions:\r\n contents: write\r\n pull-requests: write\r\n \r\n steps:\r\n - uses: actions/checkout@v4\r\n \r\n - name: Set up Python\r\n uses: actions/setup-python@v4\r\n with:\r\n python-version: '3.11'\r\n \r\n - name: Install LangLint\r\n run: pip install langlint\r\n \r\n - name: Translate code\r\n run: |\r\n langlint translate src/ -o src_en/\r\n \r\n - name: Create Pull Request\r\n uses: peter-evans/create-pull-request@v5\r\n with:\r\n token: ${{ secrets.GITHUB_TOKEN }}\r\n commit-message: 'chore: auto translate to English'\r\n title: '\ud83c\udf10 Auto-translated code to English'\r\n body: |\r\n This PR contains auto-translated code from Chinese to English.\r\n \r\n **Translation Details:**\r\n - Source Language: Chinese (zh-CN)\r\n - Target Language: English (en)\r\n - Translator: Google Translate\r\n \r\n Please review carefully before merging.\r\n branch: auto-translate/en\r\n delete-branch: true\r\n```\r\n\r\n#### 3\ufe0f\u20e3 Pre-commit Integration Check\r\n\r\nBlock commits containing untranslated Chinese comments:\r\n\r\n```yaml\r\nname: Pre-commit Check\r\n\r\non:\r\n pull_request:\r\n types: [opened, synchronize]\r\n\r\njobs:\r\n check-translation:\r\n runs-on: ubuntu-latest\r\n steps:\r\n - uses: actions/checkout@v4\r\n \r\n - name: Set up Python\r\n uses: actions/setup-python@v4\r\n with:\r\n python-version: '3.11'\r\n \r\n - name: Install LangLint\r\n run: pip install langlint\r\n \r\n - name: Check for non-English content\r\n run: |\r\n # Scan for translatable content\r\n langlint scan . -o report.json --format json\r\n \r\n # Check if any non-English content exists\r\n # This checks for common non-English language codes\r\n if grep -qE '\"(zh-CN|zh-TW|ja|ko|fr|de|es|it|pt|ru|ar|hi|th|vi)\"' report.json; then\r\n echo \"\u274c Found non-English content. Please translate before committing.\"\r\n echo \"Run: langlint fix .\"\r\n echo \"\"\r\n echo \"Detected languages:\"\r\n grep -oE '\"(zh-CN|zh-TW|ja|ko|fr|de|es|it|pt|ru|ar|hi|th|vi)\"' report.json | sort -u\r\n exit 1\r\n fi\r\n \r\n echo \"\u2705 All content is in English.\"\r\n```\r\n\r\n#### 4\ufe0f\u20e3 Batch Translate Project Code\r\n\r\nAutomatically translate all code comments in a project:\r\n\r\n```yaml\r\nname: Translate Project\r\n\r\non:\r\n workflow_dispatch: # Manual trigger\r\n\r\njobs:\r\n translate-project:\r\n runs-on: ubuntu-latest\r\n steps:\r\n - uses: actions/checkout@v4\r\n \r\n - name: Set up Python\r\n uses: actions/setup-python@v5\r\n with:\r\n python-version: '3.11'\r\n cache: 'pip'\r\n \r\n - name: Install LangLint\r\n run: pip install langlint\r\n \r\n - name: Translate all code comments\r\n run: |\r\n # Translate Python files\r\n langlint fix src/ -s zh-CN -l en\r\n \r\n # Translate JavaScript files\r\n langlint fix frontend/ -s zh-CN -l en\r\n \r\n # Translate Jupyter Notebooks\r\n langlint fix notebooks/ -s zh-CN -l en\r\n \r\n - name: Create Pull Request\r\n uses: peter-evans/create-pull-request@v5\r\n with:\r\n token: ${{ secrets.GITHUB_TOKEN }}\r\n commit-message: 'chore: translate code comments to English'\r\n title: '\ud83c\udf10 Translated code comments'\r\n branch: translate-comments\r\n```\r\n\r\n### Pre-commit Hooks Integration\r\n\r\nLike Ruff, add LangLint to your pre-commit configuration.\r\n\r\n#### Install pre-commit\r\n\r\n```bash\r\npip install pre-commit\r\n```\r\n\r\n#### Configure `.pre-commit-config.yaml`\r\n\r\n**Option 1: Remote Hook (Recommended)** - Automatically installs LangLint when needed:\r\n\r\n```yaml\r\nrepos:\r\n # LangLint - Check translatable content\r\n - repo: https://github.com/HzaCode/Langlint\r\n rev: main # Or use a specific tag when available\r\n hooks:\r\n - id: langlint-scan\r\n \r\n # Optional: Auto-translate (use with caution)\r\n - id: langlint-fix\r\n stages: [manual] # Manual trigger only\r\n \r\n # Ruff - Code checking (for comparison)\r\n - repo: https://github.com/astral-sh/ruff-pre-commit\r\n rev: v0.1.0\r\n hooks:\r\n - id: ruff\r\n args: [--fix, --exit-non-zero-on-fix]\r\n```\r\n\r\n**Option 2: Local Hook** - Uses your locally installed LangLint:\r\n\r\n```yaml\r\nrepos:\r\n # LangLint - Check translatable content\r\n - repo: local\r\n hooks:\r\n - id: langlint-scan\r\n name: LangLint Scan\r\n entry: langlint scan\r\n language: system\r\n types: [python]\r\n pass_filenames: true\r\n verbose: true\r\n \r\n # Optional: Auto-translate (use with caution)\r\n - id: langlint-fix\r\n name: LangLint Auto-fix\r\n entry: langlint fix\r\n language: system\r\n types: [python]\r\n pass_filenames: true\r\n stages: [manual] # Manual trigger only\r\n \r\n # Ruff - Code checking (for comparison)\r\n - repo: https://github.com/astral-sh/ruff-pre-commit\r\n rev: v0.1.0\r\n hooks:\r\n - id: ruff\r\n args: [--fix, --exit-non-zero-on-fix]\r\n```\r\n\r\n**Note**: \r\n- **Remote hook**: pre-commit will automatically install LangLint in an isolated environment. No manual installation needed!\r\n- **Local hook**: Requires `pip install langlint` first, but gives you control over the version.\r\n\r\n#### Use pre-commit\r\n\r\n```bash\r\n# Install hooks\r\npre-commit install\r\n\r\n# Auto-run on each commit\r\ngit commit -m \"feat: add new feature\"\r\n\r\n# Manually run all hooks\r\npre-commit run --all-files\r\n\r\n# Manually trigger translation\r\npre-commit run langlint-fix --all-files\r\n```\r\n\r\n### GitLab CI Integration\r\n\r\nAdd to `.gitlab-ci.yml`:\r\n\r\n```yaml\r\nstages:\r\n - lint\r\n - translate\r\n\r\nlanglint-check:\r\n stage: lint\r\n image: python:3.11\r\n script:\r\n - pip install langlint\r\n - langlint scan . -o report.json --format json\r\n - |\r\n if [ -s report.json ]; then\r\n echo \"\u26a0\ufe0f Found translatable content\"\r\n cat report.json\r\n fi\r\n artifacts:\r\n paths:\r\n - report.json\r\n expire_in: 1 week\r\n\r\nlanglint-translate:\r\n stage: translate\r\n image: python:3.11\r\n only:\r\n - main\r\n script:\r\n - pip install langlint\r\n - langlint translate src/ -o src_en/\r\n artifacts:\r\n paths:\r\n - src_en/\r\n expire_in: 1 month\r\n```\r\n\r\n### Azure Pipelines Integration\r\n\r\nAdd to `azure-pipelines.yml`:\r\n\r\n```yaml\r\ntrigger:\r\n - main\r\n - develop\r\n\r\npool:\r\n vmImage: 'ubuntu-latest'\r\n\r\nsteps:\r\n- task: UsePythonVersion@0\r\n inputs:\r\n versionSpec: '3.11'\r\n displayName: 'Use Python 3.11'\r\n\r\n- script: |\r\n pip install langlint\r\n displayName: 'Install LangLint'\r\n\r\n- script: |\r\n langlint scan . -o $(Build.ArtifactStagingDirectory)/report.json --format json\r\n displayName: 'Scan translatable content'\r\n\r\n- task: PublishBuildArtifacts@1\r\n inputs:\r\n pathToPublish: '$(Build.ArtifactStagingDirectory)'\r\n artifactName: 'langlint-report'\r\n```\r\n\r\n### Docker Integration\r\n\r\n#### Dockerfile Example\r\n\r\n```dockerfile\r\nFROM python:3.11-slim\r\n\r\nWORKDIR /app\r\n\r\n# Install LangLint\r\nRUN pip install --no-cache-dir langlint\r\n\r\n# Copy source code\r\nCOPY . .\r\n\r\n# Run translation\r\nCMD [\"langlint\", \"translate\", \".\", \"-t\", \"google\", \"-s\", \"zh-CN\", \"-l\", \"en\", \"-o\", \"output/\"]\r\n```\r\n\r\n#### Use Docker Compose\r\n\r\n```yaml\r\nversion: '3.8'\r\n\r\nservices:\r\n langlint:\r\n image: python:3.11-slim\r\n volumes:\r\n - .:/app\r\n working_dir: /app\r\n command: >\r\n sh -c \"\r\n pip install langlint &&\r\n langlint translate src/ -o src_en/\r\n \"\r\n```\r\n\r\n### VS Code Integration (Coming Soon)\r\n\r\nUpcoming VS Code extension will provide:\r\n- \u2705 Real-time translation suggestions\r\n- \u2705 Right-click menu translation\r\n- \u2705 Auto-translate on save\r\n- \u2705 Translation status indicator\r\n\r\n### Best Practices\r\n\r\n#### 1\ufe0f\u20e3 Phased Integration\r\n\r\n```bash\r\n# Phase 1: Scan only, don't block CI\r\nlanglint scan . -o report.json --format json\r\n\r\n# Phase 2: Generate warnings\r\nif grep -qE '\"(zh-CN|zh-TW|ja|ko|fr|de|es|it|pt|ru|ar|hi|th|vi)\"' report.json; then\r\n echo \"\u26a0\ufe0f Warning: Found non-English content\"\r\n grep -oE '\"(zh-CN|zh-TW|ja|ko|fr|de|es|it|pt|ru|ar|hi|th|vi)\"' report.json | sort -u\r\nfi\r\n\r\n# Phase 3: Block commits (strict mode)\r\nif grep -qE '\"(zh-CN|zh-TW|ja|ko|fr|de|es|it|pt|ru|ar|hi|th|vi)\"' report.json; then\r\n echo \"\u274c Error: Non-English content found. Must translate before merging\"\r\n grep -oE '\"(zh-CN|zh-TW|ja|ko|fr|de|es|it|pt|ru|ar|hi|th|vi)\"' report.json | sort -u\r\n exit 1\r\nfi\r\n```\r\n\r\n#### 2\ufe0f\u20e3 Translate Only New Content\r\n\r\n```bash\r\n# Get changed files (handles filenames with spaces)\r\ngit diff -z --name-only origin/main... | xargs -0 langlint fix\r\n\r\n# Or using a loop for more control\r\ngit diff --name-only origin/main... | while IFS= read -r file; do\r\n langlint fix \"$file\"\r\ndone\r\n```\r\n\r\n#### 3\ufe0f\u20e3 Cache Optimization\r\n\r\n```yaml\r\n# Enable cache in GitHub Actions\r\n- name: Cache LangLint\r\n uses: actions/cache@v3\r\n with:\r\n path: ~/.cache/langlint\r\n key: ${{ runner.os }}-langlint-${{ hashFiles('**/*.py') }}\r\n restore-keys: |\r\n ${{ runner.os }}-langlint-\r\n```\r\n\r\n### Enterprise Deployment\r\n\r\n#### Self-hosted Runner\r\n\r\n```yaml\r\njobs:\r\n translate:\r\n runs-on: [self-hosted, linux, x64]\r\n steps:\r\n - name: Translate with enterprise translator\r\n env:\r\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\r\n run: |\r\n langlint translate src/ -t openai -o src_en/\r\n```\r\n\r\n#### Secrets Management\r\n\r\n```yaml\r\n# Configure in GitHub Secrets\r\n# Settings > Secrets and variables > Actions > New repository secret\r\n\r\nenv:\r\n OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}\r\n DEEPL_API_KEY: ${{ secrets.DEEPL_API_KEY }}\r\n```\r\n\r\nThrough CI/CD integration, LangLint can become an indispensable part of your development workflow, just like Ruff, automating multilingual code translation and improving team collaboration efficiency!\r\n\r\n</details>\r\n\r\n## \ud83e\udd1d Contributing\r\n\r\nContributions welcome! See the [Contributing Guide](CONTRIBUTING.md).\r\n\r\n## \ud83d\udcc4 License\r\n\r\nThis project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.\r\n\r\n## \ud83d\udcde Contact\r\n\r\n- **Homepage**: https://github.com/HzaCode/Langlint\r\n- **Issue Tracker**: https://github.com/HzaCode/Langlint/issues\r\n- **Discussions**: https://github.com/HzaCode/Langlint/discussions\r\n\r\n---\r\n\r\n\u2b50 **LLM too slow? Try LangLint!**\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A scalable, domain-agnostic platform for automated translation and standardization of structured text in scientific collaboration",
"version": "0.0.6",
"project_urls": {
"Changelog": "https://github.com/HzaCode/Langlint/blob/main/CHANGELOG.md",
"Documentation": "https://github.com/HzaCode/Langlint",
"Homepage": "https://github.com/HzaCode/Langlint",
"Issues": "https://github.com/HzaCode/Langlint/issues",
"Repository": "https://github.com/HzaCode/Langlint.git"
},
"split_keywords": [
"translation",
" internationalization",
" scientific-collaboration",
" parsing",
" i18n"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "a6604a86aeaf4d1b8365cab82638dddaeae74cbf9a4cc5de25527fc3f9788be7",
"md5": "6abe48cb4976ea3696c13d633399b9d5",
"sha256": "7725525b5b0dab64b135cd684f24f8cd2a3022f310b05d74e3fa85d2c47d0578"
},
"downloads": -1,
"filename": "langlint-0.0.6-py3-none-any.whl",
"has_sig": false,
"md5_digest": "6abe48cb4976ea3696c13d633399b9d5",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 72043,
"upload_time": "2025-10-06T20:31:27",
"upload_time_iso_8601": "2025-10-06T20:31:27.813241Z",
"url": "https://files.pythonhosted.org/packages/a6/60/4a86aeaf4d1b8365cab82638dddaeae74cbf9a4cc5de25527fc3f9788be7/langlint-0.0.6-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4413d34d5dba8a20123287e9b90395d22fe0db617772d470bb6f6b03a6090cc9",
"md5": "085b0e4259453cbf03d72c08ccd33520",
"sha256": "e5ba38de5692fbdea7e2672ad4e0891e02b9d27af1c12bec626765f219415462"
},
"downloads": -1,
"filename": "langlint-0.0.6.tar.gz",
"has_sig": false,
"md5_digest": "085b0e4259453cbf03d72c08ccd33520",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 66513,
"upload_time": "2025-10-06T20:31:29",
"upload_time_iso_8601": "2025-10-06T20:31:29.078661Z",
"url": "https://files.pythonhosted.org/packages/44/13/d34d5dba8a20123287e9b90395d22fe0db617772d470bb6f6b03a6090cc9/langlint-0.0.6.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-06 20:31:29",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "HzaCode",
"github_project": "Langlint",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "langlint"
}