Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
87fa03e
Files for the addon template
nvdaes Dec 17, 2025
dc0f4f7
Merge branch 'main' into addonTemplate
nvdaes Dec 17, 2025
4bd037f
Update pyproject
nvdaes Dec 17, 2025
c843cde
Merge branch 'main' into addonTemplate
nvdaes Dec 17, 2025
04a4d61
Merge branch 'main' into addonTemplate
nvdaes Dec 17, 2025
4e990e1
Updates by precommit
nvdaes Dec 17, 2025
f2e883d
Fix precommit config
nvdaes Dec 17, 2025
e84441c
Update files
nvdaes Dec 17, 2025
d946cf0
Updates by pre-commit
nvdaes Dec 17, 2025
52f2b7c
Update
nvdaes Dec 18, 2025
f170d92
Restore support for xliff in NVDA since it's not used for add-ons
nvdaes Dec 30, 2025
f34fc9c
Updates
nvdaes Jan 1, 2026
684438a
Add project and id arguments
nvdaes Jan 1, 2026
eef9d94
Add support to build an executable
nvdaes Jan 2, 2026
f696549
Update lock
nvdaes Jan 2, 2026
c9480b0
Update adding command
nvdaes Jan 2, 2026
50a2e73
Update
nvdaes Jan 2, 2026
9ce384a
Update
nvdaes Jan 2, 2026
3b28afc
Update
nvdaes Jan 2, 2026
4d083f6
Update
nvdaes Jan 2, 2026
7df6298
Improve getFiles
nvdaes Jan 2, 2026
f9c8a20
Improvements and tested uploading translationFile
nvdaes Jan 2, 2026
7037b43
Add nvda as default for downloadTranslationFile
nvdaes Jan 2, 2026
0aa414e
Restore files which shouldn't be modified
nvdaes Jan 27, 2026
6d98a76
Make reports true for pyright in pyproject
nvdaes Jan 27, 2026
a96d422
Address review: convert spaces to tab
nvdaes Jan 30, 2026
45c5d4b
Add ability to upload source files to NVDA project with the uploadSou…
nvdaes Jan 30, 2026
304ea15
Restore accidentally removed changes
nvdaes Feb 14, 2026
9df7194
Format with ruff
nvdaes Feb 14, 2026
cc52b04
Bump to Python 3.13.12
nvdaes Feb 14, 2026
7b38813
Update copyright years
nvdaes Feb 14, 2026
bbd6d84
Update source/l10nUtil.py
nvdaes Feb 16, 2026
dc667fd
Update readme.md
nvdaes Feb 16, 2026
307f0c5
Update pyproject.toml
nvdaes Feb 16, 2026
7b3dcd3
Update source/l10nUtil.py
nvdaes Feb 16, 2026
da9f6c5
Update source/l10nUtil.py
nvdaes Feb 16, 2026
36a67be
Update pyproject.toml
nvdaes Feb 16, 2026
7f9aa74
Update source/l10nUtil.py
nvdaes Feb 16, 2026
8a585d8
Restore commands in the right position
nvdaes Feb 16, 2026
4179bc1
Fix command
nvdaes Feb 16, 2026
a9928a6
Import tempfile
nvdaes Feb 16, 2026
171c57b
Import tempfile in the right position
nvdaes Feb 16, 2026
dff71a0
Remove specific project ids
nvdaes Feb 16, 2026
7b4d3b3
Improvements
nvdaes Feb 16, 2026
d1b4b94
Remove function
nvdaes Feb 17, 2026
756a62e
Use _crowdinProjectId
nvdaes Feb 17, 2026
b2a2dc1
Improvements trying to reduce diffs
nvdaes Feb 17, 2026
fb0b35b
Remove shutil import
nvdaes Feb 17, 2026
e404691
Add removed instruction
nvdaes Feb 17, 2026
a240792
Restore shutil import
nvdaes Feb 17, 2026
a23b840
Restore command handling to original positions
nvdaes Feb 17, 2026
b882409
Remove json from imports
nvdaes Feb 17, 2026
e64837c
Don't use refresh to get files
nvdaes Feb 17, 2026
e760ac5
Improvements
nvdaes Feb 17, 2026
5a942df
Restore setup files
nvdaes Feb 17, 2026
d3423f8
Remove source/setup
nvdaes Feb 17, 2026
0cccfef
Restore files
nvdaes Feb 17, 2026
b01f688
Add setup
nvdaes Feb 17, 2026
d6c8169
Restore
nvdaes Feb 17, 2026
3ec4a93
Restore files
nvdaes Feb 17, 2026
26b2a02
Reformat
nvdaes Feb 17, 2026
ffc78b4
add versions for dependencies
nvdaes Feb 17, 2026
8558b0b
Update source/l10nUtil.py
nvdaes Feb 18, 2026
4103f30
Address review
nvdaes Feb 18, 2026
a8c7e0b
Merge branch 'addonTemplate' of https://github.com/nvdaes/nvdal10n in…
nvdaes Feb 18, 2026
3de1afa
Fix name
nvdaes Feb 19, 2026
1f11727
Encapsulate variables in dataclass
nvdaes Feb 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,33 @@ wheels/

