A high-performance, Rust-powered toolkit for translating code comments and documentation. LangLint helps make scientific software more accessible and reusable for a global audience, fostering better international collaboration in open science.
LangLint is a code-aware translation and linting tool designed to enhance the accessibility of multilingual scientific software. Its core function is to accurately translate code comments and docstrings, making the source code understandable to a wider audience. By removing language barriers, the tool directly improves the reusability of software—a key principle of open science. This is especially valuable for international research teams, where clear communication is essential for collaboration and reproducibility.
- High-Performance Translation: Powered by Rust, LangLint is 10-50x faster than pure Python implementations, ensuring rapid and efficient processing of large codebases.
- Broad Language Support: Supports over 100 language pairs and 28+ programming file types, making it a versatile tool for diverse software projects.
- Syntax-Aware: Intelligently distinguishes between comments, docstrings, and code, preserving the integrity of the source code during translation.
- Seamless CI/CD Integration: Designed to be integrated into continuous integration workflows, much like code formatters (e.g., Ruff), to automate and enforce documentation standards.
- Promotes Open Science: By making code easier to understand for an international community, LangLint directly contributes to the reusability and collaborative potential of research software.
# Install via pip (now installs Rust-powered version)
pip install langlint
# Or use pipx for isolated environment
pipx install langlint
# Or use uv for fastest installation
uv tool install langlint💡 Zero Breaking Changes: Your existing scripts work immediately. Just upgrade and enjoy 10-50x speedup!
# Scan translatable content (now 10x faster!)
langlint scan src/
# Translate (preserve original files)
langlint translate src/ -s zh-CN -t en -o output/
# In-place translation (auto backup)
langlint fix src/ -s zh-CN -t enBefore (Japanese code with comments):
def calculate_total(items):
"""商品の合計金額を計算する"""
total = 0
for item in items:
# 価格を累積
total += item.price
return total
def apply_discount(price, rate):
"""割引を適用する関数"""
if rate < 0 or rate > 1:
# 無効な割引率
raise ValueError("割引率は0から1の間である必要があります")
# 割引後の価格を計算
discounted = price * (1 - rate)
return round(discounted, 2)After (One command: langlint fix example.py -s ja -t en):
def calculate_total(items):
"""Calculate the total price of the product"""
total = 0
for item in items:
# Accumulate prices
total += item.price
return total
def apply_discount(price, rate):
"""Function to apply discount"""
if rate < 0 or rate > 1:
# Invalid discount rate
raise ValueError("Discount rate must be between 0 and 1")
# Calculate discounted price
discounted = price * (1 - rate)
return round(discounted, 2)✨ Code still works perfectly! Only comments and docstrings are translated.
| Command | Function | Example |
|---|---|---|
scan |
Scan translatable content | langlint scan . |
translate |
Translate to new directory | langlint translate . -s auto -t en -o output/ |
fix |
In-place translate + backup | langlint fix . -s auto -t en |
Default: Google Translate, Auto-detect → English (Free, no API Key required)
Available Translators:
google- Google Translate (Free, no API key needed) ✅mock- Mock translator for testing ✅
- ✅ 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 (true parallelism in Rust!)
# 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 -t zh-CN📋 Supported Languages List
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!
- Python:
.py - JavaScript/TypeScript:
.js,.ts,.jsx,.tsx - Systems:
.rs(Rust),.go,.c,.cpp,.h,.hpp - JVM:
.java,.scala,.kt(Kotlin) - Others:
.cs,.php,.rb,.swift,.dart,.lua,.sh,.bash,.sql,.r,.R,.m,.vim
What gets translated: Comments and docstrings in code files. String literals and configuration values are preserved.
Rust-powered performance is 10-50x faster than the previous Python implementation! 🚀
True multi-threading (no GIL), zero-cost abstractions, and efficient memory management make LangLint blazing fast.
📖 Detailed Usage Guide (Click to expand)
# 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# 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 JavaScript project
langlint fix frontend/ -s zh-CN -t en# Exclude specific files
langlint translate src/ -o output/ -e "**/test_*" -e "**/__pycache__/"
# Dry-run preview
langlint translate src/ -s fr -t en --dry-run
# Use different translators
langlint translate src/ -s zh-CN -t en --translator google # Google Translate (available now)
langlint translate src/ -s zh-CN -t en --translator mock # Mock translator for testing🔧 Python API Usage (Click to expand)
LangLint can be used as a library in your Python projects. The API is 100% compatible with v0.0.6, but now runs on Rust!
# Import the Rust-powered module
import langlint_py
# Scan files (now 10x faster!)
result = langlint_py.scan(
"src/",
format="json",
verbose=True
)
print(result) # JSON output
# Translate (now 10x faster!)
result = langlint_py.translate(
"example.py",
source="zh",
target="en",
translator="google", # or "mock"
output="example_en.py",
dry_run=False
)
print(result) # {"status": "success", "translated": 9, ...}import langlint_py
import json
from pathlib import Path
# Scan entire project
result_json = langlint_py.scan("src/", format="json")
result = json.loads(result_json)
print(f"Found {result['total_units']} translatable units in {result['files_scanned']} files")
# Translate all Python files
for py_file in Path("src").rglob("*.py"):
print(f"Translating {py_file}...")
langlint_py.translate(
str(py_file),
source="zh",
target="en",
translator="mock",
dry_run=False
)import time
import langlint_py
# Benchmark
start = time.time()
result = langlint_py.scan("large_project/", format="json")
elapsed = time.time() - start
print(f"Scanned in {elapsed*1000:.2f}ms (Rust-powered!)")
# Typical: 3-5ms for 1000 lines
# Python v0.0.6 would take: 40-50ms for the same⚙️ Configuration File (Click to expand)
Just put the .langlint.yml file in the root directory of your project.
# Global settings
translator: "google" # google or mock
target_lang: "en"
source_lang: ["zh-CN", "ja", "ko"]
backup: true # Create backup files before in-place translation (default: true)
# File processing
include:
- "**/*.py"
- "**/*.js"
- "**/*.ts"
exclude:
- "**/node_modules/**"
- "**/test_*"
- "**/data/**"
# Path-specific overrides
path_configs:
"**/tests/**":
translator: "mock"
backup: false # Don't backup test files
"**/docs/**":
translator: "google"
target_lang: "en"Backup Control
The backup option controls whether backup files (.backup extension) are created during in-place translation:
# Use config file setting
langlint fix src/
# Force disable backup (overrides config)
langlint fix src/ --no-backupPriority: --no-backup flag > config file backup setting > default (true)
Configuration is loaded by the Rust core for maximum performance.
Integrate into Your Workflow Like Ruff - Automate multilingual code checking and translation!
Supports: GitHub Actions ✅ | GitLab CI ✅ | Azure Pipelines ✅ | Pre-commit Hooks ✅ | Docker ✅
# First, check code quality with Ruff
ruff check . --fix
# Then, translate with LangLint (now 10x faster with Rust!)
langlint fix .
# Finally, run Ruff again to ensure translated code meets standards
ruff check .📋 View Complete CI/CD Integration Configuration (Click to expand)
Integrate LangLint into your CI/CD pipeline to automate multilingual code checking and translation, just as simple as using Ruff for code quality checks!
Add to .github/workflows/langlint-check.yml:
name: LangLint Check
on:
push:
branches: [main, develop]
pull_request:
branches: [main, develop]
schedule:
- cron: '0 8 * * *' # Daily check to catch new untranslated content
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 (Rust-powered!)
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."
fiAutomatically translate Chinese code to English and create a Pull Request:
name: Auto Translate
on:
workflow_dispatch: # Manual trigger
schedule:
- cron: '0 8 * * *' # Run daily at 8 AM UTC to keep translations fresh
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 (Rust-powered!)
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: trueBlock commits containing untranslated Chinese comments:
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 (Rust-powered!)
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."Automatically translate all code comments in a project:
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 (Rust-powered!)
run: pip install langlint
- name: Translate all code comments
run: |
# Translate Python files
langlint fix src/ -s zh-CN -t en
# Translate JavaScript files
langlint fix frontend/ -s zh-CN -t 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-commentsLike Ruff, add LangLint to your pre-commit configuration.
pip install pre-commitOption 1: Remote Hook (Recommended) - Automatically installs LangLint when needed:
repos:
# LangLint - Check translatable content (Rust-powered!)
- repo: https://github.com/HzaCode/Langlint
rev: main # ✅ Use 'main' to always get the latest updates and language coverage
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]💡 Why use
rev: main? Keepingrev: mainensures you automatically benefit from the latest Langlint improvements, new language support, and bug fixes without manual updates. Perfect for rapidly evolving projects!
Option 2: Local Hook - Uses your locally installed LangLint:
repos:
# LangLint - Check translatable content (Rust-powered!)
- 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 langlintfirst, but gives you control over the version.
# 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-filesAdd to .gitlab-ci.yml:
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 monthAdd to azure-pipelines.yml:
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 (Rust-powered!)'
- script: |
langlint scan . -o $(Build.ArtifactStagingDirectory)/report.json --format json
displayName: 'Scan translatable content'
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: '$(Build.ArtifactStagingDirectory)'
artifactName: 'langlint-report'FROM python:3.11-slim
WORKDIR /app
# Install LangLint (Rust-powered!)
RUN pip install --no-cache-dir langlint
# Copy source code
COPY . .
# Run translation (now 10x faster!)
CMD ["langlint", "translate", ".", "-t", "google", "-s", "zh-CN", "-l", "en", "-o", "output/"]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/
"Upcoming VS Code extension will provide:
- ✅ Real-time translation suggestions
- ✅ Right-click menu translation
- ✅ Auto-translate on save
- ✅ Translation status indicator
# For pipx users (recommended)
pipx upgrade langlint
# For uv users
uv tool upgrade langlint
# For pip users
pip install --upgrade langlintWhy stay updated? LangLint continuously improves language detection accuracy, adds new file type support, and fixes edge cases. Regular updates ensure the best translation quality.
# 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# 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# 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-jobs:
translate:
runs-on: [self-hosted, linux, x64]
steps:
- name: Translate with Google Translate
run: |
langlint translate src/ -s zh-CN -t en --translator google -o src_en/
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!
# Prerequisites
# 1. Install Rust (https://rustup.rs/)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 2. Install Python 3.8+
python --version
# 3. Install maturin (Rust-Python build tool)
pip install maturin
# Build and install locally
maturin develop --release
# Run Rust tests
cargo test --workspace --exclude langlint_py
# Run Python tests
pytest tests/ --cov=python_wrapper/langlint --cov-report=term-missing
# Run ignored tests (Google API - requires network)
cargo test --workspace --exclude langlint_py -- --ignored# Run Rust tests
cargo test --workspace --exclude langlint_py
# Run Python tests
pytest tests/ -v
# Run all tests with coverage
pytest tests/ --cov=python_wrapper/langlint --cov-report=term-missing# 1. Clone the repository
git clone https://github.com/HzaCode/Langlint.git
cd Langlint
# 2. Install dependencies
cargo build
# 3. Make your changes in crates/
# 4. Run tests
cargo test
cargo clippy # Linting
cargo fmt # Formatting
# 5. Build Python package
maturin develop --release
# 6. Test Python integration
python -c "import langlint_py; print(langlint_py.version())"Contributions welcome! The codebase is now 100% Rust for maximum performance.
How to contribute:
- Core features: Add to
crates/langlint_* - New parsers: Extend
crates/langlint_parsers/src/ - New translators: Add to
crates/langlint_translators/src/ - Python API: Update
crates/langlint_py/src/lib.rs
See CONTRIBUTING.md for detailed guidelines.
This project is licensed under the MIT License. See the LICENSE file for details.
LangLint respects your privacy. We follow a local-first approach:
- ✅ No telemetry, tracking, or analytics
- ✅ Your code stays on your machine
- ✅ Translation data only sent to APIs you explicitly choose to use
For complete details, see our Privacy Policy.
- Homepage: https://github.com/HzaCode/Langlint
- PyPI: https://pypi.org/project/langlint/
- Issues: https://github.com/HzaCode/Langlint/issues
- Discussions: https://github.com/HzaCode/Langlint/discussions
Made with ❤️ and 🦀 (Rust)
10-50x faster than pure Python ⚡
⭐ Star us on GitHub | 📦 Install from PyPI | 🦀 View Rust Code
⭐ LLM too slow? Try LangLint! Now powered by Rust for maximum speed 🚀
