langlint


Namelanglint JSON
Version 0.0.6 PyPI version JSON
download
home_pageNone
SummaryA scalable, domain-agnostic platform for automated translation and standardization of structured text in scientific collaboration
upload_time2025-10-06 20:31:29
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseMIT
keywords translation internationalization scientific-collaboration parsing i18n
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # LangLint

> **Breaking Language Barriers in Global Collaboration** 🚀 | As Fast as Ruff, Integrate into Your CI/CD Pipeline

[![PyPI](https://badge.fury.io/py/langlint.svg)](https://badge.fury.io/py/langlint)
[![Python](https://img.shields.io/pypi/pyversions/langlint.svg)](https://pypi.org/project/langlint/)
[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](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[![PyPI](https://badge.fury.io/py/langlint.svg)](https://badge.fury.io/py/langlint)\r\n[![Python](https://img.shields.io/pypi/pyversions/langlint.svg)](https://pypi.org/project/langlint/)\r\n[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](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"
}
        
Elapsed time: 2.35520s