# Virtual environments
.venv

# PyInstaller build artifacts
*.spec
*.exe
*.dll
*.so
*.dylib
build/
dist/
*.manifest
*.tmp
*.log

# Local build outputs
build/l10nUtil/
build/l10nUtil/localpycs/
build/l10nUtil/*.toc
build/l10nUtil/*.pyz
build/l10nUtil/*.html
build/l10nUtil/*.txt
build/l10nUtil/*.zip
build/l10nUtil/*.pkg

# OS and editor files
Thumbs.db
ehthumbs.db
Desktop.ini
.DS_Store
.vscode/
.idea/
7 changes: 5 additions & 2 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ repos:
hooks:
# Prevents commits to certain branches
- id: no-commit-to-branch
args: ["--branch", "main", "master", ]
args: ["--branch", "main", "--branch", "master", ]
Copy link

Copilot AI Feb 16, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The argument handling for the pre-commit config is inconsistent with standard argparse usage. The line uses args: ["--branch", "main", "--branch", "master", ] but mixing argument names with values in a flat list is potentially confusing. While this is valid YAML, the trailing comma after "master" is unnecessary and non-standard for YAML lists.

Suggested change
args: ["--branch", "main", "--branch", "master", ]
args: ["--branch", "main", "--branch", "master"]

Copilot uses AI. Check for mistakes.
# Checks that large files have not been added. Default cut-off for "large" files is 500kb.
- id: check-added-large-files
# Checks python syntax
Expand Down Expand Up @@ -76,7 +76,10 @@ repos:
args: [ --fix ]
- id: ruff-format
name: format with ruff

- id: uv-lock
name: Verify uv lock file
# Override python interpreter from .python-versions as that is too strict for pre-commit.ci
args: ["-p3.13"]
- repo: local
hooks:

Expand Down
2 changes: 1 addition & 1 deletion .python-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.13
3.13.12
199 changes: 193 additions & 6 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,194 @@
[build-system]
requires = ["setuptools~=80.9", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "nvdal10n"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.13"
dependencies = []
name = "nvdaL10n"
dynamic = ["version"]
description = "Utilities for translations in NVDA and the add-on template"
maintainers = [
{name = "NV Access", email = "info@nvaccess.org"},
]
requires-python = ">=3.13,<3.14"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: End Users/Desktop",
"License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)",
"Operating System :: Microsoft :: Windows",
"Programming Language :: Python :: 3",
"Topic :: Accessibility",
]
readme = "readme.md"
license = {file = "license"}
dependencies = [
"crowdin-api-client==1.21.0",
"lxml>=6.0.2",
"markdown>=3.10",
"markdown-link-attr-modifier==0.2.1",
"mdx-gh-links==0.4",
"mdx-truly-sane-lists==1.3",
"nh3==0.2.19",
"requests>=2.32.5",
"ruff==0.8.1",
"pre-commit==4.0.1",
"pyright==1.1.396",
]
[project.urls]
Repository = "https://github.com/nvaccess/nvdaL10n"

[project.optional-dependencies]
windows-packaging = [
"pyinstaller==6.3.0",
]

[tool.ruff]
line-length = 110

builtins = [
# translation lookup
"_",
# translation lookup
"ngettext",
# translation lookup
"pgettext",
# translation lookup
"npgettext",
]

include = [
"*.py",
]

exclude = [
".git",
"__pycache__",
".venv",
]

[tool.ruff.format]
indent-style = "tab"
line-ending = "lf"

[tool.ruff.lint.mccabe]
max-complexity = 15

[tool.ruff.lint]
ignore = [
# indentation contains tabs
"W191",
]
logger-objects = ["logHandler.log"]

[tool.pyright]
venvPath = ".venv"
venv = "."
pythonPlatform = "Windows"
typeCheckingMode = "strict"

include = [
"**/*.py",
]

exclude = [
".git",
"__pycache__",
".venv",
# When excluding concrete paths relative to a directory,
# not matching multiple folders by name e.g. `__pycache__`,
# paths are relative to the configuration file.
]

# General config
analyzeUnannotatedFunctions = true
deprecateTypingAliases = true

# Stricter typing
strictParameterNoneValue = true
strictListInference = true
strictDictionaryInference = true
strictSetInference = true

# Compliant rules
reportAbstractUsage = true
reportArgumentType = true
reportAssertAlwaysTrue = true
reportAssertTypeFailure = true
reportAssignmentType = true
reportAttributeAccessIssue = true
reportCallInDefaultInitializer = true
reportCallIssue = true
reportConstantRedefinition = true
reportDuplicateImport = true
reportFunctionMemberAccess = true
reportGeneralTypeIssues = true
reportImplicitOverride = true
reportImplicitStringConcatenation = true
reportImportCycles = true
reportIncompatibleMethodOverride = true
reportIncompatibleVariableOverride = true
reportIncompleteStub = true
reportInconsistentConstructor = true
reportInconsistentOverload = true
reportIndexIssue = true
reportInvalidStringEscapeSequence = true
reportInvalidStubStatement = true
reportInvalidTypeArguments = true
reportInvalidTypeForm = true
reportInvalidTypeVarUse = true
reportMatchNotExhaustive = true
reportMissingImports = true
reportMissingModuleSource = true
reportMissingParameterType = true
reportMissingSuperCall = true
reportMissingTypeArgument = true
reportNoOverloadImplementation = true
reportOperatorIssue = true
reportOptionalCall = true
reportOptionalContextManager = true
reportOptionalIterable = true
reportOptionalMemberAccess = true
reportOptionalOperand = true
reportOptionalSubscript = true
reportOverlappingOverload = true
reportPossiblyUnboundVariable = true
reportPrivateImportUsage = true
reportPrivateUsage = true
reportPropertyTypeMismatch = true
reportRedeclaration = true
reportReturnType = true
reportSelfClsParameterName = true
reportShadowedImports = true
reportTypeCommentUsage = true
reportTypedDictNotRequiredAccess = true
reportUnboundVariable = true
reportUndefinedVariable = true
reportUnhashable = true
reportUninitializedInstanceVariable = true
reportUnknownArgumentType = true
reportUnknownLambdaType = true
reportUnknownMemberType = true
reportUnknownParameterType = true
reportUnknownVariableType = true
reportUnnecessaryCast = true
reportUnnecessaryComparison = true
reportUnnecessaryContains = true
reportUnnecessaryIsInstance = true
reportUnnecessaryTypeIgnoreComment = true
reportUnsupportedDunderAll = true
reportUntypedBaseClass = true
reportUntypedClassDecorator = true
reportUntypedFunctionDecorator = true
reportUntypedNamedTuple = true
reportUnusedCallResult = true
reportUnusedClass = true
reportUnusedCoroutine = true
reportUnusedExcept = true
reportUnusedExpression = true
reportUnusedFunction = true
reportUnusedImport = true
reportUnusedVariable = true
reportWildcardImportFromLibrary = true

reportDeprecated = true

# Can be enabled by generating type stubs for modules via pyright CLI
reportMissingTypeStubs = false
20 changes: 19 additions & 1 deletion readme.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,21 @@
# Support for translations in NVDA and the add-on template

This repo is intended to be used as a submodule for [NVDA](https://github.com/nvaccess/nvda) and the [add-on template](https://github.com/nvaccess/addonTemplate).
This repository is intended to be used as a submodule for [NVDA](https://github.com/nvaccess/nvda) and the [add-on template](https://github.com/nvaccess/addonTemplate).

## Installation and Building an Executable

To install all dependencies (including PyInstaller) and build a standalone executable using [uv](https://github.com/astral-sh/uv):

1. Install all dependencies:

```sh
uv pip install .
```

2. Build the executable:

```sh
uv run pyinstaller --onefile source/l10nUtil.py
```

The resulting executable will be located in the `dist` directory.
89 changes: 0 additions & 89 deletions source/crowdinSync.py

This file was deleted.

Loading